GETCPU(2)

ИМЯ
getcpu - определяет ЦП и узел NUMA, на котором выполняется вызывающая нить

ОБЗОР
#include <linux/getcpu.h>

int getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache);

ОПИСАНИЕ
Системный вызов getcpu() определяет процессор и узел, на котором вызывающая нить или процесс выполняются в данный момент и записывает их в виде целых чисел в память, на которую указывают аргументы cpu и node. Процессор представляется в виде уникального малого целого числа, закреплённого за определённым ЦП. Узел представляется в виде уникального идентификатора, закреплённого за определённым узлом NUMA. Если значение cpu или node равно NULL, то по соответствующему указателю ничего не записывается.

Третий аргумент этого системного вызова в настоящее время не используется и указываться как NULL, не требуется переносимость на Linux 2.6.23 или более младшие версии (смотрите ЗАМЕЧАНИЯ).

Информация, помещаемая в cpu, будет находиться там только на время вызова: unless the CPU affinity has been fixed using sched_setaffinity(2), the kernel might change the CPU at any time. (Normally this does not happen because the scheduler tries to minimize movements between CPUs to keep caches hot, but it is possible.) Достоверность информации, помещаемой в cpu, гарантируется только на момент вызова: если привязка ЦП не была изменена с помощью sched_setaffinity(2), то ядро может сменить ЦП в любой момент (обычно этого не происходит, так как планировщик пытается минимизировать перемещения задач между процессорами для поддержания актуальности кэша,но всё же это возможно). Вызывающий должен быть готов к ситуации, что информация, возвращённая в cpu и node, может потерять актуальность уже после возврата из вызова.

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

ОШИБКИ

EFAULT
    Аргументы указывают за пределы адресного пространства вызывающего процесса.

ВЕРСИИ
Системный вызов getcpu() добавлен в ядре 2.6.19 для x86-64 и i386. Библиотечная поддержка добавлена в glibc 2.29 (ранние версии glibc не содержали обёрточную функцию для этого вызова, нужно было использовать syscall(2)).

СООТВЕТСТВИЕ СТАНДАРТАМ
Вызов getcpu() есть только в Linux.

ЗАМЕЧАНИЯ
Linux старается выполнить данный вызов как можно быстрее (на некоторых архитектурах это делается через реализацию в vdso(7)). Предназначение getcpu() — позволить программам оптимизировать обработку данных на разных ЦП или выполнить оптимизации NUMA.

Аргумент tcache не используется начиная с Linux 2.6.24. В более старых ядрах, если этот аргумент не равнялся NULL, то в нём задавался указатель на буфер, выделяемый вызывающим в локальном хранилище нити, который использовался для работы механизма кэширования getcpu(). Использование кэша могло бы увеличить скорость работы getcpu(), и расплатой за это было бы возникновение очень маленькой вероятности, что возвращаемая информация устарела. Кэширующий механизм стал рассматриваться как вызывающий проблемы при перемещения нитей между ЦП, и поэтому теперь этот аргумент игнорируется.

СМОТРИТЕ ТАКЖЕ
mbind(2), sched_setaffinity(2), set_mempolicy(2), sched_getcpu(3), cpuset(7), vdso(7)