ioprio_set(2)

الاسم
ioprio_get, ioprio_set - الحصول/تعيين فئة جدولة الإدخال/الإخراج وأولويته

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

موجز
#include <linux/ioprio.h>    /* تعريف ثوابت IOPRIO_* */
#include <sys/syscall.h>     /* تعريف ثوابت SYS_* */
#include <unistd.h>

int syscall(SYS_ioprio_get, int which, int who);
int syscall(SYS_ioprio_set, int which, int who, int ioprio);

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

الوصف
استدعاءات النظام ioprio_get() و ioprio_set() تحصل وتعين فئة جدولة الإدخال/الإخراج وأولويته لواحد أو أكثر من الخيوط.

الوسيطان which و who يحددان الخيط (الخيوط) التي تعمل عليها استدعاءات النظام. الوسيط which يحدد كيفية تفسير who، وله إحدى القيم التالية:

IOPRIO_WHO_PROCESS
    who هو معرف عملية أو معرف خيط يحدد عملية أو خيطًا واحدًا. إذا كان who يساوي 0، فاعمل على الخيط المستدعي.

IOPRIO_WHO_PGRP
    who هو معرف مجموعة عملية يحدد جميع أعضاء مجموعة عملية. إذا كان who يساوي 0، فاعمل على مجموعة العملية التي يكون المستدعي عضوًا فيها.

IOPRIO_WHO_USER
    who هو معرف مستخدم يحدد جميع العمليات التي لها UID حقيقي مطابق.

إذا تم تحديد which كـ IOPRIO_WHO_PGRP أو IOPRIO_WHO_USER عند استدعاء ioprio_get()، وتطابق أكثر من عملية مع who، فإن الأولوية المعادة ستكون الأعلى الموجودة بين جميع العمليات المتطابقة. يقال أن أولوية ما أعلى من أخرى إذا كانت تنتمي إلى فئة أولوية أعلى (IOPRIO_CLASS_RT هي أعلى فئة أولوية؛ IOPRIO_CLASS_IDLE هي الأدنى) أو إذا كانت تنتمي إلى نفس فئة الأولوية مثل العملية الأخرى ولكن لها مستوى أولوية أعلى (رقم أولوية أقل يعني مستوى أولوية أعلى).

الوسيط ioprio المعطى لـ ioprio_set() هو قناع بت يحدد كلاً من فئة الجدولة والأولوية التي سيتم تعيينها للعملية (العمليات) الهدف. تُستخدم الماكرو التالية لتجميع وتحليل قيم ioprio:

IOPRIO_PRIO_VALUE(class, data)
    بإعطاء class جدولة وأولوية (data)، يجمع هذا الماكرو القيمتين لإنتاج قيمة ioprio، والتي يتم إرجاعها كنتيجة للماكرو.

IOPRIO_PRIO_CLASS(mask)
    بإعطاء mask (قيمة ioprio)، يُرجع هذا الماكرو مكون فئة الإدخال/الإخراج الخاص به، أي إحدى القيم IOPRIO_CLASS_RT أو IOPRIO_CLASS_BE أو IOPRIO_CLASS_IDLE.

IOPRIO_PRIO_DATA(mask)
    بإعطاء mask (قيمة ioprio)، يُرجع هذا الماكرو مكون الأولوية (data) الخاص به.

انظر قسم NOTES لمزيد من المعلومات حول فئات الجدولة والأولويات، بالإضافة إلى معنى تحديد ioprio كـ 0.

يتم دعم أولويات الإدخال/الإخراج للقراءات والكتابات المتزامنة (O_DIRECT، O_SYNC). لا يتم دعم أولويات الإدخال/الإخراج للكتابات غير المتزامنة لأنها تصدر خارج سياق البرنامج الذي يُوسخ الذاكرة، وبالتالي لا تنطبق الأولويات الخاصة بالبرنامج.

