Scroll to navigation

sched_setattr(2) System Calls Manual sched_setattr(2)

الاسم

sched_setattr, sched_getattr - ضبط وجلب سياسة الجدولة وسماتها

المكتبة

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

موجز

#include <sched.h>            /* Definition of SCHED_* constants */
#include <sys/syscall.h>      /* Definition of SYS_* constants */
#include <unistd.h>
int syscall(SYS_sched_setattr, pid_t pid, struct sched_attr *attr,
            unsigned int flags);
int syscall(SYS_sched_getattr, pid_t pid, struct sched_attr *attr,
            unsigned int size, unsigned int flags);

ملاحظة: لا توفر glibc أغلفة لنداءات النظام هذه، مما يستلزم استخدام syscall(2).

الوصف

sched_setattr()

استدعاء النظام sched_setattr() يضبط سياسة الجدولة والسمات المرتبطة بها للخيط الذي يُحدد معرفه في pid. إذا كان pid يساوي صفرًا، تُضبط سياسة الجدولة وسمات الخيط المستدعي.

حاليًا، يدعم لينكس سياسات الجدولة "العادية" (أي غير الحقيقية) التالية كقيم يمكن تحديدها في policy:

سياسة تقاسم الوقت القياسية (round-robin)؛
لتنفيذ العمليات بأسلوب "الدفعة"؛ و
لتشغيل وظائف خلفية ذات أولوية منخفضة جدًا.

تُدعم أيضًا سياسات "وقت حقيقي" متنوعة، للتطبيقات الخاصة ذات الوقت الحرج التي تحتاج إلى تحكم دقيق في الطريقة التي تُختار بها الخيوط القابلة للتشغيل للتنفيذ. للقواعد التي تحكم متى يمكن لعملية استخدام هذه السياسات، انظر sched(7). سياسات الوقت الحقيقي التي يمكن تحديدها في policy هي:

سياسة الوارد أولاً، يخرج أولاً؛ و
سياسة الدوري (round-robin).

يوفر لينكس أيضًا السياسة التالية:

سياسة جدولة بالموعد النهائي؛ انظر sched(7) للتفاصيل.

الوسيط attr هو مؤشر إلى بنية تُعرّف سياسة الجدولة الجديدة وسماتها للخيط المُحدد. هذه البنية لها الشكل التالي:


struct sched_attr {

u32 size; /* Size of this structure */
u32 sched_policy; /* Policy (SCHED_*) */
u64 sched_flags; /* Flags */
s32 sched_nice; /* Nice value (SCHED_OTHER,
SCHED_BATCH) */
u32 sched_priority; /* Static priority (SCHED_FIFO,
SCHED_RR) */
/* For SCHED_DEADLINE */
u64 sched_runtime;
u64 sched_deadline;
u64 sched_period;
/* Utilization hints */
u32 sched_util_min;
u32 sched_util_max; };

حقول بنية sched_attr هي كما يلي:

