CPU_SET

CPU_SET(3)      Ð ÑководÑÑво пÑогÑаммиÑÑа Linux      CPU_SET(3)



ÐÐЯ
       CPU_SET, CPU_CLR, CPU_ISSET, CPU_ZERO, CPU_COUNT, CPU_AND, CPU_OR,
       CPU_XOR, CPU_EQUAL, CPU_ALLOC, CPU_ALLOC_SIZE, CPU_FREE, CPU_SET_S,
       CPU_CLR_S, CPU_ISSET_S, CPU_ZERO_S, CPU_COUNT_S, CPU_AND_S, CPU_OR_S,
       CPU_XOR_S, CPU_EQUAL_S - макÑоÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð½Ð°Ð±Ð¾Ñами
       ЦÐ

ÐÐÐÐÐ
       #define _GNU_SOURCE             /* СмоÑÑиÑе feature_test_macros(7) */
       #include <sched.h>

       void CPU_ZERO(cpu_set_t *set);

       void CPU_SET(int cpu, cpu_set_t *set);
       void CPU_CLR(int cpu, cpu_set_t *set);
       int  CPU_ISSET(int cpu, cpu_set_t *set);

       int  CPU_COUNT(cpu_set_t *set);

       void CPU_AND(cpu_set_t *destset,
                    cpu_set_t *srcset1, cpu_set_t *srcset2);
       void CPU_OR(cpu_set_t *destset,
                    cpu_set_t *srcset1, cpu_set_t *srcset2);
       void CPU_XOR(cpu_set_t *destset,
                    cpu_set_t *srcset1, cpu_set_t *srcset2);

       int  CPU_EQUAL(cpu_set_t *set1, cpu_set_t *set2);

       cpu_set_t *CPU_ALLOC(int num_cpus);
       void CPU_FREE(cpu_set_t *set);
       size_t CPU_ALLOC_SIZE(int num_cpus);

       void CPU_ZERO_S(size_t setsize, cpu_set_t *set);

       void CPU_SET_S(int cpu, size_t setsize, cpu_set_t *set);
       void CPU_CLR_S(int cpu, size_t setsize, cpu_set_t *set);
       int  CPU_ISSET_S(int cpu, size_t setsize, cpu_set_t *set);

       int  CPU_COUNT_S(size_t setsize, cpu_set_t *set);

       void CPU_AND_S(size_t setsize, cpu_set_t *destset,
                    cpu_set_t *srcset1, cpu_set_t *srcset2);
       void CPU_OR_S(size_t setsize, cpu_set_t *destset,
                    cpu_set_t *srcset1, cpu_set_t *srcset2);
       void CPU_XOR_S(size_t setsize, cpu_set_t *destset,
                    cpu_set_t *srcset1, cpu_set_t *srcset2);

       int  CPU_EQUAL_S(size_t setsize, cpu_set_t *set1, cpu_set_t *set2);

