الاسم
- Provided by: manpages-ar-dev (Version: 4.31.0-1)
- Source: manpages-l10n
- Report a bug
مكتبة سي المعيارية (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، يجب ألا تُنتج آثارًا جانبية، لأن الدوال الكلية أعلاه قد تُقيّم الوسيطة أكثر من مرة.
المعالج الأول في النظام يُقابل قيمة cpu تساوي 0، والمعالج التالي يُقابل قيمة cpu تساوي 1، وهكذا. لا ينبغي افتراض توفر معالجات معينة، أو أن مجموعة المعالجات متصلة، لأن المعالجات قد تُؤخذ دون اتصال ديناميكيًا أو تكون غائبة بخلاف ذلك. الثابت CPU_SETSIZE (حاليًا 1024) يُحدد قيمة أكبر بواحد من أقصى رقم معالج يمكن تخزينه في cpu_set_t.
الدوال الكلية التالية تُنفذ عمليات منطقية على مجموعات المعالجات:
لأن بعض التطبيقات قد تتطلب القدرة على تغيير حجم مجموعات المعالجات ديناميكيًا (مثلًا، لتخصيص مجموعات أكبر من تلك المعرفة بنوع البيانات القياسي cpu_set_t)، يوفر glibc حاليًا مجموعة من الدوال الكلية لدعم هذا.
الدوال الكلية التالية تُستخدم لتخصيص وإلغاء تخصيص مجموعات المعالجات:
الكليات التي تنتهي أسماؤها بـ "_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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.