يجب ضبط هذا الحقل على حجم البنية بالبايت، كما في sizeof(struct sched_attr). إذا كانت البنية المُقدمة أصغر من بنية النواة، يُفترض أن أي حقول إضافية هي '0'. إذا كانت البنية المُقدمة أكبر من بنية النواة، تتحقق النواة من أن جميع الحقول الإضافية هي 0؛ إذا لم تكن كذلك، يفشل sched_setattr() مع الخطأ E2BIG ويُحدّث size لاحتواء حجم بنية النواة.
السلوك أعلاه عندما لا يتطابق حجم بنية sched_attr في مساحة المستخدم مع حجم بنية النواة يسمح بقابلية توسعة الواجهة في المستقبل. التطبيقات غير السليمة التي تمرر بنيات كبيرة جدًا لن تتعطل في المستقبل إذا زاد حجم بنية sched_attr في النواة. في المستقبل، قد يسمح أيضًا للتطبيقات التي تعرف بنية sched_attr أكبر في مساحة المستخدم بتحديد ما إذا كانت تعمل على نواة أقدم لا تدعم البنية الأكبر.
يُحدد هذا الحقل سياسة الجدولة، كأحد قيم SCHED_* المُدرجة أعلاه.
يحتوي هذا الحقل على صفر أو أكثر من الأعلام التالية التي تُجمع بعملية OR للتحكم في سلوك الجدولة:
الأطفال المُنشأون بواسطة fork(2) لا يرثون سياسات الجدولة المميزة. انظر sched(7) للتفاصيل.
يسمح هذا العلم لخيط SCHED_DEADLINE باستعادة عرض النطاق غير المستخدم من قبل خيوط الوقت الحقيقي الأخرى.
يسمح هذا العلم لتطبيق بالحصول على إعلام حول تجاوزات وقت التشغيل في خيوط SCHED_DEADLINE. قد تحدث هذه التجاوزات بسبب (على سبيل المثال) محاسبة وقت تنفيذ تقريبية أو تعيين معاملات غير صحيح. يأخذ الإعلام شكل إشارة SIGXCPU التي تُولد عند كل تجاوز.
إشارة SIGXCPU هذه هي موجهة للعملية (انظر signal(7)) بدلاً من كونها موجهة للخيط. هذا ربما يكون خطأ برمجي. من ناحية، يُستخدم sched_setattr() لضبط سمة لكل خيط. من ناحية أخرى، إذا تم تسليم الإشارة الموجهة للعملية إلى خيط داخل العملية غير الخيط الذي حدث له تجاوز وقت التشغيل، فلا يوجد لدى التطبيق طريقة لمعرفة أي خيط تجاوز.
تشير هذه الأعلام إلى أن الحقلين sched_util_min أو sched_util_max، على التوالي، موجودان، ويمثلان الحد الأدنى والحد الأقصى المتوقعين لاستخدام الخيط.
توفر سمات الاستخدام للمجدول حدودًا يجب أن يُجدول الخيط ضمنها، مما يُعلم قراراته بشأن وضع المهمة واختيار التردد.
يُحدد هذا الحقل قيمة نايس التي يجب ضبطها عند تحديد sched_policy كـ SCHED_OTHER أو SCHED_BATCH. قيمة نايس هي رقم في النطاق -20 (أولوية عالية) إلى +19 (أولوية منخفضة)؛ انظر sched(7).
يُحدد هذا الحقل الأولوية الثابتة التي يجب ضبطها عند تحديد sched_policy كـ SCHED_FIFO أو SCHED_RR. يمكن تحديد النطاق المسموح به للأولويات لهذه السياسات باستخدام sched_get_priority_min(2) و sched_get_priority_max(2). بالنسبة للسياسات الأخرى، يجب تحديد هذا الحقل كـ 0.
يُحدد هذا الحقل معامل "Runtime" لجدولة الموعد النهائي. يُعبر عن القيمة بالنانو ثانية. هذا الحقل، والحقلان التاليان، يُستخدمان فقط لجدولة SCHED_DEADLINE؛ لمزيد من التفاصيل، انظر sched(7).
يُحدد هذا الحقل معامل "Deadline" لجدولة الموعد النهائي. يُعبر عن القيمة بالنانو ثانية.
يُحدد هذا الحقل معامل "Period" لجدولة الموعد النهائي. يُعبر عن القيمة بالنانو ثانية.
يُحدد هذان الحقلان الحد الأدنى والحد الأقصى المتوقعين للاستخدام، على التوالي. يتم تجاهلهما ما لم يتم ضبط العلم المقابل SCHED_FLAG_UTIL_CLAMP_MIN أو SCHED_FLAG_UTIL_CLAMP_MAX في sched_flags.
الاستخدام هو قيمة في النطاق [0, 1024]، تمثل النسبة المئوية لوقت وحدة المعالجة المركزية المستخدمة من قبل مهمة عند التشغيل بأقصى تردد على أعلى سعة وحدة معالجة مركزية في النظام. هذا تمثيل نقطة ثابتة، حيث 1024 تقابل 100%، و0 تقابل 0%. على سبيل المثال، مهمة استخدام 20% هي مهمة تعمل لمدة 2 مللي ثانية كل 10 مللي ثانية بأقصى تردد وتمثل بقيمة استخدام 0.2 * 1024 = 205.
مهمة ذات قيمة استخدام دنيا أكبر من 0 من المرجح أن تُجدول على وحدة معالجة مركزية بسعة كافية لاستيعاب القيمة المحددة. مهمة ذات قيمة استخدام قصوى أصغر من 1024 من المرجح أن تُجدول على وحدة معالجة مركزية لا تتجاوز سعتها القيمة المحددة.
يمكن إعادة تعيين حد استخدام المهمة بتعيين حقلها إلى UINT32_MAX (منذ لينكس 5.11).

وسيطة flags مُوفرة للسماح بتمديدات مستقبلية للواجهة؛ في التنفيذ الحالي يجب تحديدها كـ 0.

sched_getattr()

استدعاء النظام sched_getattr() يجلب سياسة الجدولة والسمات المرتبطة بها للخيط الذي يُحدد معرفه في pid. إذا كان pid يساوي صفرًا، فسيتم استرداد سياسة الجدولة وسمات الخيط المستدعي.

