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:

SCHED_OTHER
    سياسة تقاسم الوقت القياسية (round-robin)؛

SCHED_BATCH
    لتنفيذ العمليات بأسلوب "الدفعة"؛ و

SCHED_IDLE
    لتشغيل وظائف خلفية ذات أولوية منخفضة جدًا.

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

SCHED_FIFO
    سياسة الوارد أولاً، يخرج أولاً؛ و

SCHED_RR
    سياسة الدوري (round-robin).

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

SCHED_DEADLINE
    سياسة جدولة بالموعد النهائي؛ انظر 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 هي كما يلي:

size
    يجب ضبط هذا الحقل على حجم البنية بالبايت، كما في sizeof(struct sched_attr). إذا كانت البنية المُقدمة أصغر من بنية النواة، يُفترض أن أي حقول إضافية هي '0'. إذا كانت البنية المُقدمة أكبر من بنية النواة، تتحقق النواة من أن جميع الحقول الإضافية هي 0؛ إذا لم تكن كذلك، يفشل sched_setattr() مع الخطأ E2BIG ويُحدّث size لاحتواء حجم بنية النواة.

    السلوك أعلاه عندما لا يتطابق حجم بنية sched_attr في مساحة المستخدم مع حجم بنية النواة يسمح بقابلية توسعة الواجهة في المستقبل. التطبيقات غير السليمة التي تمرر بنيات كبيرة جدًا لن تتعطل في المستقبل إذا زاد حجم بنية sched_attr في النواة. في المستقبل، قد يسمح أيضًا للتطبيقات التي تعرف بنية sched_attr أكبر في مساحة المستخدم بتحديد ما إذا كانت تعمل على نواة أقدم لا تدعم البنية الأكبر.

sched_policy
    يُحدد هذا الحقل سياسة الجدولة، كأحد قيم SCHED_* المُدرجة أعلاه.

sched_flags
    يحتوي هذا الحقل على صفر أو أكثر من الأعلام التالية التي تُجمع بعملية OR للتحكم في سلوك الجدولة:

    SCHED_FLAG_RESET_ON_FORK
        الأطفال المُنشأون بواسطة fork(2) لا يرثون سياسات الجدولة المميزة. انظر sched(7) للتفاصيل.

    SCHED_FLAG_RECLAIM (منذ لينكس 4.13)
        يسمح هذا العلم لخيط SCHED_DEADLINE باستعادة عرض النطاق غير المستخدم من قبل خيوط الوقت الحقيقي الأخرى.

    SCHED_FLAG_DL_OVERRUN (منذ لينكس 4.16)
        يسمح هذا العلم لتطبيق بالحصول على إعلام حول تجاوزات وقت التشغيل في خيوط SCHED_DEADLINE. قد تحدث هذه التجاوزات بسبب (على سبيل المثال) محاسبة وقت تنفيذ تقريبية أو تعيين معاملات غير صحيح. يأخذ الإعلام شكل إشارة SIGXCPU التي تُولد عند كل تجاوز.

        إشارة SIGXCPU هذه هي موجهة للعملية (انظر signal(7)) بدلاً من كونها موجهة للخيط. هذا ربما يكون خطأ برمجي. من ناحية، يُستخدم sched_setattr() لضبط سمة لكل خيط. من ناحية أخرى، إذا تم تسليم الإشارة الموجهة للعملية إلى خيط داخل العملية غير الخيط الذي حدث له تجاوز وقت التشغيل، فلا يوجد لدى التطبيق طريقة لمعرفة أي خيط تجاوز.

    SCHED_FLAG_UTIL_CLAMP_MIN
    SCHED_FLAG_UTIL_CLAMP_MAX (كلاهما منذ لينكس 5.3)
        تشير هذه الأعلام إلى أن الحقلين sched_util_min أو sched_util_max، على التوالي، موجودان، ويمثلان الحد الأدنى والحد الأقصى المتوقعين لاستخدام الخيط.

        توفر سمات الاستخدام للمجدول حدودًا يجب أن يُجدول الخيط ضمنها، مما يُعلم قراراته بشأن وضع المهمة واختيار التردد.

sched_nice
    يُحدد هذا الحقل قيمة نايس التي يجب ضبطها عند تحديد sched_policy كـ SCHED_OTHER أو SCHED_BATCH. قيمة نايس هي رقم في النطاق -20 (أولوية عالية) إلى +19 (أولوية منخفضة)؛ انظر sched(7).

sched_priority
    يُحدد هذا الحقل الأولوية الثابتة التي يجب ضبطها عند تحديد sched_policy كـ SCHED_FIFO أو SCHED_RR. يمكن تحديد النطاق المسموح به للأولويات لهذه السياسات باستخدام sched_get_priority_min(2) و sched_get_priority_max(2). بالنسبة للسياسات الأخرى، يجب تحديد هذا الحقل كـ 0.

sched_runtime
    يُحدد هذا الحقل معامل "Runtime" لجدولة الموعد النهائي. يُعبر عن القيمة بالنانو ثانية. هذا الحقل، والحقلان التاليان، يُستخدمان فقط لجدولة SCHED_DEADLINE؛ لمزيد من التفاصيل، انظر sched(7).

sched_deadline
    يُحدد هذا الحقل معامل "Deadline" لجدولة الموعد النهائي. يُعبر عن القيمة بالنانو ثانية.

sched_period
    يُحدد هذا الحقل معامل "Period" لجدولة الموعد النهائي. يُعبر عن القيمة بالنانو ثانية.

sched_util_min
sched_util_max (كلاهما منذ لينكس 5.3)
    يُحدد هذان الحقلان الحد الأدنى والحد الأقصى المتوقعين للاستخدام، على التوالي. يتم تجاهلهما ما لم يتم ضبط العلم المقابل 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() للأسباب التالية:

EINVAL
    attr هو NULL؛ أو pid سالب؛ أو flags ليس صفرًا.

ESRCH
    تعذر العثور على الخيط (thread) الذي معرفه pid.

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

E2BIG
    المخبأة المحددة بواسطة size و attr صغيرة جدًا.

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

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

E2BIG
    المخبأة المحددة بواسطة size و attr أكبر من بنية النواة، وواحد أو أكثر من البايتات الزائدة غير صفري.

EBUSY
    فشل التحكم في القبول SCHED_DEADLINE، انظر sched(7).

EINVAL
    attr.sched_policy ليس إحدى السياسات المعترف بها.

EINVAL
    attr.sched_flags يحتوي على علم غير SCHED_FLAG_RESET_ON_FORK.

EINVAL
    attr.sched_priority غير صالح.

EINVAL
    attr.sched_policy هو SCHED_DEADLINE، ومعلمات جدولة الموعد النهائي في attr غير صالحة.

EINVAL
    attr.sched_flags يحتوي على SCHED_FLAG_UTIL_CLAMP_MIN أو SCHED_FLAG_UTIL_CLAMP_MAX، و attr.sched_util_min أو attr.sched_util_max خارج النطاق.

EOPNOTSUPP
    تم توفير SCHED_FLAG_UTIL_CLAMP، لكن النواة لم تُبنَ بدعم CONFIG_UCLAMP_TASK.

EPERM
    المستدعي لا يملك الامتيازات المناسبة.

EPERM
    قناع التقارب لوحدة المعالجة المركزية للخيط المحدد بواسطة 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 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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