mbind(2) | System Calls Manual | mbind(2) |
mbind - устанавливает политику на область памяти
NUMA (Non-Uniform Memory Access) policy library (libnuma, -lnuma)
#include <numaif.h>
long mbind(void addr[.len], unsigned long len, int mode, const unsigned long nodemask[(.maxnode + ULONG_WIDTH - 1) / ULONG_WIDTH], unsigned long maxnode, unsigned int flags);
Вызов mbind() устанавливает политику памяти NUMA, состоящую из режима политики и нуля или более узлов, на область памяти, начинающуюся с addr и длиной len байт. Политикой памяти задаётся на каком узле будет выделяться память.
If the memory range specified by the addr and len arguments includes an "anonymous" region of memory—that is a region of memory created using the mmap(2) system call with the MAP_ANONYMOUS—or a memory-mapped file, mapped using the mmap(2) system call with the MAP_PRIVATE 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 MAP_PRIVATE, 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 mbind().
Указанная политика в заданной области памяти будет игнорироваться для всех отображений MAP_SHARED. Скорее всего, страницы будут выделены согласно политике памяти нити, для которой происходит выделение страницы. Но опять таки, это может быть не та нить, которая вызвала mbind().
Если заданная область памяти включает общую область памяти, созданную с помощью системного вызова shmget(2) и подключённую с помощью системного вызова shmat(2), то страницы, выделяемые для анонимной или общей области памяти, будут выделены согласно указанной политике, независимо от того, какой процесс подключил сегмент общей памяти, что вызвало выделение. Однако, если общая область памяти была создана с флагом SHM_HUGETLB, то огромные страницы будут выделяться согласно указанной политике, только если выделение страницы происходит из-за процесса, который вызвал mbind() для этой области.
По умолчанию, mbind() учитывается только при новых выделениях; если страницы внутри области уже были использованы до настройки политики, то политика не применяется. Такое поведение можно изменить с помощью флагов MPOL_MF_MOVE и MPOL_MF_MOVE_ALL, описанных далее.
В аргументе mode должно быть указано одно из следующих значений: MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_PREFERRED или MPOL_LOCAL (описано далее). Для всех режимов политики, за исключением MPOL_DEFAULT, требуется, чтобы вызывающий указывал в аргументе nodemask узел или узлы, для которых применяется режим.
Аргумент mode также может содержать необязательный флаг режима. Поддерживаемые флаги режима:
В nodemask содержится битовая маска узлов, в которой содержится до maxnode бит. Размер битовой маски округляется до следующего кратного значения sizeof(unsigned long), но ядром будет использовано только до maxnode бит. Значением NULL в nodemask или значением maxnode равным 0 задаётся пустой набор узлов. Если значение maxnode равно 0, то аргумент nodemask игнорируется. Там, где требуется nodemask, его значение должно содержать, как минимум, один работающий узел, который разрешён нити текущим контекстом набора процессоров (если не указан флаг MPOL_F_STATIC_NODES) и у которого имеется память.
Аргумент mode должен включать одно из следующих значений:
Если в flags указан MPOL_MF_STRICT и mode не равно MPOL_DEFAULT, то вызов завершается ошибкой EIO, если существующие страницы в области памяти не следуют политике.
Если в flags указан MPOL_MF_MOVE, то ядро будет пытаться переместить все существующие страницы в области памяти так, чтобы они следовали политике. Страницы, используемые совместно с другими процессами, перемещаться не будут. Если также указан MPOL_MF_STRICT, что вызов завершается ошибкой EIO, если страницы не могут быть перемещены.
Если в flags указан MPOL_MF_MOVE_ALL, то ядро будет пытаться переместить все существующие страницы в области памяти независимо от того, используются ли они другими процессами. Для использования данного флага вызывающая нить должна быть привилегированной (CAP_SYS_NICE). Если также указан MPOL_MF_STRICT, то вызов завершается ошибкой EIO, если некоторые страницы нельзя переместить.
При успешном выполнении mbind() возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.
The mbind() system call was added in Linux 2.6.7.
Данный вызов есть только в Linux.
Информация о библиотеке доступна в numa(7).
Политика NUMA не поддерживается для области памяти отображения файла, который отображён с флагом MAP_SHARED.
Режим MPOL_DEFAULT может по разному влиять на mbind() и set_mempolicy(2). Когда указан MPOL_DEFAULT для set_mempolicy(2), политика памяти нити возвращается к политике по умолчанию или локальному выделению. Когда MPOL_DEFAULT указан для области памяти, используемой mbind(), все страницы, последовательно выделяемые для этой области, будут использовать политику памяти нити, которая задана с помощью set_mempolicy(2). Это эффективно удаляет явную политику из указанной области, «откатываясь» к возможной политике не по умолчанию. Для выбора явного «локального выделения» области памяти, укажите в mode значение MPOL_LOCAL или MPOL_PREFERRED с пустым набором узлов. Этот метод также сработает и в вызове set_mempolicy(2).
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.
Before Linux 5.7. MPOL_MF_STRICT was ignored on huge page mappings.
Режимы MPOL_MF_MOVE и MPOL_MF_MOVE_ALL доступны только в Linux 2.6.16 и новее.
get_mempolicy(2), getcpu(2), mmap(2), set_mempolicy(2), shmat(2), shmget(2), numa(3), cpuset(7), numa(7), numactl(8)
Русский перевод этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Alexey <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Малянов Евгений Викторович <maljanow@outlook.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
5 февраля 2023 г. | Linux man-pages 6.03 |