ÐÐÐСÐÐÐÐ
       ÐÐ°Ð±Ð¾Ñ Ð¦Ð Ð¾Ð¿Ð¸ÑÑваеÑÑÑ ÑÑÑÑкÑÑÑой даннÑÑ cpu_set_t.
       ÐÐ°Ð±Ð¾Ñ Ð¦Ð Ð¸ÑполÑзÑеÑÑÑ Ð² sched_setaffinity(2) и
       подобнÑÑ Ð¸Ð½ÑеÑÑейÑаÑ.

       Тип даннÑÑ cpu_set_t Ñеализован в виде
       биÑовой маÑки. Ðднако ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ ÑледÑеÑ
       ÑÑиÑаÑÑ Â«ÑÑÑнÑм ÑÑиком»: вÑе дейÑÑÐ²Ð¸Ñ Ñ
       набоÑами ЦРÑледÑÐµÑ Ð²ÑполнÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
       макÑоÑов, опиÑаннÑÑ Ð½Ð° ÑÑой ÑÑÑаниÑе.

       ÐÐ»Ñ ÑабоÑÑ Ñ Ð½Ð°Ð±Ð¾Ñом ЦРset пÑедоÑÑавлÑÑÑÑÑ
       ÑледÑÑÑие макÑоÑÑ:

       CPU_ZERO()       ÐÑиÑÐ°ÐµÑ set, поÑле ÑÑого он не
                        ÑодеÑÐ¶Ð¸Ñ Ð¦Ð.

       CPU_SET()        ÐобавлÑÐµÑ Ð¦Ð cpu в set.

       CPU_CLR()        УдалÑÐµÑ Ð¦Ð cpu из set.

       CPU_ISSET()      ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ЦРcpu Ñленом
                        set.

       CPU_COUNT()      ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ЦРв set.

       ÐакÑоÑÑ, имеÑÑие аÑгÑÐ¼ÐµÐ½Ñ cpu, не вÑзÑваÑÑ
       побоÑнÑÑ ÑÑÑекÑов, вÑе пеÑеÑиÑленнÑе вÑÑе
       макÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð±Ð¾Ð»ÐµÐµ
       одного Ñаза.

       ÐнаÑение пеÑвого ЦРÑиÑÑÐµÐ¼Ñ Ð² cpu обознаÑаеÑÑÑ
       как 0, знаÑение ÑледÑÑÑего ЦРв cpu Ñавно 1 и Ñ.
       д. ÐелÑÐ·Ñ Ð¿ÑедполагаÑÑ Ð¾ доÑÑÑпноÑÑи
       какиÑ-либо ЦÐ, или ÑÑо Ð½Ð°Ð±Ð¾Ñ Ð¦Ð Ð½ÐµÐ¿ÑеÑÑвен,
       Ñак как ЦРмогÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки оÑклÑÑаÑÑÑÑ Ð¸Ð»Ð¸
       вообÑе оÑÑÑÑÑÑвоваÑÑ. ÐонÑÑанÑой CPU_SETSIZE (в
       наÑÑоÑÑее вÑÐµÐ¼Ñ 1024) задаÑÑÑÑ Ð·Ð½Ð°Ñение на 1
       болÑÑее, Ñем макÑималÑнÑй Ð½Ð¾Ð¼ÐµÑ Ð¦Ð, коÑоÑÑй
       можно ÑÑаниÑÑ Ð² cpu_set_t.

       СледÑÑÑие макÑоÑÑ Ð²ÑполнÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкие
       опеÑаÑии над набоÑами ЦÐ:

       CPU_AND()        СоÑÑанÑÐµÑ Ð¿ÐµÑеÑеÑение набоÑов
                        srcset1 и srcset2 в destset (коÑоÑÑй можеÑ
                        бÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из
                        набоÑов-аÑгÑменÑов).

       CPU_OR()         СоÑÑанÑÐµÑ Ð¾Ð±Ñединение набоÑов
                        srcset1 и srcset2 в destset (коÑоÑÑй можеÑ
                        бÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из
                        набоÑов-аÑгÑменÑов).

       CPU_XOR()        СоÑÑанÑÐµÑ ÑезÑлÑÑÐ°Ñ XOR набоÑов srcset1
                        и srcset2 в destset (коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
                        одним из набоÑов-аÑгÑменÑов).
                        ÐпеÑаÑÐ¸Ñ XOR возвÑаÑÐ°ÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð¸Ð· ЦÐ,
                        коÑоÑÑе еÑÑÑ Ð² одном из srcset1 или
                        srcset2, но не в обоиÑ
                        одновÑеменно.

       CPU_EQUAL()      ÐÑовеÑÑеÑ, ÑÑо два набоÑа ЦÐ
                        ÑодеÑÐ¶Ð°Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе ЦÐ.

   ÐинамиÑеÑки изменÑемÑе набоÑÑ Ð¦Ð
       Так как некоÑоÑÑм пÑиложениÑм можеÑ
       поÑÑебоваÑÑÑÑ Ð½Ð°Ð±Ð¾ÑÑ Ð¦Ð Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки
       изменÑемÑÑ ÑазмеÑов (напÑимеÑ, длÑ
       вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñов болÑÑе, Ñем опÑеделено
       ÑÑандаÑÑнÑм Ñипом даннÑÑ cpu_set_t), glibc
       пÑедоÑÑавлÑÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð¼Ð°ÐºÑоÑов Ð´Ð»Ñ ÑÑого.

       СледÑÑÑие макÑоÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸
       ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñов ЦÐ:

       CPU_ALLOC()      ÐÑделÑÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð¦Ð, доÑÑаÑоÑнÑй длÑ
                        ÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¦Ð Ð² диапазоне Ð¾Ñ 0 до
                        num_cpus-1.

       CPU_ALLOC_SIZE() ÐозвÑаÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð°Ð±Ð¾Ñа ЦРв
                        байÑаÑ, коÑоÑÑй необÑодим длÑ
                        ÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¦Ð Ð² диапазоне Ð¾Ñ 0 до
                        num_cpus-1. ÐаннÑй макÑоÑ
                        пÑедоÑÑавлÑÐµÑ Ð·Ð½Ð°Ñение, коÑоÑое
                        можно иÑполÑзоваÑÑ Ð² аÑгÑменÑе
                        setsize в макÑоÑÐ°Ñ CPU_*_S(), опиÑаннÑÑ
                        далее.

       CPU_FREE()       ÐÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð¦Ð, вÑделеннÑй
                        Ñанее Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CPU_ALLOC().

       ÐакÑоÑÑ, ÑÑи имена заканÑиваÑÑÑÑ Ð½Ð° «_S»,
       аналогиÑÐ½Ñ Ð¼Ð°ÐºÑоÑам Ñ Ñем же именем без
       ÑÑÑÑикÑа. ÐÑи макÑоÑÑ Ð²ÑполнÑÑÑ Ñе же задаÑи ÑÑо
       и Ð¸Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸, но они ÑабоÑаÑÑ Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки
       вÑделÑемÑми набоÑами ЦÐ, ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑоÑÑÑ
       Ñавен setsize байÑ.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐакÑоÑÑ CPU_ISSET() и CPU_ISSET_S() возвÑаÑаÑÑ
       ненÑлевое знаÑение, еÑли cpu еÑÑÑ Ð² set; в
       пÑоÑивном ÑлÑÑае возвÑаÑаеÑÑÑ 0.

       ÐакÑоÑÑ CPU_COUNT() и CPU_COUNT_S() возвÑаÑаÑÑ
       колиÑеÑÑво ЦРв set.

       ÐакÑоÑÑ CPU_EQUAL() и CPU_EQUAL_S() возвÑаÑаÑÑ
       ненÑлевое знаÑение, еÑли два набоÑа ЦÐ
       одинаковÑ; в пÑоÑивном ÑлÑÑае возвÑаÑаеÑÑÑ 0.

       ÐÑи ÑÑпеÑном вÑполнении макÑÐ¾Ñ CPU_ALLOC()
       возвÑаÑÐ°ÐµÑ ÑказаÑелÑ, пÑи оÑибке
       возвÑаÑаеÑÑÑ NULL (оÑибки Ñе же, ÑÑо и Ñ malloc(3)).

       ÐакÑÐ¾Ñ CPU_ALLOC_SIZE() возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво байÑ,
       ÑÑебÑемое Ð´Ð»Ñ ÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñа ЦРÑказаннÑÑ
       ÑлеменÑов.

       ÐÑÑалÑнÑе ÑÑнкÑии не возвÑаÑаÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
       знаÑений.