يجب تعيين وسيطة size إلى حجم بنية sched_attr كما هو معروف لمساحة المستخدم. يجب أن تكون القيمة على الأقل بحجم بنية sched_attr المنشورة مبدئيًا، أو يفشل الاستدعاء مع الخطأ EINVAL.

تُوضع سمات الجدولة المستردة في حقول بنية sched_attr التي يشير إليها attr. يضبط النواة attr.size على حجم بنية sched_attr الخاصة به.

إذا كانت مخبأة attr المقدمة من المستدعي أكبر من بنية sched_attr للنواة، فلن تُلمس البايتات الإضافية في بنية مساحة المستخدم. إذا كانت البنية المقدمة من المستدعي أصغر من بنية sched_attr للنواة، فلن تُرجع النواة بصمت أي قيم قد تُخزن خارج المساحة المقدمة. كما هو الحال مع sched_setattr()، تسمح هذه الدلالات بتمديد الواجهة مستقبلًا.

وسيطة flags مُوفرة للسماح بتمديدات مستقبلية للواجهة؛ في التنفيذ الحالي يجب تحديدها كـ 0.

قيمة الإرجاع

عند النجاح، تُرجع sched_setattr() و sched_getattr() 0. عند الخطأ، تُرجع -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

يمكن أن تفشل كل من sched_getattr() و sched_setattr() للأسباب التالية:

attr هو NULL؛ أو pid سالب؛ أو flags ليس صفرًا.
تعذر العثور على الخيط (thread) الذي معرفه pid.

بالإضافة إلى ذلك، يمكن أن تفشل sched_getattr() للأسباب التالية:

المخبأة المحددة بواسطة size و attr صغيرة جدًا.
size غير صالح؛ أي أنه أصغر من الإصدار الأولي لبنية sched_attr (48 بايت) أو أكبر من حجم صفحة النظام.

بالإضافة إلى ذلك، يمكن أن تفشل sched_setattr() للأسباب التالية:

المخبأة المحددة بواسطة size و attr أكبر من بنية النواة، وواحد أو أكثر من البايتات الزائدة غير صفري.
فشل التحكم في القبول SCHED_DEADLINE، انظر sched(7).
attr.sched_policy ليس إحدى السياسات المعترف بها.
attr.sched_flags يحتوي على علم غير SCHED_FLAG_RESET_ON_FORK.
attr.sched_priority غير صالح.
attr.sched_policy هو SCHED_DEADLINE، ومعلمات جدولة الموعد النهائي في attr غير صالحة.
attr.sched_flags يحتوي على SCHED_FLAG_UTIL_CLAMP_MIN أو SCHED_FLAG_UTIL_CLAMP_MAX، و attr.sched_util_min أو attr.sched_util_max خارج النطاق.
تم توفير SCHED_FLAG_UTIL_CLAMP، لكن النواة لم تُبنَ بدعم CONFIG_UCLAMP_TASK.
المستدعي لا يملك الامتيازات المناسبة.
قناع التقارب لوحدة المعالجة المركزية للخيط المحدد بواسطة pid لا يشمل جميع وحدات المعالجة المركزية في النظام (انظر sched_setaffinity(2)).

المعايير

لينكس.

التاريخ

لينكس 3.14.

ملاحظات

لا توفر glibc أغلفة لاستدعاءات النظام هذه؛ استدعها باستخدام syscall(2).

توفر sched_setattr() مجموعة شاملة من وظائف sched_setscheduler(2)، sched_setparam(2)، nice(2)، و (بخلاف القدرة على ضبط أولوية جميع العمليات التابعة لمستخدم محدد أو جميع العمليات في مجموعة محددة) setpriority(2). بالمثل، توفر sched_getattr() مجموعة شاملة من وظائف sched_getscheduler(2)، sched_getparam(2)، و (جزئيًا) getpriority(2).

العلل

في إصدارات لينكس حتى 3.15، فشلت sched_setattr() مع الخطأ EFAULT بدلاً من E2BIG للحالة الموصوفة في الأخطاء.

حتى لينكس 5.3، فشلت sched_getattr() مع الخطأ EFBIG إذا كانت بنية sched_attr داخل النواة أكبر من size الممررة من مساحة المستخدم.

انظر أيضًا

chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getparam(2), sched_getscheduler(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setparam(2), sched_setscheduler(2), sched_yield(2), setpriority(2), pthread_getschedparam(3), pthread_setschedparam(3), pthread_setschedprio(3), capabilities(7), cpuset(7), sched(7)

ترجمة

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

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

8 فبراير 2026 صفحات دليل لينكس 6.18