.\" -*- coding: UTF-8 -*- .\" Copyright 2003,2004 Andi Kleen, SuSE Labs. .\" and Copyright 2007 Lee Schermerhorn, Hewlett Packard .\" .\" %%%LICENSE_START(VERBATIM_PROF) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" 2006-02-03, mtk, substantial wording changes and other improvements .\" 2007-08-27, Lee Schermerhorn .\" more precise specification of behavior. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH SET_MEMPOLICY 2 "21 декабря 2020 г." Linux "Руководство программиста Linux" .SH ИМЯ set_mempolicy \- настраивает политику работы с памятью NUMA для потока и его потомков .SH СИНТАКСИС .nf \fB#include \fP .PP \fBlong set_mempolicy(int \fP\fImode\fP\fB, const unsigned long *\fP\fInodemask\fP\fB,\fP \fB unsigned long \fP\fImaxnode\fP\fB);\fP .PP Компонуется при указании параметра \fI\-lnuma\fP. .fi .SH ОПИСАНИЕ Вызов \fBset_mempolicy\fP() устанавливает политику работы с памятью NUMA для вызывающей нити, которая определяется режимом политики и нулём или более узлами (задаются в аргументах \fImode\fP, \fInodemask\fP и \fImaxnode\fP). .PP Машина с NUMA имеет различные контроллеры памяти с различными расстояниями до определённых ЦП. Политикой памяти задаётся узел, на котором выделяется память для нити. .PP Этот системный вызов устанавливает в нити политику по умолчанию. Политика нити управляет выделением страниц в адресном пространстве процесса из областей памяти, которые не контролируются специальной политикой, заданной с помощью \fBmbind\fP(2). Политикой нити по умолчанию также контролируется выделение любых страниц для отображаемых в память файлов с помощью вызова \fBmmap\fP(2) с флагом \fBMAP_PRIVATE\fP (которые читаются (загружаются) только этой нитью) и для отображаемых в память файлов с помощью вызова \fBmmap\fP(2) с флагом \fBMAP_SHARED\fP (независимо от типа доступа). Эта политика применяется только когда нить запрашивает выделение новой страницы. Для анонимной памяти это применяется, когда страница впервые затрагивается приложением. .PP В аргументе \fImode\fP должно быть указано одно из следующих значений: \fBMPOL_DEFAULT\fP, \fBMPOL_BIND\fP, \fBMPOL_INTERLEAVE\fP, \fBMPOL_PREFERRED\fP или \fBMPOL_LOCAL\fP (описано далее). Для всех режимов, за исключением \fBMPOL_DEFAULT\fP, требуется, чтобы вызывающий указывал в аргументе \fInodemask\fP узел или узлы, для которых применяется режим. .PP Аргумент \fImode\fP также может содержать необязательный \fIфлаг режима\fP. Поддерживаемые \fIфлаги режима\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 указываются идентификаторы узлов из набора идентификаторов узлов, разрешённых процессу текущим контекстом набора процессоров. .PP В \fInodemask\fP указывается битовая маска идентификаторов узлов, которая может содержать до \fImaxnode\fP бит. Размер битовой маски округляется до следующего значение кратного \fIsizeof(unsigned long)\fP, но ядро будет использовать биты только до \fImaxnode\fP. Значение NULL в \fInodemask\fP или \fImaxnode\fP указывает на пустой набор узлов. Если значение \fImaxnode\fP равно нулю, то аргумент \fInodemask\fP игнорируется. .PP Если требуется аргумент \fInodemask\fP, то его значение должно содержать не менее одного работающего узла, разрешённого процессу из текущего контекста набора процессоров (если не указан флаг режима \fBMPOL_F_STATIC_NODES\fP) и имеющего память. Если в \fImode\fP установлен флаг \fBMPOL_F_STATIC_NODES\fP и требуемое значение \fInodemask\fP не содержит узлов, разрешённых процессу из текущего контекста набора процессоров, то политика памяти возвращается обратно к \fIлокальному выделению\fP. Это эффективно заменяет указанную политику до тех пор, пока в текущий контекст набора процессоров процесса не добавится один или более узлов, указанных \fInodemask\fP. .PP Аргумент \fImode\fP должен включать одно из следующих значений: .TP \fBMPOL_DEFAULT\fP Данный режим устанавливает, что любые политики памяти нити, не равные политике по умолчанию, будут удалены, и политика памяти «вернётся» к системной политике по умолчанию. Системная политика по умолчанию — это «локальное выделение», то есть выделение памяти на узле с ЦП, на котором возник запрос выделения Значение \fInodemask\fP должно быть равно NULL. Если на «локальном узле» нет свободной памяти, то система попытается выделить память на «ближайшем» узле. .TP \fBMPOL_BIND\fP Данный режим устанавливает жёсткую политику, при которой выделение памяти выполняется только на узлах, заданных в \fInodemask\fP. Если в \fInodemask\fP указано более одного узла, то выделение страниц начнётся с узла с меньшим номером идентификатора и будет выполняться до тех пор, пока на нём не кончится свободная память. Затем выделение продолжится на узле со следующим большим номером идентификатора, указанного в \fInodemask\fP, и т.д. до тех пор, пока на всех указанных узлах не закончится свободная память. Страницы не будут выделяться на узлах, не указанных в \fInodemask\fP. .TP \fBMPOL_INTERLEAVE\fP .\" NOTE: the following sentence doesn't make sense in the context .\" of set_mempolicy() -- no memory area specified. .\" To be effective the memory area should be fairly large, .\" at least 1 MB or bigger. В этом режиме выделение страниц чередуется между узлами, указанными в \fInodemask\fP, согласно порядку номеров идентификаторов узлов. При этом происходит оптимизация полосы пропускания, а не задержки, так как происходит рассеивание страниц и доступ к этим страницам памяти, разносится по нескольким узлам. Однако доступ к отдельной странице по прежнему ограничен шириной канала с памятью на отдельном узле. .TP \fBMPOL_PREFERRED\fP В этом режиме задаётся предпочтительный узел для выделения памяти. Ядро будет пытаться сначала выделить страницы на этом узле и только после того как на предпочтительном узле не хватит памяти, попробует использовать «ближайшие» узлы. Если в \fInodemask\fP указано более одного идентификатора узла, то в качестве предпочтительного будет использован первый узел из маски. Если в аргументах \fInodemask\fP и \fImaxnode\fP указан пустой набор, то политике предписывается использовать «локальное выделение» (как при системной политике по умолчанию, описанной ранее). .TP \fBMPOL_LOCAL\fP (начиная с Linux 3.8) .\" commit 479e2802d09f1e18a97262c4c6f8f17ae5884bd8 .\" commit f2a07f40dbc603c15f8b06e6ec7f768af67b424f Этот режим задаёт «локальное выделение» (local allocation); память, выделяется на узле ЦП, попавшем в выделение («локальный узел»). В аргументах \fInodemask\fP и \fImaxnode\fP должен быть указан пустой набор. Если на «локальном узле» мало свободной памяти, то ядро будет пытаться выделить память на других узлах. Ядро будет выделять память на «локальном узле» сразу, как только на этом узле освободится память. Если «локальный узел» не разрешён в текущем контексте набора ЦП процесса, то ядро будет пытаться выделить памяти на других узлах. Ядро начнёт выделять память на «локальном узле» сразу, как только это будет разрешено в текущем контексте набора ЦП процесса. .PP Политика памяти нити сохраняется при вызове \fBexecve\fP(2) и наследуется дочерними нитями, созданными с помощью \fBfork\fP(2) или \fBclone\fP(2). .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBset_mempolicy\fP() возвращается 0; при ошибке возвращается \-1, а в \fIerrno\fP содержится код ошибки. .SH ОШИБКИ .TP \fBEFAULT\fP Часть всего диапазона памяти, заданная в \fInodemask\fP и \fImaxnode\fP, указывает за пределы доступного адресного пространства. .TP \fBEINVAL\fP Некорректное значение \fImode\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 \fBENOMEM\fP Недостаточное количество памяти ядра. .SH ВЕРСИИ Системный вызов \fBset_mempolicy\fP() был добавлен в ядро Linux версии 2.6.7. .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" Данный вызов есть только в Linux. .SH ЗАМЕЧАНИЯ Политика памяти не запоминается, если страница помещается в пространство подкачки. Когда страница возвращается в основную память, будет использована политика нити или диапазона памяти, действующая на момент выделения страницы. .PP Информация о библиотеке доступна в \fBnuma\fP(7). .SH "СМ. ТАКЖЕ" \fBget_mempolicy\fP(2), \fBgetcpu\fP(2), \fBmbind\fP(2), \fBmmap\fP(2), \fBnuma\fP(3), \fBcpuset\fP(7), \fBnuma\fP(7), \fBnumactl\fP(8) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , 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 .