قيمة الإرجاع
عند النجاح، يُرجع ioprio_get() قيمة ioprio للعملية ذات أعلى أولوية إدخال/إخراج من بين أي من العمليات التي تطابق المعايير المحددة في which و who. عند الخطأ، يتم إرجاع -1، ويتم تعيين errno للإشارة إلى الخطأ.

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

الأخطاء

EINVAL
    قيمة غير صالحة لـ which أو ioprio. راجع قسم NOTES لفئات الجدولة المتاحة ومستويات الأولوية لـ ioprio.

EPERM
    لا تمتلك العملية المستدعية الامتياز اللازم لتعيين ioprio هذا للعملية (العمليات) المحددة. راجع قسم NOTES لمزيد من المعلومات حول الامتيازات المطلوبة لـ ioprio_set().

ESRCH
    لم يتم العثور على عملية (عمليات) تطابق المواصفات في which و who.

المعايير
لينكس.

التاريخ
لينكس 2.6.13.

ملاحظات
يمكن لعمليتين أو أكثر أو خيوط مشاركة سياق إدخال/إخراج. ستكون هذه هي الحالة عندما يتم استدعاء clone(2) مع العلم CLONE_IO. ومع ذلك، بشكل مبدئي، لن تشارك الخيوط المميزة لعملية ما نفس سياق الإدخال/الإخراج. هذا يعني أنه إذا كنت تريد تغيير أولوية الإدخال/الإخراج لجميع الخيوط في عملية ما، فقد تحتاج إلى استدعاء ioprio_set() على كل خيط. معرف الخيط الذي ستحتاجه لهذه العملية هو الذي يتم إرجاعه بواسطة gettid(2) أو clone(2).

يكون لاستدعاءات النظام هذه تأثير فقط عند استخدامها مع جدولة إدخال/إخراج تدعم أولويات الإدخال/الإخراج. اعتبارًا من النواة 2.6.17، جدولة الإدخال/الإخراج الوحيدة من هذا القبيل هي جدولة الاصطفاف العادل تمامًا (CFQ).

إذا لم يتم تعيين جدولة إدخال/إخراج لخيط، فبشكل مبدئي ستتبع أولوية الإدخال/الإخراج قيمة nice لوحدة المعالجة المركزية (setpriority(2)). قبل Linux 2.6.24، بمجرد تعيين أولوية إدخال/إخراج باستخدام ioprio_set()، لم تكن هناك طريقة لإعادة تعيين سلوك جدولة الإدخال/الإخراج إلى المبدئي. منذ Linux 2.6.24، يمكن استخدام تحديد ioprio كـ 0 لإعادة التعيين إلى سلوك جدولة الإدخال/الإخراج المبدئي.

  اختيار جدول إدخال/إخراج
يتم اختيار جداول الإدخال/الإخراج على أساس كل جهاز عبر الملف الخاص /sys/block/device/queue/scheduler.

يمكن للمرء عرض جدول الإدخال/الإخراج الحالي عبر نظام الملفات /sys. على سبيل المثال، يعرض الأمر التالي قائمة بجميع الجداول المحملة حالياً في النواة:

    $ cat /sys/block/sda/queue/scheduler
    noop anticipatory deadline [cfq]

الجدول المحاط بأقواس هو المستخدم فعلياً للجهاز (sda في المثال). يتم تعيين جدول آخر بكتابة اسم الجدول الجديد إلى هذا الملف. على سبيل المثال، سيضبط الأمر التالي الجدول للجهاز sda إلى cfq:

    $ su
    Password:
    # echo cfq > /sys/block/sda/queue/scheduler

  جدول الإدخال/الإخراج للطابور العادل تماماً (CFQ)
منذ الإصدار 3 (المعروف أيضًا باسم CFQ Time Sliced)، يطبق CFQ مستويات nice للإدخال/الإخراج مشابهة لتلك الخاصة بجدولة وحدة المعالجة المركزية. يتم تجميع مستويات nice هذه في ثلاث فئات جدولة، تحتوي كل منها على مستوى أولوية واحد أو أكثر:

