نظام تشغيل في الوقت الحقيقي

نظام التشغيل في الوقت الحقيقي ( RTOS ) هو نظام تشغيل مصمم لتطبيقات الحوسبة في الوقت الحقيقي، ويعالج البيانات والأحداث التي تخضع لقيود زمنية محددة بدقة. يستهدف نظام التشغيل في الوقت الحقيقي بشكل أساسي الأجهزة ذات الموارد المحدودة، مثل المتحكمات الدقيقة . وهو يختلف عن نظام التشغيل الذي يعتمد على مشاركة الوقت ، مثل يونكس ، والذي يدير مشاركة موارد النظام باستخدام مُجدوِل، أو مخازن مؤقتة للبيانات، أو تحديد أولويات ثابتة للمهام في بيئات تعدد المهام أو تعدد البرامج. يجب أن تكتمل جميع العمليات بشكل قابل للتحقق ضمن قيود الوقت والموارد المحددة، وإلا سيفشل نظام التشغيل في الوقت الحقيقي تلقائيًا . أنظمة التشغيل في الوقت الحقيقي مدفوعة بالأحداث وقابلة للاستباق ، مما يعني أن نظام التشغيل يمكنه مراقبة أولوية المهام المتنافسة، وإجراء تغييرات على أولوية كل مهمة.

صفات

من الخصائص الرئيسية لأنظمة التشغيل في الوقت الحقيقي (RTOS) مستوى اتساقها فيما يتعلق بالوقت اللازم لقبول مهمة تطبيق ما وإتمامها ؛ ويُطلق على هذا التباين اسم " التذبذب ". [ 1 ] لا يهدف التصميم الأساسي إلى تحقيق إنتاجية عالية ، بل إلى ضمان أداء مناسب، سواء كان أداءً مرنًا أو صارمًا . يُصنف نظام التشغيل في الوقت الحقيقي الذي يستطيع عادةً أو بشكل عام الالتزام بالموعد النهائي كنظام تشغيل مرن في الوقت الحقيقي، أما إذا كان قادرًا على الالتزام بالموعد النهائي بشكل حتمي، فيُصنف كنظام تشغيل صارم في الوقت الحقيقي. [ 2 ]

يتميز نظام التشغيل في الوقت الحقيقي (RTOS) بخوارزمية متقدمة للجدولة . تتيح مرونة المُجدولة تنسيقًا أوسع لأولويات العمليات على مستوى نظام الحاسوب، إلا أن نظام التشغيل في الوقت الحقيقي غالبًا ما يُخصص لمجموعة محدودة من التطبيقات. من العوامل الرئيسية في نظام التشغيل في الوقت الحقيقي تقليل زمن استجابة المقاطعات وتقليل زمن استجابة تبديل الخيوط ؛ ويُقيّم نظام التشغيل في الوقت الحقيقي بناءً على سرعة استجابته وقابليتها للتنبؤ أكثر من كمية العمل التي يُمكنه إنجازها في فترة زمنية محددة. [ 3 ]

فلسفات التصميم

أكثر التصاميم شيوعاً هي:

تُغيّر تصميمات المشاركة الزمنية المهام بشكل متكرر أكثر من اللازم، ولكنها توفر تعدد مهام أكثر سلاسة ، مما يعطي وهمًا بأن عملية أو مستخدمًا لديه الاستخدام الوحيد للآلة.

كانت تصميمات المعالجات المركزية المبكرة تتطلب دورات معالجة كثيرة للتبديل بين المهام، حيث لا تستطيع المعالجات خلالها القيام بأي شيء مفيد آخر. ولأن التبديل كان يستغرق وقتًا طويلاً، سعت أنظمة التشغيل المبكرة إلى تقليل إهدار وقت المعالجات عن طريق تجنب التبديل غير الضروري بين المهام.

الجدولة

في التصاميم النموذجية، تتكون المهمة من ثلاث حالات:

  1. تشغيل (تنفيذ على وحدة المعالجة المركزية)؛
  2. جاهز (جاهز للتنفيذ)؛
  3. محظور (في انتظار حدث، مثل عمليات الإدخال/الإخراج).

تكون معظم المهام معلقة أو جاهزة في أغلب الأوقات، لأنه عادةً لا يمكن تشغيل سوى مهمة واحدة في كل مرة لكل نواة معالج . يختلف عدد العناصر في قائمة الانتظار الجاهزة اختلافًا كبيرًا، اعتمادًا على عدد المهام التي يحتاج النظام إلى تنفيذها ونوع المجدول المستخدم. في الأنظمة البسيطة غير الاستباقية ولكنها لا تزال تدعم تعدد المهام، يتعين على المهمة التخلي عن وقتها على المعالج لمهام أخرى، مما قد يؤدي إلى زيادة عدد المهام الجاهزة للتنفيذ في قائمة الانتظار الجاهزة ( نقص الموارد ).

عادةً ما يتم تصميم بنية البيانات لقائمة الجاهزية في المجدول لتقليل أسوأ مدة زمنية يتم قضاؤها في القسم الحرج للمجدول، حيث يتم منع المقاطعة، وفي بعض الحالات يتم تعطيل جميع المقاطعات، ولكن اختيار بنية البيانات يعتمد أيضًا على الحد الأقصى لعدد المهام التي يمكن أن تكون في قائمة الجاهزية.

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

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

يُعرف زمن الاستجابة الحرج، والذي يُسمى أحيانًا زمن الاستعادة، بأنه الوقت اللازم لإضافة مهمة جديدة إلى قائمة الانتظار واستعادة حالة المهمة ذات الأولوية القصوى إلى وضع التشغيل. في نظام تشغيل الوقت الحقيقي المصمم جيدًا، تتطلب إضافة مهمة جديدة إلى قائمة الانتظار من 3 إلى 20 تعليمة، بينما تتطلب استعادة المهمة ذات الأولوية القصوى من 5 إلى 30 تعليمة.

في الأنظمة المتقدمة، تتشارك المهام الآنية موارد الحوسبة مع العديد من المهام غير الآنية، وقد تكون قائمة المهام الجاهزة طويلة جدًا. في مثل هذه الأنظمة، ستكون قائمة المهام الجاهزة المُنفذة كقائمة مرتبطة غير كافية.

الخوارزميات

بعض خوارزميات جدولة أنظمة التشغيل في الوقت الحقيقي (RTOS) الشائعة الاستخدام هي: [ 4 ]

التواصل بين المهام وتبادل الموارد

يُعد نظام التشغيل متعدد المهام، مثل يونكس، ضعيفًا في التعامل مع المهام الآنية. إذ يُعطي المُجدوِل أعلى أولوية للمهام الأقل استهلاكًا لموارد الحاسوب، ما يجعل ضمان حصول المهام الحساسة للوقت على موارد كافية أمرًا مستحيلاً. يجب على أنظمة تعدد المهام إدارة مشاركة البيانات وموارد الأجهزة بين مهام متعددة. وعادةً ما يكون من غير الآمن أن تصل مهمتان إلى نفس البيانات أو موارد الأجهزة في الوقت نفسه. [ 5 ] توجد ثلاثة مناهج شائعة لحل هذه المشكلة:

إخفاء/تعطيل المقاطعات مؤقتًا

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

في الأنظمة أحادية المعالج، يُعد تشغيل تطبيق في وضع النواة مع إخفاء المقاطعات الطريقة الأقل تكلفة لمنع الوصول المتزامن إلى مورد مشترك. فبينما تكون المقاطعات مخفية ولا تُجري المهمة الحالية أي استدعاءات حجب لنظام التشغيل، فإنها تتمتع بالاستخدام الحصري لوحدة المعالجة المركزية، إذ لا يمكن لأي مهمة أو مقاطعة أخرى التحكم بها، وبالتالي تتم حماية القسم الحرج . عند خروج المهمة من قسمها الحرج، يجب عليها إلغاء إخفاء المقاطعات؛ وعندها تُنفذ المقاطعات المعلقة، إن وجدت. يُنصح بإخفاء المقاطعات مؤقتًا فقط عندما يكون أطول مسار عبر القسم الحرج أقصر من الحد الأقصى المطلوب لزمن استجابة المقاطعة . عادةً ما تُستخدم هذه الطريقة للحماية فقط عندما يتكون القسم الحرج من بضع تعليمات فقط ولا يحتوي على حلقات. تُعد هذه الطريقة مثالية لحماية سجلات البتات المُرتبطة بالأجهزة عندما تتحكم مهام مختلفة في هذه البتات.

التزامن المتبادل

عندما يكون من الضروري حجز مورد مشترك دون تعطيل جميع المهام الأخرى (مثل انتظار كتابة البيانات في ذاكرة الفلاش)، يُفضّل استخدام آليات متوفرة أيضًا في أنظمة التشغيل العامة، مثل التزامن المتبادل (mutex) والمراسلة بين العمليات التي يشرف عليها نظام التشغيل. تتضمن هذه الآليات استدعاءات النظام، وعادةً ما تستدعي رمز التوزيع الخاص بنظام التشغيل عند الخروج، لذا فهي تتطلب عادةً مئات من تعليمات وحدة المعالجة المركزية للتنفيذ، بينما قد تتطلب مقاطعات الإخفاء تعليمة واحدة فقط في بعض المعالجات.

يكون القفل المتبادل (غير التكراري) إما مغلقًا أو مفتوحًا. عندما تقفل مهمة ما القفل المتبادل، يجب على جميع المهام الأخرى انتظار فتحه من قِبل مالكه - الخيط الأصلي. يمكن للمهمة تحديد مهلة زمنية لانتظار القفل المتبادل. هناك العديد من المشاكل المعروفة في تصميمات الأقفال المتبادلة، مثل انعكاس الأولوية وحالات الجمود .

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

في حالة التعطل ، تقوم مهمتان أو أكثر بقفل مؤشر التزامن (mutex) دون مهلة زمنية، ثم تنتظران إلى الأبد مؤشر التزامن الخاص بالمهمة الأخرى، مما يُنشئ تبعية دائرية. أبسط سيناريو للتعطل يحدث عندما تقوم مهمتان بالتناوب بقفل مؤشري تزامن، ولكن بترتيب عكسي. يُمكن منع التعطل من خلال تصميم دقيق.

تمرير الرسائل

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

معالجات المقاطعات والمجدول

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

يحتفظ نظام التشغيل بقوائم للكائنات التي يديرها، مثل الخيوط، والأقفال، والذاكرة، وما إلى ذلك. يجب التحكم بدقة في تحديثات هذه القائمة. لهذا السبب، قد يُسبب استدعاء معالج المقاطعة لوظيفة من وظائف نظام التشغيل أثناء قيام التطبيق بذلك مشكلة. قد تجد وظيفة نظام التشغيل المُستدعاة من معالج المقاطعة قاعدة بيانات الكائنات في حالة غير متناسقة بسبب تحديث التطبيق. هناك نهجان رئيسيان للتعامل مع هذه المشكلة: البنية الموحدة والبنية المُجزأة. تحل أنظمة التشغيل في الوقت الحقيقي التي تُنفذ البنية الموحدة المشكلة ببساطة عن طريق تعطيل المقاطعات أثناء تحديث القائمة الداخلية. الجانب السلبي لهذا هو زيادة زمن استجابة المقاطعة، مما قد يؤدي إلى فقدان بعض المقاطعات. أما البنية المُجزأة، فلا تُجري استدعاءات مباشرة لنظام التشغيل، بل تُفوض العمل المتعلق بنظام التشغيل إلى معالج منفصل. يعمل هذا المعالج بأولوية أعلى من أي خيط، ولكن أقل من معالجات المقاطعات. ميزة هذه البنية هي أنها تُضيف دورات قليلة جدًا إلى زمن استجابة المقاطعة. ونتيجة لذلك، فإن أنظمة التشغيل التي تطبق البنية المجزأة تكون أكثر قابلية للتنبؤ ويمكنها التعامل مع معدلات مقاطعة أعلى مقارنة بالبنية الموحدة.

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