ÐÐРСÐÐ
       ÐакÑоÑÑ CPU_ZERO(), CPU_SET(), CPU_CLR() и CPU_ISSET()
       Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð² glibc веÑÑии 2.3.3.

       ÐакÑÐ¾Ñ CPU_COUNT() впеÑвÑе поÑвилаÑÑ Ð² glibc веÑÑии
       2.6.

       ÐакÑоÑÑ CPU_AND(), CPU_OR(), CPU_XOR(), CPU_EQUAL(), CPU_ALLOC(),
       CPU_ALLOC_SIZE(), CPU_FREE(), CPU_ZERO_S(), CPU_SET_S(), CPU_CLR_S(),
       CPU_ISSET_S(), CPU_AND_S(), CPU_OR_S(), CPU_XOR_S() и CPU_EQUAL_S()
       впеÑвÑе поÑвилиÑÑ Ð² glibc веÑÑии 2.7.

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       ÐаннÑе инÑеÑÑейÑÑ ÐµÑÑÑ ÑолÑко в Linux.

ÐÐÐÐЧÐÐÐЯ
       ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸ набоÑа ЦРиÑполÑзÑйÑе
       memcpy(3).

       Так как набоÑÑ Ð¦Ð ÑÑо биÑовÑе маÑки,
       вÑделÑемÑе в единиÑÐ°Ñ Ð´Ð»Ð¸Ð½Ð½ÑÑ Ñлов,
       ÑеалÑное колиÑеÑÑво ЦРв динамиÑеÑки
       вÑделенном набоÑе ЦРбÑÐ´ÐµÑ Ð¾ÐºÑÑглено до
       ÑледÑÑÑего кÑаÑного sizeof(unsigned long).
       ÐÑиложение должно ÑÑиÑаÑÑ ÑодеÑжимое ÑÑиÑ
       дополниÑелÑнÑÑ Ð±Ð¸Ñ Ð½ÐµÐ¾Ð¿ÑеделÑннÑм.

       ÐеÑмоÑÑÑ Ð½Ð° поÑожеÑÑÑ Ð¸Ð¼Ñн, замеÑим, ÑÑо
       конÑÑанÑа CPU_SETSIZE опÑеделÑÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ЦРв
       Ñипе даннÑÑ cpu_set_t (Ñо еÑÑÑ, ÑÑÑекÑивное
       колиÑеÑÑво биÑов в биÑовой маÑке), в Ñо
       вÑÐµÐ¼Ñ ÐºÐ°Ðº аÑгÑÐ¼ÐµÐ½Ñ setsize макÑоÑов CPU_*_S() â ÑÑо
       ÑÐ°Ð·Ð¼ÐµÑ Ð² байÑаÑ.

       Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð°ÑамеÑÑов и возвÑаÑаемÑÑ
       знаÑений, показаннÑÑ Ð² ÐÐÐÐÐ Ð â подÑказки,
       ÑÑо ожидаеÑÑÑ Ð² каждом ÑлÑÑае. Ðднако Ñак
       как ÑÑи инÑеÑÑейÑÑ ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÐºÐ°Ðº макÑоÑÑ,
       компилÑÑÐ¾Ñ Ð½Ðµ обÑзаÑелÑно Ð¿Ð¾Ð¹Ð¼Ð°ÐµÑ Ð²Ñе
       оÑибки пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñипов, еÑли Ð²Ñ Ð½Ð°ÑÑÑиÑе
       пÑедположениÑ.

