.\" -*- coding: UTF-8 -*- .\" SPDX-License-Identifier: Linux-man-pages-copyleft-var .\" .\" Copyright 2003,2004 Andi Kleen, SuSE Labs. .\" and Copyright 2007 Lee Schermerhorn, Hewlett Packard .\" .\" 2006-02-03, mtk, substantial wording changes and other improvements .\" 2007-08-27, Lee Schermerhorn .\" more precise specification of behavior. .\" .\" FIXME .\" Linux 3.8 added MPOL_MF_LAZY, which needs to be documented. .\" Does it also apply for move_pages()? .\" .\" commit b24f53a0bea38b266d219ee651b22dba727c44ae .\" Author: Lee Schermerhorn .\" Date: Thu Oct 25 14:16:32 2012 +0200 .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mbind 2 "9 декабря 2023 г." "Linux man\-pages 6.06" .SH ИМЯ mbind \- устанавливает политику на область памяти .SH LIBRARY NUMA (Non\-Uniform Memory Access) policy library (\fIlibnuma\fP, \fI\-lnuma\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBlong mbind(void \fP\fIaddr\fP\fB[.\fP\fIlen\fP\fB], unsigned long \fP\fIlen\fP\fB, int \fP\fImode\fP\fB,\fP \fB const unsigned long \fP\fInodemask\fP\fB[(.\fP\fImaxnode\fP\fB + ULONG_WIDTH \- 1)\fP \fB/ ULONG_WIDTH],\fP \fB unsigned long \fP\fImaxnode\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP .fi .SH ОПИСАНИЕ Вызов \fBmbind\fP() устанавливает политику памяти NUMA, состоящую из режима политики и нуля или более узлов, на область памяти, начинающуюся с \fIaddr\fP и длиной \fIlen\fP байт. Политикой памяти задаётся на каком узле будет выделяться память. .P If the memory range specified by the \fIaddr\fP and \fIlen\fP arguments includes an "anonymous" region of memory\[em]that is a region of memory created using the \fBmmap\fP(2) system call with the \fBMAP_ANONYMOUS\fP\[em]or a memory\-mapped file, mapped using the \fBmmap\fP(2) system call with the \fBMAP_PRIVATE\fP flag, pages will be allocated only according to the specified policy when the application writes (stores) to the page. For anonymous regions, an initial read access will use a shared page in the kernel containing all zeros. For a file mapped with \fBMAP_PRIVATE\fP, an initial read access will allocate pages according to the memory policy of the thread that causes the page to be allocated. This may not be the thread that called \fBmbind\fP(). .P Указанная политика в заданной области памяти будет игнорироваться для всех отображений \fBMAP_SHARED\fP. Скорее всего, страницы будут выделены согласно политике памяти нити, для которой происходит выделение страницы. Но опять таки, это может быть не та нить, которая вызвала \fBmbind\fP(). .P Если заданная область памяти включает общую область памяти, созданную с помощью системного вызова \fBshmget\fP(2) и подключённую с помощью системного вызова \fBshmat\fP(2), то страницы, выделяемые для анонимной или общей области памяти, будут выделены согласно указанной политике, независимо от того, какой процесс подключил сегмент общей памяти, что вызвало выделение. Однако, если общая область памяти была создана с флагом \fBSHM_HUGETLB\fP, то огромные страницы будут выделяться согласно указанной политике, только если выделение страницы происходит из\-за процесса, который вызвал \fBmbind\fP() для этой области. .P По умолчанию, \fBmbind\fP() учитывается только при новых выделениях; если страницы внутри области уже были использованы до настройки политики, то политика не применяется. Такое поведение можно изменить с помощью флагов \fBMPOL_MF_MOVE\fP и \fBMPOL_MF_MOVE_ALL\fP, описанных далее. .P В аргументе \fImode\fP должно быть указано одно из следующих значений: \fBMPOL_DEFAULT\fP, \fBMPOL_BIND\fP, \fBMPOL_INTERLEAVE\fP, \fBMPOL_PREFERRED\fP или \fBMPOL_LOCAL\fP (описано далее). Для всех режимов политики, за исключением \fBMPOL_DEFAULT\fP, требуется, чтобы вызывающий указывал в аргументе \fInodemask\fP узел или узлы, для которых применяется режим. .P Аргумент \fImode\fP также может содержать необязательный \fIфлаг режима\fP. Поддерживаемые \fIфлаги режима\fP: .TP \fBMPOL_F_NUMA_BALANCING\fP (since Linux 5.15) .\" commit bda420b985054a3badafef23807c4b4fa38a3dff .\" commit 6d2aec9e123bb9c49cb5c7fc654f25f81e688e8c When \fImode\fP is \fBMPOL_BIND\fP, enable the kernel NUMA balancing for the task if it is supported by the kernel. If the flag isn't supported by the kernel, or is used with \fImode\fP other than \fBMPOL_BIND\fP, \-1 is returned and \fIerrno\fP is set to \fBEINVAL\fP. .TP \fBMPOL_F_STATIC_NODES\fP (начиная с Linux\-2.6.26) В аргументе \fInodemask\fP указываются идентификаторы физических узлов. Linux не пересоставляет \fInodemask\fP, если нить перемещается в другой контекст набора процессоров или когда изменяется набор узлов, который доступен нити согласно текущему контексту набора процессоров. .TP \fBMPOL_F_RELATIVE_NODES\fP (начиная с Linux\-2.6.26) В аргументе \fInodemask\fP указываются идентификаторы узлов из набора идентификаторов узлов, разрешённых нити текущим контекстом набора процессоров. .P В \fInodemask\fP содержится битовая маска узлов, в которой содержится до \fImaxnode\fP бит. Размер битовой маски округляется до следующего кратного значения \fIsizeof(unsigned long)\fP, но ядром будет использовано только до \fImaxnode\fP бит. Значением NULL в \fInodemask\fP или значением \fImaxnode\fP равным 0 задаётся пустой набор узлов. Если значение \fImaxnode\fP равно 0, то аргумент \fInodemask\fP игнорируется. Там, где требуется \fInodemask\fP, его значение должно содержать, как минимум, один работающий узел, который разрешён нити текущим контекстом набора процессоров (если не указан флаг \fBMPOL_F_STATIC_NODES\fP) и у которого имеется память. .P Аргумент \fImode\fP должен включать одно из следующих значений: .TP \fBMPOL_DEFAULT\fP Этот режим запрашивает удаление любой политики не по умолчанию и восстановление поведения по умолчанию. Если он применяется к области памяти посредством \fBmbind\fP(), то это означает использование политики памяти нити, которая могла быть установлена с помощью \fBset_mempolicy\fP(2). Если режим политики памяти нити также равен \fBMPOL_DEFAULT\fP, то будет задействована системная политика по умолчанию. При системной политике по умолчанию выделяются страницы на том узле ЦП, на котором было запрошено выделение. Для \fBMPOL_DEFAULT\fP в аргументах \fInodemask\fP и \fImaxnode\fP должен быть указан пустой набор узлов. .TP \fBMPOL_BIND\fP .\" commit 19770b32609b6bf97a3dece2529089494cbfc549 Этот режим задаёт жёсткую политику, при которой выделение памяти ограничено узлами, заданными в \fInodemask\fP. Если в \fInodemask\fP указано более одного узла, то выделение страниц начнётся с узла с достаточным объёмом свободной памяти, который наиболее близок к узлу, где запрошено выделение. Страницы не выделяются на узлах, не указанных в IR nodemask(до Linux 2.6.26 выделение страниц происходило начиная с узла с меньшим номером идентификатора, и продолжится до тех пор, пока на нём не кончится свободная память. Затем выделение продолжится на узле со следующим большим номером идентификатора, указанного в \fInodemask\fP, и т.д. до тех пор, пока на всех заданных узлах не закончится свободная память). .TP \fBMPOL_INTERLEAVE\fP Этот режим задаёт, что при выделении страниц нужно выполнять чередование узлов, которые указаны в \fInodemask\fP. Это оптимизирует использование полосы пропускания, но не задержку, вовлекая при доступ к страницам и памяти множество узлов. Чтобы это дало эффект, область памяти должна быть достаточно большой, не менее 1\ МБ или более, и характер доступа должен быть достаточно равномерным. Доступ к одной странице области будет по прежнему ограничен размером полосы пропускания одного узла. .TP \fBMPOL_PREFERRED\fP В этом режиме устанавливается предпочтительный узел для выделения. Ядро сначала будет пытаться выделить страницы на этом узле и перейдёт на другие узлы, если на предпочтительном узле недостаточно свободной памяти. Если в \fInodemask\fP задано более одного идентификатора узла, то в качестве предпочтительного будет выбран первый из маски. Если в аргументах \fInodemask\fP и \fImaxnode\fP указан пустой набор, то память будет выделена на узле ЦП, на котором запросили выделение. .TP \fBMPOL_LOCAL\fP (начиная с Linux 3.8) .\" commit 479e2802d09f1e18a97262c4c6f8f17ae5884bd8 .\" commit f2a07f40dbc603c15f8b06e6ec7f768af67b424f Этот режим устанавливает «локальное выделение»; памяти выделяется на узле с ЦП, на котором запросили выделение («локальный узел»). Аргументы \fInodemask\fP и \fImaxnode\fP должны содержать пустой набор. Если на «локальном узле» не хватает свободной памяти, то ядро попытается выделить память на других узлах. Ядро выделит памяти на «локальном узле» сколько бы ни было на нём памяти. Если «локальный узел» не разрешён для нити текущим контекстом набора процессоров, то ядро попытается выделить память на других узлах. Ядро выделит памяти на «локальном узле» независимо от того, станет ли он разрешённым для нити текущим контекстом набора процессоров. В отличии от этого , \fBMPOL_DEFAULT\fP восстанавливает политику памяти нити (которая может быть задана с помощью \fBset_mempolicy\fP(2)); эта политика может быть другой, не «локальным выделением». .P .\" According to the kernel code, the following is not true .\" --Lee Schermerhorn .\" In Linux 2.6.16 or later the kernel will also try to move pages .\" to the requested node with this flag. Если в \fIflags\fP указан \fBMPOL_MF_STRICT\fP и \fImode\fP не равно \fBMPOL_DEFAULT\fP, то вызов завершается ошибкой \fBEIO\fP, если существующие страницы в области памяти не следуют политике. .P If \fBMPOL_MF_MOVE\fP is specified in \fIflags\fP, then the kernel will attempt to move all the existing pages in the memory range so that they follow the policy. Pages that are shared with other processes will not be moved. If \fBMPOL_MF_STRICT\fP is also specified, then the call fails with the error \fBEIO\fP if some pages could not be moved. If the \fBMPOL_INTERLEAVE\fP policy was specified, pages already residing on the specified nodes will not be moved such that they are interleaved. .P .\" --------------------------------------------------------------- If \fBMPOL_MF_MOVE_ALL\fP is passed in \fIflags\fP, then the kernel will attempt to move all existing pages in the memory range regardless of whether other processes use the pages. The calling thread must be privileged (\fBCAP_SYS_NICE\fP) to use this flag. If \fBMPOL_MF_STRICT\fP is also specified, then the call fails with the error \fBEIO\fP if some pages could not be moved. If the \fBMPOL_INTERLEAVE\fP policy was specified, pages already residing on the specified nodes will not be moved such that they are interleaved. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" .\" --------------------------------------------------------------- При успешном выполнении \fBmbind\fP() возвращается 0. При ошибке возвращается \-1, а в \fIerrno\fP содержится код ошибки. .SH ОШИБКИ .\" I think I got all of the error returns. --Lee Schermerhorn .TP \fBEFAULT\fP Часть или вся область памяти, заданная в \fInodemask\fP и \fImaxnode\fP, указывает за пределы доступного адресного пространства. Или в области памяти, задаваемой \fIaddr\fP и \fIlen\fP, есть неотображаемая дыра (hole). .TP \fBEINVAL\fP .\" As at 2.6.23, this limit is "a page worth of bits", e.g., .\" 8 * 4096 bits, assuming a 4kB page size. В \fIflags\fP или \fImode\fP указано неправильное значение; или \fIaddr + len\fP меньше чем \fIaddr\fP; или \fIaddr\fP не кратен системному размеру страницы. Или \fImode\fP равен \fBMPOL_DEFAULT\fP и в \fInodemask\fP задан непустой набор; или \fImode\fP равен \fBMPOL_BIND\fP или \fBMPOL_INTERLEAVE\fP и значение \fInodemask\fP пусто. Или значение \fImaxnode\fP превышает устанавливаемое ядром ограничение. Или в \fInodemask\fP задан один или более идентификаторов узлов, номер которого больше чем максимально поддерживаемый. Или в \fInodemask\fP не задано ни одного идентификатора узла, включённого в данный момент и разрешённого нити текущим контекстом набора процессоров, или ни один из указанных узлов не содержит память. Или в аргументе \fImode\fP указаны сразу \fBMPOL_F_STATIC_NODES\fP и \fBMPOL_F_RELATIVE_NODES\fP. .TP \fBEIO\fP Был указан \fBMPOL_MF_STRICT\fP и существующая страница была уже на узле, что не следует политике; или был указан \fBMPOL_MF_MOVE\fP или \fBMPOL_MF_MOVE_ALL\fP и ядро не смогло переместить все существующие страницы области. .TP \fBENOMEM\fP Недостаточное количество памяти ядра. .TP \fBEPERM\fP .\" --------------------------------------------------------------- Аргумент \fIflags\fP содержит флаг \fBMPOL_MF_MOVE_ALL\fP и вызывающий не имеет мандата \fBCAP_SYS_NICE\fP. .SH СТАНДАРТЫ Linux. .SH ИСТОРИЯ Linux 2.6.7. .P Support for huge page policy was added with Linux 2.6.16. For interleave policy to be effective on huge page mappings the policied memory needs to be tens of megabytes or larger. .P .\" commit dcf1763546d76c372f3136c8d6b2b6e77f140cf0 Before Linux 5.7. \fBMPOL_MF_STRICT\fP was ignored on huge page mappings. .P Режимы \fBMPOL_MF_MOVE\fP и \fBMPOL_MF_MOVE_ALL\fP доступны только в Linux 2.6.16 и новее. .SH ЗАМЕЧАНИЯ Информация о библиотеке доступна в \fBnuma\fP(7). .P Политика NUMA не поддерживается для области памяти отображения файла, который отображён с флагом \fBMAP_SHARED\fP. .P Режим \fBMPOL_DEFAULT\fP может по разному влиять на \fBmbind\fP() и \fBset_mempolicy\fP(2). Когда указан \fBMPOL_DEFAULT\fP для \fBset_mempolicy\fP(2), политика памяти нити возвращается к политике по умолчанию или локальному выделению. Когда \fBMPOL_DEFAULT\fP указан для области памяти, используемой \fBmbind\fP(), все страницы, последовательно выделяемые для этой области, будут использовать политику памяти нити, которая задана с помощью \fBset_mempolicy\fP(2). Это эффективно удаляет явную политику из указанной области, «откатываясь» к возможной политике не по умолчанию. Для выбора явного «локального выделения» области памяти, укажите в \fImode\fP значение \fBMPOL_LOCAL\fP или \fBMPOL_PREFERRED\fP с пустым набором узлов. Этот метод также сработает и в вызове \fBset_mempolicy\fP(2). .SH "СМ. ТАКЖЕ" \fBget_mempolicy\fP(2), \fBgetcpu\fP(2), \fBmmap\fP(2), \fBset_mempolicy\fP(2), \fBshmat\fP(2), \fBshmget\fP(2), \fBnuma\fP(3), \fBcpuset\fP(7), \fBnuma\fP(7), \fBnumactl\fP(8) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .