شرح PREEMPT_RT: ميزات النواة في الوقت الحقيقي
يحوّل برنامج PREEMPT_RT نواة لينكس إلى نظام تشغيل يعمل في الوقت الحقيقي، مما يضمن دقة التوقيت للمهام الحيوية. وهو مُدمج بالكامل في لينكس 6.12 (الذي صدر في 20 سبتمبر 2024)، ويُمكّن من استخدام إمكانيات الوقت الحقيقي لبنى معمارية مثل x86 وARM64 وRISC-V. إليك ما تحتاج معرفته:
- الميزات الرئيسية:
- يستبدل أقفال الدوران التقليدية بأقفال النوم القابلة للمقاطعة.
- يحوّل معالجات المقاطعات إلى خيوط، مما يجعلها قابلة للجدولة والمقاطعة.
- يطبق مبدأ توريث الأولوية لمعالجة مشكلات انعكاس الأولوية.
- يجعل عمليات RCU (القراءة والنسخ والتحديث) قابلة للمقاطعة بشكل كامل.
- التطبيقات:
- تُستخدم في صناعات مثل السيارات والروبوتات والاتصالات السلكية واللاسلكية والأجهزة الطبية حيث يكون التوقيت الدقيق أمراً بالغ الأهمية.
- تُشغّل أنظمة مثل أدوات الأتمتة الصناعية، وأنظمة التحكم في الطيران، وبيئات الاستضافة التي تتطلب خوادم افتراضية خاصة منخفضة زمن الوصول.
- يثبت:
- يُمكَِن
CONFIG_PREEMPT_RTفي إعدادات النواة. - اضبط الإعدادات بدقة مثل
CONFIG_NO_HZ_FULLوCONFIG_RCU_BOOSTلتحقيق الأداء الأمثل. - استخدم أدوات مثل
اختبار دوريلقياس زمن الاستجابة والتحقق من الأداء.
- يُمكَِن
تُعطي تقنية PREEMPT_RT الأولوية للتوقيت على حساب الإنتاجية، مما يجعل نظام لينكس مناسبًا للتطبيقات التي لا تقبل التأجيل في المواعيد النهائية. إنها نقلة نوعية للصناعات التي تتطلب أداءً ثابتًا وموثوقًا.
الميزات الأساسية لـ PREEMPT_RT: كيف يحقق لينكس الأداء في الوقت الحقيقي
شرح PREEMPT_RT: بناء وتحسين نواة لينكس للعمل في الوقت الحقيقي وبزمن استجابة منخفض للغاية
إس بي بي-آي تي بي-59إي1987
الميزات الأساسية لـ PREEMPT_RT
يركز PREEMPT_RT على أربع ميزات أساسية مصممة لتقليل التعليمات البرمجية غير القابلة للمقاطعة وتحسين التحكم في جدولة المهام. إليك نظرة أقرب على كل منها.
الاستباق الكامل للنواة
أحد أكبر التحديثات هو تحويل أقفال الدوران القياسية (spinlock_t) وأقفال القراءة والكتابة (rwlock_t) داخل أقفال الدوران الخاملة القائمة على mutex. قد تتسبب أقفال الدوران التقليدية في حدوث تأخيرات لأنها تعطل خاصية الاستباق، مما يجبر المهام على الانتظار النشط. يغير PREEMPT_RT هذا الوضع من خلال تقديم أقفال تسمح للمهام بالدخول في حالة سكون والتعرض للاستباق، حتى عند حجز مورد.
هذا يعني أن المهام ذات الأولوية العالية يمكنها مقاطعة المهام ذات الأولوية المنخفضة، حتى لو كانت المهام ذات الأولوية المنخفضة تحتفظ بالأقفال. ومع ذلك، بالنسبة لبعض العمليات الحرجة - مثل المجدول أو نقاط دخول الأجهزة - يحتفظ PREEMPT_RT raw_spinlock_t, وهو ما يشبه في سلوكه الأقفال الأصلية غير القابلة للمقاطعة. وكما يقول بول ماكيني، وهو مهندس متميز:
""تتمثل النقطة الرئيسية في تصحيح PREEMPT_RT في تقليل كمية كود النواة غير القابل للمقاطعة، مع تقليل كمية الكود الذي يجب تغييره لتوفير هذه الإمكانية الإضافية للمقاطعة.""
والآن، دعونا نرى كيف تستفيد معالجة المقاطعات من هذا النهج.
المقاطعات المترابطة
يقوم PREEMPT_RT بنقل معظم معالجات مقاطعات الأجهزة من سياق "IRQ الصلب" إلى خيوط النواة يتم التشغيل في سياق العملية. يسمح هذا التعديل بتحديد أولويات معالجات المقاطعات أو مقاطعتها أو حتى حظرها.
في نواة لينكس القياسية، قد يؤدي معالج المقاطعة طويل الأمد إلى زمن استجابة غير محدود لأنه يوقف جميع عمليات التنفيذ الأخرى. تعمل المقاطعات متعددة الخيوط على حل هذه المشكلة. بشكل افتراضي، تعمل خيوط المقاطعة هذه مع جدولة FIFO الأولوية 50، ولكن يمكن للمسؤولين تعديل أولوياتهم باستخدام أدوات مثل مخطط. على سبيل المثال، يمكنك إعطاء الأولوية لمقاطعة بطاقة الشبكة للتحكم الصناعي مع خفض أولوية عمليات الإدخال/الإخراج للقرص. وبما أن هذه العمليات تستخدم أقفال الدوران الخاملة بدلاً من أقفال الدوران المباشرة، فإنها تتجنب الحاجة إلى تعطيل مقاطعات الأجهزة أثناء الاحتفاظ بالقفل.
والآن، دعونا نستكشف كيف يتعامل PREEMPT_RT مع التحديات المتعلقة بالأولوية.
التوريث ذو الأولوية و Rtmutex
انعكاس الأولوية تُعدّ مشكلةً رئيسيةً تتمثل في تعطل مهمة ذات أولوية عالية في انتظار مورد تحتفظ به مهمة ذات أولوية منخفضة، بينما تقوم مهمة ذات أولوية متوسطة (لا تحتاج إلى المورد) بمقاطعة المهمة ذات الأولوية المنخفضة. تعالج PREEMPT_RT هذه المشكلة من خلال أولوية الميراث, ، مما يؤدي مؤقتًا إلى رفع أولوية المهمة ذات الأولوية المنخفضة لتتوافق مع المهمة ذات الأولوية الأعلى التي تنتظر المورد.
ال rtmutex تُعدّ أداة primitive هي التي تُتيح ذلك. فهي تضمن أنه عند حدوث تعارض، تحصل المهمة ذات الأولوية المنخفضة على دفعة أولوية لإنهاء قسمها الحرج دون تداخل من المهام ذات الأولوية المتوسطة. إذا تعطلت المهمة ذات الأولوية المرتفعة بسبب قفل آخر، فإن زيادة الأولوية تنتقل تباعًا عبر سلسلة التبعيات. كما هو موضح في وثائق نواة لينكس:
""تسمح خاصية وراثة الأولوية للتطبيقات المصممة جيدًا باستخدام أقفال مساحة المستخدم في الأجزاء الحرجة من سلسلة العمليات ذات الأولوية العالية، دون فقدان الحتمية.""
ولتحقيق ذلك،, rtmutex يستخدم علامة وشجرة مرتبة حسب الأولوية لإدارة المهام المنتظرة، مما يحافظ على انخفاض الحمل الزائد على البنى المدعومة.
وأخيرًا، دعونا نلقي نظرة على كيفية تحسين PREEMPT_RT لعمليات RCU.
RCU (قراءة-نسخ-تحديث) قابل للمقاطعة

تُعدّ تقنية القراءة والنسخ والتحديث (RCU) أسلوبًا للمزامنة يُستخدم على نطاق واسع في نواة لينكس. في النوى القياسية، تكون أقسام القراءة في تقنية RCU غير قابلة للمقاطعة، مما قد يؤدي إلى تأخيرات غير متوقعة. يُغيّر PREEMPT_RT هذا الوضع بجعل أقسام القراءة في تقنية RCU غير قابلة للمقاطعة. قابل للمقاطعة بالكامل, ويضمن ذلك عدم المساس بمواعيد تسليم المهام في الوقت الفعلي. ويُعد هذا التعديل حجر الزاوية في تحقيق السلوك المتوقع المطلوب في أنظمة الوقت الفعلي.
كيفية تكوين واستخدام PREEMPT_RT
تم دمج PREEMPT_RT بالكامل في نواة لينكس الرئيسية، مما يعني عدم الحاجة إلى تصحيحات خارجية. مع ذلك، يُنصح بتطبيق أحدث التصحيحات لتحسين دعم البنية وتحسين الرسومات. بمجرد أن تصبح النواة جاهزة، ستحتاج إلى ضبط إعداداتها للاستفادة الكاملة من إمكانياتها.
إعدادات تكوين النواة
لتمكين نواة قابلة للمقاطعة بالكامل، قم بتشغيل CONFIG_PREEMPT_RT. في النواة الأحدث، يوجد هذا الإعداد ضمن "الإعدادات العامة"، ولكن قد تحتاج إلى تفعيله. خبير التكوين أولاً، اجعله مرئياً في قائمة الإعدادات.
للإنتاج تحديد الخوادم وفي بيئات الأداء العالي الأخرى، يمكن لخيارات إضافية أن تعمل على تحسين الأداء بشكل أكبر:
CONFIG_NO_HZ_FULL: يقلل من مقاطعات ساعة الجدولة على وحدات المعالجة المركزية المشغولة، مما يساعد على تقليل الارتعاش.CONFIG_RCU_BOOSTيمنع قارئات RCU التي تم إيقافها مسبقًا من تأخير فترات السماح.CONFIG_RCU_NOCB_CPU: يقوم بتفويض معالجة استدعاءات RCU إلى وحدات معالجة مركزية محددة، مما يقلل من التداخل مع المهام في الوقت الحقيقي.
من الضروري أيضًا تعطيل خيارات تصحيح الأخطاء التي قد تُسبب زمن استجابة مرتفعًا. قم بإيقاف تشغيل إعدادات مثل CONFIG_DEBUG_LOCKDEP, CONFIG_DEBUG_PREEMPT, كائنات تصحيح الأخطاء في التكوين، و CONFIG_SLUB_DEBUG. على الرغم من أن هذه الأدوات مفيدة للتطوير، إلا أنها قد تؤثر سلبًا بشكل كبير على أهداف زمن الاستجابة. كما يوضح موقع kernelconfig.io:
""يحول هذا الخيار النواة إلى نواة تعمل في الوقت الحقيقي عن طريق استبدال العديد من أدوات القفل (أقفال الدوران، وأقفال القراءة والكتابة، وما إلى ذلك) بمتغيرات قابلة للمقاطعة ومدركة لتوريث الأولوية.""
بعد بناء النواة وتشغيلها، تأكد من أن PREEMPT_RT نشط عن طريق تشغيل cat /sys/kernel/realtime. قيمة الإرجاع هي 1 يشير ذلك إلى النجاح. يمكنك أيضًا التحقق من خلال البحث عن "PREEMPT_RT" في مخرجات uname -a.
تصحيح الأخطاء وتحسين الأداء
يُعدّ ضبط النواة أمرًا ضروريًا لتحقيق الأداء الأمثل مع أحمال العمل في الوقت الفعلي. ومن المجالات الرئيسية التي يجب معالجتها ما يلي: آلية التحكم في معدل نقل البيانات في الوقت الفعلي, وهذا يخصص 50 مللي ثانية في الثانية للمهام غير الآنية افتراضيًا. إذا كان عبء العمل لديك آنيًا بالكامل، فيمكنك تعطيل هذه الآلية عن طريق كتابة -1 إلى /proc/sys/kernel/sched_rt_runtime_us. كما يشير جان ألتنبرغ، كبير مستشاري المصادر المفتوحة في OSADL:
""يمكن أن تؤدي مهمة الوقت الحقيقي "الجامحة" إلى حرمان النظام من الموارد. وكآلية حماية، يمكن تحديد وقت تشغيل مهام الوقت الحقيقي عن طريق تعيين قيمة بالمايكروثانية في /proc/sys/kernel/sched_rt_runtime_us."‘
لتحسين الحتمية، اعزل أنوية وحدة المعالجة المركزية المحددة باستخدام معلمات مثل isolcpus=2,3, rcu_nocbs=2,3, nohz_full=2,3, ، وضبط irqaffinity=0. وهذا يخصص تلك النوى حصريًا للمهام التي تتم في الوقت الفعلي.
لإدارة سلاسل المقاطعات، استخدم مخطط أداة. تعمل هذه الخيوط عادةً بإعدادات افتراضية. جدولة FIFO الأولوية هي 50، ولكن يمكنك تعديلها لتجنب التعارضات مع تطبيقك. على سبيل المثال، لتعيين أولوية مؤشر ترابط مقاطعة بطاقة الشبكة إلى 98، استخدم الأمر التالي: chrt -p -f 98.
بعد إتمام عملية التهيئة، من الضروري اختبار أداء زمن الاستجابة والتحقق منه. أدوات مثل اختبار دوري يمكن قياس زمن الاستجابة (على سبيل المثال،, اختبار دوري -S -m -p98 -i250)، بينما rtla تساعد أدوات تحليل لينكس في الوقت الفعلي على تحديد وتحليل ارتفاعات زمن الاستجابة. وتضمن هذه الأدوات أن يلبي إعدادك متطلبات التطبيقات التي تعمل في الوقت الفعلي.
تطبيقات وفوائد PREEMPT_RT
حالات استخدام التطبيقات في الوقت الفعلي
تتألق تقنية PREEMPT_RT في الأنظمة التي لا مجال فيها للتنازل عن دقة التوقيت. الفضاء الجوي, فهو يضمن تشغيل أنظمة الملاحة والتحكم في الطيران دون تأخيرات تصل إلى أجزاء من الثانية، والتي قد تعرض السلامة للخطر في حال عدم القيام بذلك. الاتصالات السلكية واللاسلكية تعتمد الشركات عليه لإدارة توجيه البيانات في الوقت الفعلي، مما يضمن سلاسة المكالمات الصوتية والمرئية عن طريق القضاء على التذبذب وارتفاعات زمن الاستجابة.
في صناعة السيارات, إنها حجر الزاوية لأنظمة التحكم في المركبات، حيث تدعم شركات كبرى مثل كونتيننتال أوتوموتيف اعتمادها. الأتمتة الصناعية, ، يقوم PREEMPT_RT بتشغيل وحدات التحكم المنطقية القابلة للبرمجة (PLCs) وأنظمة SCADA، وغالبًا ما يعمل جنبًا إلى جنب مع بروتوكولات مثل EtherCAT للحفاظ على السلامة والكفاءة في أرضيات المصانع. الروبوتات كما يعتمد بشكل كبير على هذه التقنية للتحكم الدقيق في المشغلات والتغذية الراجعة الفورية من المستشعرات، مما يُمكّن الروبوتات من الاستجابة الفورية للتغيرات البيئية.
لعل أهم التطبيقات تكمن في الأجهزة الطبية, حيث الدقة هي الأهم. من أجهزة مراقبة المرضى إلى الروبوتات الجراحية، يوفر نظام PREEMPT_RT الأداء الحتمي اللازم لضمان عمل الأنظمة الحيوية بشكل مثالي.
مزايا بيئات الاستضافة
تمتد مزايا PREEMPT_RT إلى بيئات الاستضافة، حيث تُعد الاستجابة في الوقت الفعلي بنفس القدر من الأهمية. VPS والخوادم المخصصة, يقلل هذا النظام من زمن الاستجابة من خلال السماح للمُجدوِل بإعطاء الأولوية للمهام ذات الأولوية العالية على حساب المهام الأقل أهمية. وهذا يضمن أوقات استجابة ثابتة، مما يؤثر بشكل مباشر على تجربة المستخدم وموثوقية الخدمة.
يمنع نموذج المقاطعات المتعددة "عواصف المقاطعات" من إغراق الأنظمة أثناء عمليات الإدخال/الإخراج المكثفة. rt_mutex, يضمن توريث الأولوية عدم حجب مهام الخلفية ذات الأولوية المنخفضة لخدمات الاستضافة الحيوية. وتتيح المؤقتات عالية الدقة جدولة دقيقة تصل إلى مستوى الميكروثانية، مما يقلل من التذبذب في الإعدادات الافتراضية. ومزودو خدمات الاستضافة، مثل Serverion, توفر هذه الميزة إصدارات مخصصة لنواة النظام مع PREEMPT_RT، مما يمنح المسؤولين المرونة اللازمة لضبط الإعدادات بدقة لتناسب أحمال العمل المحددة. وذلك باستخدام معلمات مثل isolcpus و irqaffinity, يمكن لمقدمي الخدمات تخصيص أنوية وحدة المعالجة المركزية للمهام ذات الأهمية البالغة للأداء مع الحفاظ على عمليات النظام الروتينية معزولة.
خاتمة
لقد تعمق هذا الدليل في كيفية PREEMPT_RT يحوّل هذا النظام لينكس إلى نظام تشغيل في الوقت الحقيقي بمنح المجدول تحكمًا شبه كامل. ومنذ إدراجه في النواة الرئيسية بدءًا من لينكس 6.12 (سبتمبر 2024)، فقد ألغى الحاجة إلى تصحيحات خارجية عبر بنى معمارية مثل x86 وARM64 وRISC-V.
المفهوم بسيط: تقليل التعليمات البرمجية غير القابلة للمقاطعة قدر الإمكان. من خلال تحويل أقفال الدوران إلى أقفال سكون وتشغيل معالجات المقاطعات كخيوط، يمكن للمهام ذات الأولوية العالية مقاطعة جميع أنشطة النواة تقريبًا. تمنع ميزات مثل وراثة الأولوية المهام ذات الأولوية المنخفضة من تأخير العمليات الحرجة، بينما يضمن RCU القابل للمقاطعة عدم تسبب حتى الأقسام الحرجة في جانب القراءة في تأخيرات كبيرة. سيباستيان سيور, يقول القائم على صيانة PREEMPT_RT بشكل مناسب:
""كل التحكم للمُجدول.""
تُقدّم هذه القفزة التقنية فوائد عملية. على سبيل المثال،, Serverion يستخدم إصدارات نواة PREEMPT_RT المخصصة لضبط عزل وحدة المعالجة المركزية وتحسين أحمال العمل في الوقت الحقيقي، مما يضمن أوقات استجابة مستقرة حتى في ظل ضغط الإدخال/الإخراج المكثف.
ما يُميّز أنظمة الوقت الحقيقي ليس السرعة فحسب، بل القدرة على التنبؤ. تعمل تقنية PREEMPT_RT على تقليل التذبذب، مما يضمن تنفيذ المهام بدقة عند الحاجة. وهذا أمر بالغ الأهمية لتطبيقات مثل الأتمتة الصناعية، والاتصالات، وخدمات الاستضافة الحساسة للأداء. فهي توفر سلوكًا حتميًا لا تستطيع أنوية النظام القياسية توفيره.
بفضل دمجها في نواة النظام الرئيسية ودعمها من توزيعات المؤسسات مثل أوبونتو برو (منذ فبراير 2023)، أصبح برنامج PREEMPT_RT أكثر سهولة في الاستخدام لمزودي خدمات الاستضافة ومديري الأنظمة. فهو يوفر الأداء الموثوق به والمنخفض زمن الاستجابة المطلوب للبيئات الأكثر تطلبًا وحساسية للوقت في الوقت الحالي.
الأسئلة الشائعة
هل أحتاج إلى PREEMPT_RT أم أن نظام لينكس القياسي كافٍ؟
عند دمج نواة لينكس القياسية مع رقعة PREEMPT_RT, يكتسب هذا النظام إمكانيات معالجة البيانات في الوقت الفعلي، مما يجعله خيارًا قويًا للتطبيقات التي تتطلب زمن استجابة منخفضًا وثابتًا. مع ذلك، قد لا يفي نظام لينكس الأساسي وحده بمتطلبات الوقت الفعلي الصارمة.
هل سيؤدي PREEMPT_RT إلى تقليل الإنتاجية الإجمالية على نظامي؟
لتحقيق الأداء في الوقت الفعلي،, PREEMPT_RT يركز هذا النهج على تقليل شيفرة النواة غير القابلة للمقاطعة، مما يُحسّن استجابة النظام. قد يؤدي هذا النهج إلى انخفاض طفيف في الإنتاجية الإجمالية، ولكنه يضمن سلوكًا متسقًا وقابلًا للتنبؤ، وهو أمر بالغ الأهمية للتطبيقات الحساسة للوقت. هذه المفاضلة مقصودة وأساسية لتلبية متطلبات أنظمة الوقت الحقيقي.
ما هو هدف زمن الاستجابة الواقعي مع PREEMPT_RT؟
مع PREEMPT_RT, يُعدّ تحقيق زمن استجابة في نطاق المللي ثانية هدفًا واقعيًا لأنظمة سطح المكتب والأنظمة المدمجة على حدٍ سواء. مع ذلك، يعتمد الأداء الفعلي بشكل كبير على مدى جودة تهيئة النظام وضبطه لتلبية متطلبات محددة. ويُعدّ الإعداد السليم أساسيًا لضمان مستوى الاستجابة المطلوب.