ÐÐФÐÐТЫ
       Ðа 32-ÑазÑÑднÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ð°Ñ Ð² glibc 2.8 и Ñанее
       CPU_ALLOC () вÑделÑÐµÑ Ð²Ð´Ð²Ð¾Ðµ болÑÑе пÑоÑÑÑанÑÑва,
       как ÑÑебÑеÑÑÑ, и CPU_ALLOC_SIZE() возвÑаÑаеÑ
       знаÑение вдвое болÑÑее, Ñем должно. ÐÑа
       оÑибка не должна влиÑÑÑ Ð½Ð° ÑеманÑикÑ
       пÑогÑаммÑ, но пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÑаÑе впÑÑÑÑÑ Ð¿Ð°Ð¼ÑÑи и
       менее ÑÑÑекÑивной ÑабоÑе макÑоÑов длÑ
       динамиÑеÑки вÑделÑемÑÑ Ð½Ð°Ð±Ð¾Ñов ЦÐ. ÐÑи
       оÑибки иÑпÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² glibc веÑÑии 2.9.

ÐÐ ÐÐÐÐ
       СледÑÑÑÐ°Ñ Ð¿ÑогÑамма показÑваеÑ
       иÑполÑзование некоÑоÑÑÑ Ð¼Ð°ÐºÑоÑов, ÑабоÑаÑÑиÑ
       Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки вÑделÑемÑми набоÑами ЦÐ.

       #define _GNU_SOURCE
       #include <sched.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <stdio.h>
       #include <assert.h>

       int
       main(int argc, char *argv[])
       {
           cpu_set_t *cpusetp;
           size_t size;
           int num_cpus, cpu;

           if (argc < 2) {
               fprintf(stderr, "ÐÑполÑзование: %s <колиÑеÑÑво-ЦÐ>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           num_cpus = atoi(argv[1]);

           cpusetp = CPU_ALLOC(num_cpus);
           if (cpusetp == NULL) {
               perror("CPU_ALLOC");
               exit(EXIT_FAILURE);
           }

           size = CPU_ALLOC_SIZE(num_cpus);

           CPU_ZERO_S(size, cpusetp);
           for (cpu = 0; cpu < num_cpus; cpu += 2)
               CPU_SET_S(cpu, size, cpusetp);

           printf("CPU_COUNT() набоÑа:    %d\n", CPU_COUNT_S(size, cpusetp));

           CPU_FREE(cpusetp);
           exit(EXIT_SUCCESS);
       }

СÐÐТРÐТРТÐÐÐÐ
       sched_setaffinity(2), pthread_attr_setaffinity_np(3),
       pthread_setaffinity_np(3), cpuset(7)



Linux                             2015-05-07                        CPU_SET(3)