تخصيص الذاكرة

يُعد تخصيص الذاكرة أكثر أهمية في نظام التشغيل في الوقت الحقيقي مقارنة بأنظمة التشغيل الأخرى.

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

سبب آخر لتجنب تخصيص الذاكرة الديناميكي هو تجزئة الذاكرة. فمع التخصيص المتكرر لأجزاء صغيرة من الذاكرة وتحريرها، قد تنشأ حالة تُقسّم فيها الذاكرة المتاحة إلى عدة أقسام، ولا يستطيع نظام التشغيل في الوقت الحقيقي تخصيص كتلة ذاكرة متصلة كبيرة بما يكفي، على الرغم من وجود مساحة كافية من الذاكرة الحرة. ثانيًا، تُعد سرعة التخصيص أمرًا بالغ الأهمية. إذ يقوم نظام تخصيص الذاكرة القياسي بفحص قائمة مرتبطة ذات طول غير محدد للعثور على كتلة ذاكرة حرة مناسبة، [ 6 ] وهو أمر غير مقبول في نظام التشغيل في الوقت الحقيقي، حيث يجب أن يتم تخصيص الذاكرة خلال فترة زمنية محددة.

نظراً لأن الأقراص الميكانيكية لها أوقات استجابة أطول بكثير وأكثر صعوبة في التنبؤ، فإن التبديل إلى ملفات القرص لا يُستخدم لنفس الأسباب التي تم ذكرها أعلاه فيما يتعلق بتخصيص ذاكرة الوصول العشوائي (RAM).

تعمل خوارزمية الكتل ذات الحجم الثابت البسيطة بشكل جيد للغاية بالنسبة للأنظمة المدمجة البسيطة نظرًا لانخفاض الحمل الزائد فيها.

تجريد الأجهزة

مع أن جميع أنظمة التشغيل في الوقت الحقيقي (RTOS) قادرة على العمل على المتحكمات الدقيقة التي تدعمها، فإن بعضها، مثل Zephyr، قادر على تجريد عدد من برامج تشغيل الأجهزة بشكل أكبر، مثل ذاكرة الفلاش الخارجية، وأجهزة I2C، أو الأجهزة الطرفية الداخلية كأوامر UART وأوضاع السكون. هذا يُغني المطورين عن إنشاء برامج التشغيل بأنفسهم، إذ تُوفّر لهم مجموعة من واجهات برمجة التطبيقات (APIs) لنقل برامج التشغيل غير المدعومة، بينما تكون برامج التشغيل المدعومة جاهزة للاستخدام مباشرةً في كود التطبيق.

انظر أيضاً

مراجع

  1. "زمن الاستجابة والارتعاش" . مؤرشف من الأصل بتاريخ 23-07-2011 . تم الاطلاع عليه بتاريخ 04-12-2010 .
  2. تانينباوم، أندرو (2008). أنظمة التشغيل الحديثة . أبر سادل ريفر، نيوجيرسي: بيرسون/برنتيس هول. ص 160. ISBN  978-0-13-600663-3.
  3. "مفاهيم أنظمة التشغيل في الوقت الحقيقي" . مؤرشف من الأصل بتاريخ 23-07-2011 . تم الاطلاع عليه بتاريخ 04-12-2010 .
  4. سامك، ميرو (23 مايو 2023). "برمجة الأنظمة المدمجة: نظام التشغيل في الوقت الحقيقي - ما هو الوقت الحقيقي؟" . Embedded.com . تم الاطلاع عليه في 13 سبتمبر 2023 .
  5. فرانر، رالف أ. (خريف 1984). "مستقبل يونكس على جهاز IBM PC" . بايت . ص 59-64 . 
  6. "CS 241، جامعة إلينوي" (PDF) .