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 - كليّات لمعالجة مجموعات CPU

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#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 تمثل مجموعة من وحدات CPU. تُستخدم مجموعات CPU بواسطة sched_setaffinity(2) وواجهات مشابهة.

نوع البيانات cpu_set_t مطبق كقناع بت. ومع ذلك، يجب معاملة بنية البيانات كمعتمة: يجب إجراء جميع معالجات مجموعات CPU عبر الكليّات الموصوفة في هذه الصفحة.

الكليّات التالية موفرة للعمل على مجموعة CPU set:

CPU_ZERO()
    يمسح set، بحيث لا يحتوي على أي وحدات CPU.

CPU_SET()
    يضيف CPU cpu إلى set.

CPU_CLR()
    أزل المعالج cpu من set.

CPU_ISSET()
    اختبر لترى إذا كان المعالج cpu عضوًا في set.

CPU_COUNT()
    أرجع عدد المعالجات في set.

حيثما حُددت وسيطة cpu، يجب ألا تُنتج آثارًا جانبية، لأن الدوال الكلية أعلاه قد تُقيّم الوسيطة أكثر من مرة.

المعالج الأول في النظام يُقابل قيمة cpu تساوي 0، والمعالج التالي يُقابل قيمة cpu تساوي 1، وهكذا. لا ينبغي افتراض توفر معالجات معينة، أو أن مجموعة المعالجات متصلة، لأن المعالجات قد تُؤخذ دون اتصال ديناميكيًا أو تكون غائبة بخلاف ذلك. الثابت CPU_SETSIZE (حاليًا 1024) يُحدد قيمة أكبر بواحد من أقصى رقم معالج يمكن تخزينه في 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.

ملاحظات
لتكرار مجموعة معالجات، استخدم 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 <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    #include <assert.h>

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

        if (argc < 2) {
            fprintf(stderr, "Usage: %s <num-cpus>\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 (size_t cpu = 0; cpu < num_cpus; cpu += 2)
            CPU_SET_S(cpu, size, cpusetp);

        printf("CPU_COUNT() of set:    %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)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.