table of contents
SCHED_SETAFFINITY(2) | Руководство программиста Linux | 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)
2010-11-06 | Linux |