IOPRIO_CLASS_RT (1)
    هذه هي فئة الإدخال/الإخراج في الوقت الحقيقي. تُعطى فئة الجدولة هذه أولوية أعلى من أي فئة أخرى: تُعطى العمليات من هذه الفئة وصولاً أولياً إلى القرص في كل مرة. وبالتالي، يجب استخدام فئة الإدخال/الإخراج هذه بحذر: يمكن لعملية إدخال/إخراج واحدة في الوقت الحقيقي أن تجوع النظام بأكمله. ضمن فئة الوقت الحقيقي، هناك 8 مستويات من بيانات الفئة (الأولوية) تحدد بالضبط مقدار الوقت الذي تحتاجه هذه العملية للقرص في كل خدمة. أعلى مستوى أولوية في الوقت الحقيقي هو 0؛ وأدناها هو 7. في المستقبل، قد يتغير هذا ليكون أكثر قابلية للربط المباشر بالأداء، عن طريق تمرير معدل بيانات مرغوب بدلاً من ذلك.

IOPRIO_CLASS_BE (2)
    هذه هي فئة الجدولة بأفضل جهد، وهي المبدئية لأي عملية لم تضبط أولوية إدخال/إخراج محددة. تحدد بيانات الفئة (الأولوية) مقدار عرض النطاق الترددي للإدخال/الإخراج الذي ستحصل عليه العملية. مستويات أولوية أفضل جهد مماثلة لقيم nice لوحدة المعالجة المركزية (انظر getpriority(2)). يحدد مستوى الأولوية أولوية نسبية للعمليات الأخرى في فئة الجدولة بأفضل جهد. تتراوح مستويات الأولوية من 0 (الأعلى) إلى 7 (الأدنى).

IOPRIO_CLASS_IDLE (3)
    هذه هي فئة الجدولة الخاملة. تحصل العمليات التي تعمل عند هذا المستوى على وقت الإدخال/الإخراج فقط عندما لا يحتاج أي شخص آخر إلى القرص. ليس للفئة الخاملة بيانات فئة. مطلوب الانتباه عند تعيين فئة الأولوية هذه لعملية، لأنها قد تصبح جائعة إذا كانت العمليات ذات الأولوية الأعلى تصل باستمرار إلى القرص.

ارجع إلى ملف مصدر النواة Documentation/block/ioprio.rst لمزيد من المعلومات حول جدول الإدخال/الإخراج CFQ وبرنامج مثال.

  الأذونات المطلوبة لضبط أولويات الإدخال/الإخراج
يُمنح الإذن لتغيير أولوية عملية أو يُرفض بناءً على معيارين:

ملكية العملية
    يمكن لعملية غير مميزة ضبط أولوية الإدخال/الإخراج فقط لعملية يتطابق UID الحقيقي الخاص بها مع UID الحقيقي أو الفعال للعملية المستدعية. يمكن لعملية لديها القدرة CAP_SYS_NICE تغيير أولوية أي عملية.

ما هي الأولوية المرغوبة
    تتطلب محاولات ضبط أولويات عالية جداً (IOPRIO_CLASS_RT) القدرة CAP_SYS_ADMIN. حتى Linux 2.6.24 كان مطلوباً أيضًا CAP_SYS_ADMIN لضبط أولوية منخفضة جداً (IOPRIO_CLASS_IDLE)، ولكن منذ Linux 2.6.25، لم يعد هذا مطلوباً.

يجب أن يتبع استدعاء ioprio_set() كلا القاعدتين، وإلا سيفشل الاستدعاء مع الخطأ EPERM.

العلل
لا يوفر glibc بعد ملف رأس مناسب يعرف نماذج الدوال والماكرو الموصوفة في هذه الصفحة. يمكن العثور على تعريفات مناسبة في linux/ioprio.h.

انظر أيضًا
ionice(1), getpriority(2), open(2), capabilities(7), cgroups(7)

Documentation/block/ioprio.rst في شجرة مصدر نواة Linux

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

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

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