SCHED_SETAFFINITY(2)

ИМЯ
sched_setaffinity, sched_getaffinity - устанавливает и получает процессорную маску увязывания для процесса

ОБЗОР
#define _GNU_SOURCE             /* Смотрите feature_test_macros(7) */
#include <sched.h>

int sched_setaffinity(pid_t pid, size_t cpusetsize,
                      cpu_set_t *mask);

int sched_getaffinity(pid_t pid, size_t cpusetsize,
                      cpu_set_t *mask);

ОПИСАНИЕ
В маске увязывания ЦП задаётся набор процессоров (process's CPU affinity mask), на которых может выполняться процесс. В многопроцессорных системах, настройка маски увязывания ЦП может улучшить производительность. Например, выделение одного процессора определённому процессу (т.е., назначение в маске увязывания этому процессу определённого ЦП, и исключение этого ЦП из масок увязывания у остальных процессов) позволяет достичь максимальной скорости выполнения этого процесса. Ограничение выполнения процесса на одном ЦП также позволяет избежать потерь производительности из-за признания недействительными данных в кэше, которое возникает когда процесс прекращает выполняться на одном ЦП и продолжает работу на другом ЦП. Маска увязывания ЦП представляется в виде структуры cpu_set_t, «набором процессоров», на которую указывает mask. В CPU_SET(3) описаны макросы для изменения набора ЦП. Вызов sched_setaffinity() устанавливает маску увязывания ЦП mask для процесса, чей ID указан в pid. Если значение pid равно нулю, то используется вызывающий процесс. В аргументе cpusetsize задаётся количество данных (в байтах), на которые указывает mask. Обычно его значение указывается как sizeof(cpu_set_t). Если процесс, указанный в pid, в данный момент не выполняется на одном из ЦП, заданном в mask, то этот процесс переносится на один из процессоров, назначаемых mask. Вызов sched_getaffinity() записывает в структуру cpu_set_t, на которую указывает mask, значение маски увязывания ЦП для процесса, чей ID указан в pid. В аргументе cpusetsize задаётся размер mask (в байтах). Если значение pid равно нулю, то возвращается маска вызывающего процесса.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении sched_setaffinity() и sched_getaffinity() возвращают 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EFAULT
    Указан некорректный адрес памяти.

EINVAL
    В маске увязывания ЦП mask указаны процессоры, которых физически нет в системе, и которые разрешены процессу согласно любым ограничениям, которые могут налагаться механизмом «cpuset», описанном в cpuset(7).

EINVAL
    (sched_getaffinity() и, в ядрах до 2.6.9, sched_setaffinity()) Значение cpusetsize меньше размера маски увязывания, используемой в ядре.

EPERM
    (sched_setaffinity()) Вызывающий процесс не имеет достаточно прав. Вызывающему требуется иметь эффективный пользовательский ID равный реальному пользовательскому ID или эффективному пользовательскому ID процесса, указанного в pid, или он должен обладать мандатом CAP_SYS_NICE.

ESRCH
    Процесс с идентификатором pid не найден.

ВЕРСИИ
Системные вызовы увязывания ЦП появились в ядре Linux версии 2.5.8. Обёрточные функции появились в glibc 2.3. Первоначально, в интерфейсе glibc присутствовал аргумент cpusetsize, имевший тип unsigned int. В glibc 2.3.3 аргумент cpusetsize был удалён, но появился вновь в glibc 2.3.4 с типом size_t.

СООТВЕТСТВИЕ СТАНДАРТАМ
Данные системные вызовы есть только в Linux.

ЗАМЕЧАНИЯ
После вызова sched_setaffinity() набор процессоров, на которых действительно будет выполняться процесс, вычисляется пересечением набора из аргумента mask и набором процессоров, присутствующих в системе. В дальнейшем, система может ограничить набор процессоров процесса, если задействован механизм «cpuset», описанный в cpuset(7). Эти ограничения на действительный набор процессоров, используемых для процесса, без уведомления налагаются ядром. В sched_setscheduler(2) приведено описание схемы планирования Linux.

В действительности, маска увязывания является атрибутом нити, который может изменяться независимо для каждой нити в группе нитей. В аргументе pid можно передавать значение, возвращаемое вызовом gettid(2). При значении pid равным 0 будет установлен атрибут вызывающей нити, а при передаче значения, возвращаемого вызовом getpid(2), устанавливается атрибут главной нити группы нитей (при работе с программным интерфейсом POSIX используйте функцию pthread_setaffinity_np(3) вместо sched_setaffinity()). Потомок, создаваемый с помощью fork(2), наследует маску увязывания ЦП. Маска увязывания сохраняется при вызове execve(2). В данной справочной странице описан интерфейс увязывания ЦП, используемый в glibc. Реальный интерфейс системных вызов чуть отличается: аргумент mask имеет тип unsigned long *, отражая факт того, что используемая реализация наборов ЦП представляет собой просто битовую маску. При успешном выполнении ядерный системный вызов sched_getaffinity() возвращает размер типа данных cpumask_t (в байтах), который используется в ядре для представления битовой маски процессоров.

СМОТРИТЕ ТАКЖЕ
clone(2), getcpu(2), getpriority(2), gettid(2), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getscheduler(2), sched_setscheduler(2), setpriority(2), CPU_SET(3), pthread_setaffinity_np(3), sched_getcpu(3), capabilities(7), cpuset(7)