Professional Documents
Culture Documents
Real Time Systems
Real Time Systems
Books
نظم الزمن الحقيقي
الدكتور أحمد وبي
هذا الكتاب منشور تحت رخصة المشاع المبدع – النسب للمؤلف – حظر االشتقاق ()CC– BY– ND 4.0
https://creativecommons.org/licenses/by-nd/4.0/legalcode.ar
يحق للمستخدم بموجب هذه الرخصة نسخ هذا الكتاب ومشاركته وإعادة نشره أو توزيعه بأية صيغة وبأية وسيلة للنشر وألية غاية تجارية
أو غير تجارية ،وذلك شريطة عدم التعديل على الكتاب وعدم االشتقاق منه وعلى أن ينسب للمؤلف األصلي على الشكل اآلتي حصرا:
أحمد وبي ،نظم الزمن الحقيقي ،من منشورات الجامعة االفتراضية السورية ،الجمهورية العربية السورية2018 ،
https://creativecommons.org/licenses/by-nd/4.0/legalcode
سنقدم في هذا الفصل المفاهيم األساسية والمصطلحات الالزمة لفهم ماهية نظم الزمن الحقيقي.
سنقدم كذلك بعض األمثلة الواقعية عنها ولمحة تاريخية عن تطورها.
يمكن نمذجة أي كينونة في الطبيعة على شكل نظام .عندما ال تكون التفاصيل الداخلية للنظام مهمة،
يمكن التعبير عنه على شكل صندوق أسود له عدة مداخل وعدة مخارج كما يلي:
نظام
تغلّف برمجيات النظام العتاد المادي وتؤ ّمن للتطبيقات البرمجية واجهة تخاطب مجردة تمكنها من
الوصول إلى خدمات العتاد المادي بسهولة .غالبا ً ما تج ّمع برمجيات النظام األساسية مثل مجدول
المهام schedulerوسواقات األجهزة device driversومدير الذاكرة memory
managerفي كتلة واحدة هي نظام التشغيل .operating system
أما التطبيقات البرمجية فهي مصممة لحل مشاكل محددة تهم المستخدم مثل حسابات الرواتب وإدارة
المستودعات وتصفح الويب و األلعاب وغيرها.
تمثّل المداخل في النظم الحاسوبية أقنية المعلومات الرقمية الواردة من األجهزة الحاسوبية
والبرمجيات األخرى .وهي تأتي غالبا ً من حساسات sensorsكالكاميرات والميكروفونات
1
وغيرها من األجهزة التي تولد معطيات رقمية digitalأو تمثيلية .analogأما مخارج النظم
وتحول إلى تمثيلية إلرسالها إلى أجهزة الخرج المختلفة
ّ الحاسوبية فهي على األغلب رقمية
كالشاشات والسماعات وغيرها كما هو مبين في الشكل التالي.
نظام
حاسوبي
بالنظر إلى النظام السابق ،نجد أن هناك تأخير زمني بين لحظة ورود المداخل (وتسمى أيضا ً
المحرضات )stimulusولحظة ظهور المخارج الموافقة لها (وتسمى أيضا ً اإلجابة
.)response
تعريف:
يدعى الزمن الفاصل بين لحظة ورود مداخل النظام ولحظة ظهور قيم الخرج على مخارجه بزمن
استجابة النظام.
تعريف:
نظام الزمن الحقيقي هو نظام يجب أن يحقق قيود صريحة (حدود محددة) على زمن االستجابة.
يمكن أن يؤدي عدم احترام هذه القيود لنتائج خطيرة ،أو حتى لفشل failureالنظام بالكامل.
ماذا يعني "فشل النظام"؟ في بعض الحاالت الخطيرة مثل فشل مكوك فضاء أو مفاعل نووي،
يظهر فشل النظام واضحا ً للعيان بنتائج كارثية مؤلمة .لكن في حاالت أخرى مثل آالت الصراف
اآللية ،Automatic teller machinesال يظهر مفهوم الفشل بوضوح.
تعريف:
الفشل failureهو عدم تمكن النظام من أداء مهمته حسب المواصفات المحددة له.
تعريف:
النظام الفاشل failed systemهو نظام ال يمكنه أن يحقق أحد أو بعض المتطلبات المذكورة في
دفتر شروطه.
2
توجد تعاريف أخرى لنظم الزمن الحقيقي تتفق كلها بضرورة تحقيق النظام لقيود زمنية لكي يكون
صحيحاً .على سبيل المثال ،يمكن تعريف نظام الزمن الحقيقي كما يلي:
تعريف:
نظام الزمن الحقيقي هو نظام تعتمد صحته منطقيا ً على من صحة مخارجه باإلضافة الحترامها
لقيودها الزمنية.
يمكن تقسيم نظم الزمن الحقيقي إلى نظم استجابة ألحداث Reactiveونظم مض َّمنة
.Embeddedتستجيب النظم من النوع األول ألحداث آتية من البيئة المحيطة بها ،مثل نظم
مراقبة الحريق التي تستجيب الرتفاع درجة الحرارة بتشغيل أجهزة اإلنذار واإلطفاء .أما النظم
المض ّمنة فهي نظم تحكم توجد في أنظمة أخرى ليست حاسوبية بالضرورة .على سبيل المثال ،يوجد
في معظم السيارات الحديثة نظم حاسوبية مض ّمنة تتحكم بحقن الوقود والكوابح وأكياس الهواء
airbagوغيرها .كذلك تحوي العديد من األجهزة المنزلية الحديثة على نظم مض ّمنة مثل أجهزة
التلفاز والغساالت اآللية وأجهزة الستيريو.
من البديهي أيضا ً أن النظم المعقدة كالطائرات وسفن الفضاء واآلالت الصناعية تحوي كلها على
نظم مض ّمنة .ينطبق شرط الزمن الحقيقي خصوصا ً على هذه النظم .ففي الطائرات مثالً ،يجب
معالجة المعطيات اآلتية من مقياس التسارع بدور محدد يعتمد على مواصفات الطائرة (كل 10
ميلي ثانية على سبيل المثال) .وإذا فشل النظام في ذلك ،فسيحصل على معلومات خاطئة عن موقع
وسرعة الطائرة ،مما يمكن أن يؤدي إلى انحرافها عن مسارها في أحسن األحوال ،أو تحطمها في
أسوأ األحوال .أما في المفاعالت النووية ،فتؤدي عدم االستجابة السريعة للمشاكل الحرارية إلى
تعطله أو انفجاره في أسوا األحوال .أخيراً ،يجب على نظام حجز التذاكر في شركة طيران
االستجابة لطلبات الزبائن خالل زمن معقول من وجهة نظر الزبائن ،وإال اعتبر نظاما ً غير عملي.
باختصار ،ليس من الضروري أن يستجيب نظام الزمن الحقيقي خالل زمن قصير ،يجب فقط أن
يكون له قيود زمنية محددة (أجزاء من الثانية أو عدة ساعات) يستجيب خاللها.
تعريف:
نظام الزمن الحقيقي الرخو soft real-time systemهو نظام تنقص أهمية األعمال التي
يؤديها إذا تعدى حدوده الزمنية ،لكن ال تصبح عدية القيمة تماماً.
تعريف:
نظام الزمن الحقيقي الصعب hard real-time systemهو نظام يؤدي تعديه لحدوده الزمنية
لنتائج كارثية وتوقف كامل للنظام ،حتى ولو حدث ذلك لمرة واحدة.
3
تعريف:
نظام الزمن الحقيقي القاسي firm real-time systemهو نظام ال يؤدي تعديه لحدوده الزمنية
لنتائج كارثية إذا حدث ذلك لعدد قليل من المرات .لكن إذا حصل ذلك لعدد أكبر من المرات،
سيؤدي لنتائج كارثية وتعطل كامل للنظام.
في الحقيقة ،يجب أن يُصنّف أي نظام عملي وفق أحد األصناف الثالث السابقة .يبين الجدول التالي
أمثلة عن نظم زمن حقيقي رخوة وصعبة وقاسية.
تصنيف نظام
الشرح النظام
الزمن الحقيقي
تعدي النظام لحدوده الزمنية ال يؤدي لنتائج رخو أجهزة الصراف اآللي ATM
كارثية بل يؤدي فقط ألداء متناقص للنظام
تعدي النظام لحدود القيادة الزمنية يجعل اآللة نظام التحكم المضمن بآلة قاسي
تخرج عن السيطرة وتخرب المحاصيل المفيدة مؤتمتة إلزالة األعشاب الضارة
بدالً من األعشاب الضارة
يمكن أن يؤدي عدم إطالق الصاروخ ضمن نظام التحكم بأسلحة طائرة صعب
الحد الزمني المحدد بعد الضغط على الزر إلى حيث يؤدي الضغط على زر
عدم إصابة الهدف وحدوث نتائج كارثية إلطالق صاروخ جو-جو
تجدر اإلشارة إلى أن الحدود الفاصلة بين األنواع الثالث السابقة ليست قاطعة تماما ً ويمكن لنظام أن
ينتقل من تصنيف آلخر في ظروف خاصة .على سبيل المثال ،إذا تعدى جهاز الصراف اآللي
حدوده الزمنية لعدد كبير من المرات ،سيؤدي ذلك إلى درجة عالية من عدم الرضا لدى الكثير من
زبائن المصرف وبالتالي تنخفض أرباح المصرف لخسارته لزبائنه مما يمكن أن يؤدي إلى إفالسه
بالكامل في أسوأ األحوال .هذا يدل على أنه يمكن أن يتغير تصنيف نظام زمن حقيقي حسب
الظروف الموضوع فيها.
سيدور معظم نقاشنا في هذا الكتاب حول نظم الزمن الحقيقي الصعبة hard real-time
.systemsلذلك ،سنستعمل المصطلح "نظام زمن حقيقي" ليدل على نظام زمن حقيقي صعب
ومض ّمن ما لم نحدد غير ذلك.
من المهم عند دراسة نظم الزمن الحقيقي أن نناقش ماهية الزمن ألن حدودها الزمنية deadlines
هي عمليا ً لحظات على محور الزمن .السؤال الذي يطرح نفسه هنا هو" :من أين تأتي الحدود
الزمنية وما الذي يحدد قيمها؟" يتعلق الجواب بالظواهر الفيزيائية التي يعتمد عليها نظام التحكم
المدروس .على سبيل المثال ،يجب تحديث الصورة 30مرة في الثانية في نظم العرض (كالشاشات
4
وأجهزة اإلسقاط) للحصول على صورة متحركة ذات جودة مقبولة ألن العين اإلنسانية في هذه
الحالة ال تحس بانقطاع الحركة بسبب دوام االنطباع الشبكي .إذا لم يحقق جهاز العرض هذه
السرعة ،تصبح حركة الصورة مقطعة .الظاهرة الفيزيائية التي يعتمد عليها النظام هنا هي العين
اإلنسانية .وفي نظم المالحة المختلفة ،يجب حساب تسارع الجسم المدروس (طائرة ،سيارة،
صاروخ )... ،بمعدل يعتمد على السرعة القصوى للجسم .لهذا فإن معدل حساب تسارع السيارة أقل
من معدل حساب سرعة الصاروخ ألن السرعة القصوى للسيارة أقل بكثير من السرعة القصوى
للصاروخ.
تعمل نظم الزمن الحقيقي في بعض الحاالت تحت قيود زمنية فرضتها متطلبات تخمينية أو غير
مهمة أصالً ،مما يجعل هذه القيود أقسى بكثير من الحاجة .لذلك فإنه من الضروري قبل تصميم أي
نظام زمن حقيقي دراسة القيود الزمنية التي تفرضها متطلبات النظام المهمة ومحاولة تخفيفها قدر
اإلمكان بما يناسب البيئة الفيزيائية التي يتحكم النظام بها.
من األمثلة األخرى على الحاالت التي تغير من التدفق التسلسلي للتنفيذ :استدعاء التوابع في اللغات
اإلجرائية مثل Cو باسكال وإنشاء األغراض objectsواستدعاء طرائقها methodsفي
اللغات الغرضية التوجه Object Oriented Languagesمثل C++و .Java
تعريف
أي شي يحدث ويؤدي لتغير عداد البرنامج بأسلوب غير تسلسلي (وهو ما نعتبره تغيرا ً في تدفق
البرنامج) يسمى "حدثاً" .event
عادة ما تتكون نظم الزمن الحقيقي من عدد من اإلجراءات Tasks or Jobsتعمل على التفرع
وكل منها يؤدي عمالً محدداً .يمكن أن تكون هذه اإلجراءات دورية Periodicأو غير دورية
5
( aperiodicتحدث استجابة لحدث ما) .على سبيل المثال ،اإلجراء الذي يقوم بالحفاظ على سرعة
الطائرة في الجو هو إجراء دوري يقوم دوريا ً بقراءة سرعة الطائرة الحالية ويحسب الفرق بينها
وبين السرعة المطلوب الحفاظ عليها ويرسل على أساسها أوامر التحكم لمحركات الطائرة .أما في
نظام مراقبة الحريق فيؤدي ارتفاع درجة الحرارة إلقالع إجراء إطفاء الحريق ،فهو إذا إجراء غير
دوري.
تعريف
لحظة اإلطالق Release timeإلجراء هي اللحظة التي يصبح فيها هذا اإلجراء جاهزا ً للتنفيذ
(بشكل دوري أو غير دوري).
غالبا ً ما تتعلق لحظة اإلطالق بمقاطعة interruptما .إما أن تكون هذه المقاطعة ناتجة عن مؤقت
دوري timerكما هو الحال في اإلجراءات الدورية ،أو أحداث محددة كارتفاع درجة الحرارة مثال ً
في نظام مراقبة الحريق.
تجدر اإلشارة إلى أننا نعتبر المؤقت الذي يولد نبضات منتظمة (كل 5ميلي ثانية على سبيل المثال)
حدثا ً غير متزامن .فعلى الرغم من أنه يمثّل حدثا ً دوريا ً (بافتراض أن المؤقت مثالي ودقيق تماما ً
وهو أمر مستحيل عملياً) ،فإن اللحظات التي سيولد فيها مقاطعة لتدفق تنفيذ البرنامج تخضع لعوامل
عديدة ال يمكن التنبؤ بها ،مثل اللحظة التي بدأ فيها المؤقت بالعمل نسبةً لبداية تنفيذ البرنامج وزمن
تأخير انتشار اإلشارة في النظام الحاسوبي نفسه وغيرها من العوامل .لذلك ال يمكن التنبؤ بلحظات
المقاطعة تلك.
ذكرنا سابقا ً أن األحداث التي ال تحدث بدور منتظم تسمى أحداثا ً غير دورية .aperiodicتسمى
األحداث الغير دورية والتي قلما تحدث باألحداث المتباعدة .sporadicيبين الجدول التالي ملخصا ً
لتصنيف األحداث وبعض األمثلة عليها.
متزامنة تعليمات برنامج في تعليمة قفز تقليدية، تعليمة قفز لمعالجة
حلقة ،إجراءات مجمع النفايات في االستثناءات (أخطاء
synchronous
مجدولة باستعمال اللغات الحديثة زمن التنفيذ)
6
مؤقت داخلي garbage exception or
collection traps
من المهم في أي نظام ،وخصوصا ً في النظم المض ّمنة ،أن يبقى النظام المتحكم به تحت سيطرة
نظام التحكم باستمرار .يمكن أن تحدث بعض الحاالت الخاصة التي يخرج فيها النظام المتحكم به
عن السيطرة .يجب على برنامج التحكم أن يتوقع هذه الحاالت ويتعامل معها ليعيد السيطرة على
النظام.
في أي نظام زمن حقيقي ،يحافظ برنامج التحكم على السيطرة إذا كان من الممكن التنبؤ بالحالة
التالية للنظام إذا أ ُعطينا حالته الحالية وقيم مداخله .أي أن هدفنا األساسي للحصول على نظام تحكم
صحيح هو توقع كل الظروف الممكنة وجعل النظام مستعدا ً للتصرف بشكل صحيح حين تحدث.
تعريف
نقول عن نظام أنه حتمي deterministicإذا كان من الممكن معرفة حالته وقيم مخارجه التالية
مهما كانت حالته وقيم مداخله الحالية.
تعريف
تعني حتمية األحداث event determinismأنه يمكن معرفة حالة وقيم مخارج النظام التالية
من أجل كل قيم ممكنة للمداخل التي تقدح triggerاألحداث .الحظ أن أي نظام حتمي هو حتمي
األحداث ،لكن العكس ليس صحيحا ً بالضرورة ،وإن كان من الصعب أن يكون النظام حتمي
األحداث ولكنه غير حتمي.
تعريف
يتصف النظام بالحتمية الزمانية temporal determinismإذا كان حتميا ً وكان زمن اإلستجابة
لكل حالة ممكنة من حاالته معروفاً.
من المفضل طبعا ً أن يتصف أي نظام تحكم بالحتمية ألن ذلك يضمن استجابته في أي وقت ومهما
كانت الظروف .وإذا اتصف بالحتمية الزمانية ،يضمن ذلك معرفة متى سيستجيب النظام ،وهذا
أقرب ما يكون لنظم الزمن الحقيقي.
7
-4 -1انشغالية المعالج CPU utilization
سنعرف اآلن مصطلحا ً هاما ً يستعمل لقياس أداء نظم الزمن الحقيقي .يقوم المعالج باستمرار بجلب
ّ
التعليمات من الذاكرة وفك ترميزها وتنفيذها طالما بقي مغذَّ ً
ى بالتيار الكهربائي .إما أن تكون هذه
التعليمات هي من تعليمات برنامج التحكم المفيدة ،أو تعليمات أقل أهمية ليس لها عالقة بالحدود
الزمنية للنظام (مثل تعليمات التفاعل مع المستخدم على سبيل المثال) ،أو تعليمات ( NOPوهي
تعليمة آلة ال يؤدي تنفيذها ألي نتائج وهي اختصار لـ .)No-Operationيدل قياس الزمن الذي
يقضيه المعالج في وضع الخمول ( Idleوهو عندما ينفذ المعالج تعليمات NOPفقط ألنه اليوجد
ما يقوم به) على مدى المعالجة في الزمن الحقيقي التي يتطلبها النظام.
تعريف
انشغالية المعالج ( CPU utilization )Uأو معامل تحميله الزمني time-loading factor
هي النسبة الزمنية التي ال يكون المعالج فيها في وضع الخمول.
ضل أن نقول عن نظام أنه ُمح َّم ٌل تحميالً زائدا ً إذا كانت قيمة Uأكبر من .100%من غير المف َّ
تكون انشغالية النظام عالية ،ألن أي تغيير أو إضافة لمهام جديدة يمكن أن تؤدي للتحميل الزائد.
كذلك فإن النظم ذات االنشغالية المنخفضة ليست بالضرورة جيدة ألنها تدل على سوء التصميم
الهندسي للنظام وأنه كان من الممكن تخفيض كلفة النظام باستعمال تجهيزات مادية أقل أداء وكلفة.
عادة ما تكون االنشغالية في النظم الحديثة حوالي ،50%بينما يمكن لبعض النظم التي ال يُتوقَّع
نموها أن تكون انشغاليها بحدود .80%على كل حال ،تُعتبَر القيمة األمثلية لالنشغالية في نظم
الزمن الحقيقي ذات المهام الدورية والمستقلة هي .70%يبين الجدول التالي بعض القيم الممكنة
لالنشغالية والحاالت النموذجية الموافقة لها.
8
النظم المض ّمنة قريبة من الخطر 70-82
يمكن حساب Uبجمع معامالت انشغاليات اإلجراءات الدورية وغير الدورية المشاركة .بفرض أن
النظام يحتوي على n ≥ 1إجراء دوري دور كل منها يساوي 𝑖𝑝 (وبالتالي يكون معدل تنفيذها
𝑖𝑝 .)𝑓𝑖 = 1/إذا علمنا أن زمن التنفيذ االعظمي التقديري (في أسوأ األحوال) لإلجراء iهو 𝑖𝑒،
سب معامل االنشغالية 𝑖𝑢 كما يلي:
يُح َ
𝑖𝑒
)(1.1 = 𝑖𝑢
𝑖𝑝
عادة ما يكون الحد الزمني deadlineلإلجراء الدوري رقم ( iونرمزه 𝑖𝑑) محدودا ً ببداية دوره
التالي .القيمة المنطقية العظمى لـ 𝑖𝑑 هي 𝑖𝑒 .يمكن أن تكون عملية تحديد قيمة 𝑖𝑒 قبل أو بعد تنفيذ
البرنامج صعبة جدا ً أو مستحيلة في بعض األحيان ،عندها نقدّر قيمتها تقديراً .في حال اإلجراءات
الغير دورية aperiodicوالمتباعدة ،sporadicنحسب 𝑖𝑢 بداللة الحالة األسوأ لزمن تنفيذها
والزمن الفاصل بين لحظات حدوثها.
9
خوارزميات وبنى معطيات لغات البرمجة
يجب االنتباه إلى عدة مشاكل يجب حلها عند تصميم وتحقيق نظم الزمن الحقيقي وتتضمن:
اختيار العتاد المادي والبرمجيات وإيجاد الحل األمثل بالكلفة األقل.
تحديد مواصفات النظام وتصميمه واختيار التمثيل األفضل لتصرفه الزمني.
فهم الفروق بين لغات البرمجة المختلفة ومدى مالءمتها لنظم الزمن الحقيقي.
تصميم النظام بحيث تكون وثوقيته وتحمله لألخطاء أكبر ما يمكن.
اختبار النظام بدقة.
االستفادة من تقنية النظم المفتوحة والمتوافقة قدر اإلمكان .النظام المفتوح هو مجموعة
مستقلة وقابلة للتوسع من التطبيقات التي تتعاون لتعمل كنظام متكامل .على سبيل المثال،
يُستع َمل حاليا ً عد ٌد من نسخ نظام التشغيل المفتوح لينوكس Linuxفي تطبيقات الزمن
الحقيقي .تُقاس التوافقية بمدى تحقيق النظام لمقاييس النظم المفتوحة مثل مقياس كوربا
CORBAلنظم الزمن الحقيقي.
قياس وتقدير أزمان االستجابة لإلجراءات ومحاولة تصغيرها قدر اإلمكان ،وإجراء تحليل
إلمكانية جدولة اإلجراءات ،أي إمكانية إيجاد ترتيب ما لجدولة اإلجراءات بحيث تحترم
جمعيها حدودها الزمنية .تدخل هذه الدراسة في نطاق نظرية الجدولة ،وهي جزء من
بحوث العمليات.
يمكن بالطبع استعمال التقانات الهندسية لنظم الزمن الحقيقي الصعبة hard real-timeلهندسة
األنواع األخرى من نظم الزمن الحقيقي للحصول على نظم أفضل وأكثر وثوقية ومتانة .هذه أحد
أسباب أهمية دراسة نظم الزمن الحقيقي.
10
-3أمثلة على نظم الزمن الحقيقي
إن نظم الزمن الحقيقي المض ّمنة متنوعة جدا ً وتوجد حتى في األلعاب واألجهزة المنزلية .يبين
الجدول التالي بعض العينات من نظم الزمن الحقيقي ومجاالت تطبيقاتها.
التطبيقات المجال
المالحة
الطيران
شاشات اإلظهار
األلعاب
تعدد الوسائط
نظم المحاكاة
جراحة الروبوتات
التصوير الطبي
المصاعد
النظم المدنية
السيارات
سنقدم فيما يلي تفصيالً لبعض األمثلة المذكورة في الجدول أعاله .ليس المقصود هنا إعطاء
توصيف صوري لهذه النظم ،بل توصيفها بطريقة تظهر أهمية نظم الزمن الحقيقي في حياتنا
العملية .سنناقش الحقا ً طريقة توصيف هذه النظم بطريقة دقيقة وصورية.
لنعتبر نظام القياس العطالي في الطائرة .يبين الشكل التالي الحركات الممكنة التي يمكن أن تقوم بها
الطائرة والتي يجب على النظام قياسها.
11
زيغ لف
انحدار
حسب مواصفات النظام ،ترسل تجهيزات خاصة نبضات مقياس التسارع على المحاور xو yو z
إلى برنامج التحكم كل 10ميلي ثانية .يحسب البرنامج تسارع الطائرة على المحاور الثالث،
باإلضافة إلى قيم اللف واالنحدار والزيغ الحالية للطائرة .يصل كذلك للبرنامج قيمة درجة الحرارة
كل ثانية .يجب عليه حساب شعاع السرعة اعتمادا ً على هذه المعطيات كل 40ميلي ثانية
وإظهارها للطيار.
لنناقش مثال آخر وهو نظام مراقبة لمفاعل نووي عليه التعامل مع ثالثة أحداث يُ َّدل عليها
بمقاطعات .يحدث الحدث األول عندما تكتشف نقاط المراقبة األمنية أي اختراق أمني للمفاعل .يحب
على النظام في هذه الحالة االستجابة خالل ثانية واحدة إلطالق أجهزة اإلنذار .يدل الحدث الثاني
واألهم على حدوث ارتفاع كبير لدرجة الحرارة في المفاعل ،ويجب االستجابة له خالل ميلي ثانية
واحدة فقط .أخيراً ،يجب تحديث شاشة اإلظهار 30مرة في الثانية.
المثال التالي هو نظام حجز التذاكر لشركة طيران .قررت إدارة الشركة أنه يجب أال يتجاوز زمن
االنتظار الكلي ألي عملية حجز 15ثانية حتى ال يؤدي ذلك إلى عدم رضا الزبائن .يجب كذلك أال
يسمح النظام بالحجز الزائد عن عدد المقاعد المتوفرة .يمكن لعدة وكالء أن يحاولوا الوصول إلى
قاعدة المعطيات في نفس الوقت لحجز نفس المقعد .لذلك يجب تزويد النظام بإمكانيات االتصال
والقفل الالزمة لذلك.
المثال األخير هو نظام تحكم بإشارات المرور على تقاطع طرق ترد إليه السيارات من أربعة
اتجاهات (شمال ،جنوب ،شرق وغرب) .يتحكم النظام بإشارات السيارات والمشاة ويتلقى
المعلومات من العالم الخارجي عن طريق حساسات تحت األرض لقياس معدل تدفق السيارات في
كل اتجاه ،باإلضافة إلى كاميرات المراقبة واألزرار التي يضغطها المشاة عند رغبتهم بقطع
الشارع .يجب على إشارات المرور أن تعمل بتزامن تام واالستجابة كذلك ألحداث غير متزامنة
مثل الضغط على زر المشاة ،وإال حدثت حوادث مميتة.
12
-4بعض المعتقدات الخاطئة المتعلقة بنظم الزمن الحقيقي
من المهم أن نذكر بعض المعتقدات الشائعة الخاطئة لفهم طبيعة نظم الزمن الحقيقي فهما ً كامالً.
نلخص فيما يلي هذه المعتقدات:
"نظم الزمن الحقيقي" هي من مرادفات "النظم السريعة" :يأتي هذا االعتقاد الخاطئ من
حقيقة أن العديد من نظم الزمن الحقيقي تتعامل حقا ً مع حدود زمنية من رتبة الميلي ثانية،
كما هو حال نظم المالحة الجوية .لكن هناك كذلك نظم زمن حقيقي أخرى بطيئة مثل نظام
حجز تذاكر الطيران .المهم في نظم الزمن الحقيقي هو النجاح في تحقيق الحدود الزمنية
وليس السرعة.
تحل خوارزمية الجدولة )Rate Monotonic( RMمشكلة الزمن الحقيقي :تعتبر هذه
الخوارزمية من أكثر خوارزميات جدولة اإلجراءات الدورية شهرة ً في أدبيات نظم الزمن
الحقيقي منذ عام .1970وهي بسيطة وتعطي عادة نتائج جيدة ،لكنها ليست دائما ً الحل
السحري لنظم الزمن الحقيقي .سندرس هذه الخوارزمية بالتفصيل في الفصول الالحقة.
هناك طرق عامة ومقبولة دائما ً لتصميم ووضع مواصفات نظم الزمن الحقيقي :ال توجد
لألسف مثل هذه الطرق وذلك لصعوبة إيجاد حلول عامة لكل الحاالت .يجب دراسة
وتصميم كل نظام على حدا حسب خصوصيته.
ال حاجة لبناء نظم تشغيل الزمن الحقيقي من الصفر وذلك لتوفر الكثير من الحلول
التجارية :صحيح أن هناك العديد من نظم تشغيل الزمن الحقيقي الشائعة ذات الكلفة
المقبولة ،لكنها ليس مناسبة لكل تطبيقات الزمن الحقيقي .نحتاج أحيانا ً لكتابة نظام تشغيل
مناسب لتطبيق محدد من الصفر ،أو تعديل نظام تشغيل جاهز ليتناسب مع خصوصية
التطبيق .كذلك فإن اختيار نظام التشغيل المناسب من بين النظم المتوفرة ليس باألمر
السهل.
تتعلق معظم دراسة نظم الزمن الحقيقي بدراسة نظرية الجدولة :غالبا ً ما تكون النتائج التي
يحصل عليها الباحثون في نظرية الجدولة غير عملية وليس لها قيمة كبيرة هندسيا ً .لذلك
سنناقش في هذا الكتاب الخوارزميات القابلة للتطبيق عمليا ً فقط.
13
-1 -5التطورات النظرية
إن معظم نظريات نظم الزمن الحقيقي مشتقة من نظريات فروع العلوم األخرى التي تعتمد عليها
والتي ذكرناها سابقاً ،وتأثرت بشكل خاص بالتطورات النظرية لبحوث العمليات التي حصلت في
نهاية األربعينيات ونظرية األرتال Queuing Theoryالتي تطورت في نهاية الخمسينيات.
تبلورت النتائج النظرية المتعلقة بوثوقية وتنبؤية predictabilityنظم الزمن الحقيقي في
الثمانينيات والتسعينيات من القرن العشرين .وجرت كذلك في هذه الفترة دراسة المشاكل المتعلقة
بنظم الزمن الحقيقي متعددة المعالجات .multiprocessing
من األمثلة األخرى على نظم الزمن الحقيقي المبكرة نجد النظام ،SABREوهو نظام حجز
للخطوط الجوية طورته الخطوط الجوية األمريكية عام .1959
لكن يستعمل عدد قليل فقط من المبرمجين لغة ADA-95اليوم ،بينما يستعمل األغلبية لغة Cأو
C++أو حتى Fortranولغة التجميع .يعود السبب على األغلب لتعقيد لغة ADA-95وعدم
توفر مترجمات لها على نظم التشغيل الشائعة .وفي اآلونة األخيرة ،ظهر توجه الستعمال لغات
البرمجة غرضية التوجه (باألخص جافا )JAVAفي نظم الزمن الحقيقي المض ّمنة .سنناقش لغات
البرمجة لنظم الزمن الحقيقي الحقا ً في فصل مستقل.
14
-4 -5نظم تشغيل الزمن الحقيقي التجارية
ص ّم َمت نظم تشغيل الزمن الحقيقي التجارية األولية للعمل على الحواسب العمالقة ُ
،mainframesمثل نظام Basic Executiveالذي طورته شركة IBMفي العام 1962
والذي يحقق العديد من خوارزميات الجدولة في الزمن الحقيقي .وفي العام ،1963صدر النظام
Basic Executive IIالذي سمح بأن تقيم برامج المستخدم والنظام على القرص.
ظهر بعد ذلك في السبعينيات حواسب أصغر minicomputersوأقل سعرا ً وانتشرت في الكثير
من األوساط الهندسية .ونتيجة لذلك ظهر عدد كبير من نظم تشغيل الزمن الحقيقي الهامة التي
طورتها نفس الشركات المنتجة لهذه الحواسيب ،مثل نظام (Real-time Multitasking )RSX
Executivesالذي طورته شركة ) Digital Equipment Corporation (DECلحواسبها
من نوع .PDP-11ومن األمثلة األخرى نظام RTEالذي طورته شركة Hewlett-Packard
لسلسة حواسيبها من نوع .HP 2000
في أواخر السبعينيات وأوائل الثمانينيات ،ظهرت نظم التشغيل المخصصة للمعالجات الصغرية
micro processorsمثل األنظمة RMX-80و MROS 68Kو VRTXوغيرها .خالل
العشرين سنة الماضية ،ظهر الكثير من نظم تشغيل الزمن الحقيقي واختفى العديد منها أيضا ً.
15
الفصل الثاني :نظم تشغيل الزمن الحقيقي
-1نواة نظام تشغيل الزمن الحقيقي
اإلجراء ( processويسمى أيضا ً ال َمه ّمة )taskهو برنامج قيد التنفيذ ،وهو الوحدة المنطقية التي
يجدولها نظام التشغيل .الجدولة schedulingهي عملية انتقاء اإلجراء الذي سيقوم المعالج بتنفيذه
في لحظة محددة من بين كل اإلجراءات الجاهزة للتنفيذ .يُمثَّل كل إجراء في نظام التشغيل ببنية
معطيات (تسجيلة )recordتحتوي على األقل على حالة اإلجراء الحالية (جاهز ،readyمج ّمد
،blockedفي حالة تنفيذ )... ،executingورقم تعريف لإلجراء ،identity number
بعض الواصفات األخرى (زمن التنفيذ الكلي )... ،ومجموعة المصادر (ملفات ،أجهزة )... ،التي
يحجزها هذا اإلجراء.
يجب على نظام تشغيل الزمن الحقيقي أن يؤ ّمن ثالثة خدمات لإلجراءات :الجدولة scheduling
والتوزيع dispatchingواالتصال والتزامن بين اإلجراءات intercommunication and
.synchronizationنواة نظام التشغيل kernelهي الجزء األصغر من نظام التشغيل الذي
يؤمن هذه المهام الثالث .كما ذكرنا سابقاً ،يحدد المجدول schedulerاإلجراء الذي سينفذ في
نظام تشغيل متعدد المهام ،multitaskingبينما يقوم الموزع dispatcherبالعمليات التنظيمية
الالزمة لتنفيذ هذا اإلجراء .أخيراً ،يضمن الجزء الثالث أن اإلجراءات تتعاون وتتواصل فيما بينها.
يبين الشكل التالي طبقات نظام التشغيل المختلفة والمهام التي تقوم بها.
المستخدم
العتاد المادي
تؤمن النانو-نواة مهمة إدارة النياسب فقط ،بينما تهتم النواة الصغرية بجدولة اإلجراءات .تؤمن
النواة عمليات التزامن واالتصال بين اإلجراءات باستعمال العالمات semaphoreوصناديق
16
البريد mailboxesوغيرها من الطرق األخرى .الجزء "التنفيذي" Executiveمن نظام تشغيل
الزمن الحقيقي هو نواة تتضمن عمليات إدارة كتل الذاكرة وأجهزة الدخل/خرج وغيرها من
العمليات المعقدة .معظم أنظمة تشغيل الزمن الحقيقي التجارية هي فقط هذا الجزء "التنفيذي" وال
تتضمن الطبقات األدنى .أخيراً ،تؤمن طبقة نظام التشغيل األعلى واجهات التخاطب مع المستخدم
واألمن وإدارة الملفات وغيرها.
مهما كان بنيان نظام التشغيل المستعمل ،يبقى الهدف األساسي منه هي تلبية متطلبات الزمن
الحقيقي وتأمين بيئة عمل متعددة المهام متينة ومرنة.
على سبيل المثال ،نفترض أننا بحاجة لنظام برمجي لمعالجة حزم packetsمن المعطيات بمعدل
ال يزيد عن حزمة واحدة في الميلي الثانية .نفترض أنه لدينا عالم اسمه packet_hereتصبح
قيمته 1عندما يستلم كرت الشبكة حزمة من المعلومات .يبين البرنامج البسيط التالي حلقة استقصاء
مكتوبة بلغة Cيتعامل مع حزم المعطيات الواردة:
17
-2 -1 -1حلقة االستقصاء المتزامنة Synchronized polling loop
هذه الطريقة مشابهة للطريقة السابقة ،لكنها تضيف تأخيرا ً زمنيا ً بين لحظة االستجابة للحدث ولحظة
تصفير resetالعالم (أي قبل السطر "; "packet_here=0في المثال السابق) .يُستفاد من هذه
الخوارزمية لالستجابة لألحداث التي تتصف بما يسمى "بارتداد المفتاح" .switch bounce
تحدث هذه الظاهرة عندما يكون مسبب الحدث مفتاحا ً ميكانيكيا ً أو كهربائيا ً ،ألنه من المستحيل صنع
مفتاح يغير حالته لحظيا ً دون اهتزاز لتماساته .يبين الشكل التالي مخططا ً زمنيا ً لمفتاح لحظة إغالق
تماساته .يظهر جليا ً من المخطط أن اهتزاز تماسات المفتاح سبب عدة األحداث متتالية ،األول منها
حدث في اللحظة 𝑡0وهو صحيح واألحداث التالية التي حدثت في اللحظات 𝑡1و 𝑡2هي خاطئة.
عند إضافة تأخير زمني كاف (أكبر من الفرق الزمني بين 𝑡0و )𝑡2قبل تصفير عالم الحدث ،لن
تسبب األحداث الخاطئة استجابات من النظام ألنه يكون عندها في حالة انتظار انقضاء فترة التأخير
الزمني.
الزمن
إغالق المفتاح
على سبيل المثال ،إذا فرضنا أن ارتداد المفتاح يزول بعد 20ميلي ثانية ،يمثّل البرنامج التالي
المكتوب بلغة Cحلقة استقصاء متزامنة مناسبة له .تعليمة ) pause(20هي استدعاء لخدمة من
نظام التشغيل تج ّمد تنفيذ البرنامج لمدة 20ميلي ثانية.
18
}
}
تتميز حلقات االستقصاء بأنها مناسبة جدا ً لالستجابة ألقنية المعطيات السريعة ،وخاصة عندما
تحدث األحداث بلحظات غير منتظمة ويكون المعالج مخصصا ً لمعالجتها فقط .لكنها غير كافية
عندما يكون النظام معقداً ،وهي تضيع الكثير من وقت المعالج وخصوصا ً عندما تكون األحداث
قليلة الحدوث.
}
موزع بالتساوي على جميع اإلجراءات ألنه يدور عليهم ّ نالحظ في هذا المثال أن زمن المعالج
الدوار" .round-robinيمكن بسهولة تعديل الحلقة السابقة إلعطاء إجراءات بأسلوب "الشريط ّ
محددة أزمان تنفيذ أكبر (وبالتالي أولوية وسرعة استجابة أكبر) كما هو مبين في المثال التالي الذي
يعطي اإلجراء Process_3زمن تنفيذ يساوي ضعف زمن تنفيذ اإلجراءات األخرى.
19
;)(check_for_keypressed
;)(move_aliens
;)(check_for_keypressed
;)(check_for_collision
;)(check_for_keypressed
;)(update_screen
}
الحظ أن اإلجراء )( check_for_keypressedالذي يخدّم لوحة المفاتيح قد استدعي ثالثة
مرات ضمن الحلقة ،وهو بالتالي يُنفَّذ بمعدل أكبر بثالثة مرات من باقي اإلجراءات .السبب في ذلك
هو أنه من الضروري أن يستجيب النظام بسرعة لضغطات الالعب على لوحة المفاتيح .إذا كانت
اإلجراءات السابقة قصيرة نسبيا ً ومتجانسة الطول ،نحصل على انطباع أنها تعمل على ا ّ
لتفرع دون
الحاجة للمقاطعات .interruptsلكن هذا األسلوب مناسب فقط لنظم الزمن الحقيقي البسيطة فقط
بسبب صعوبة تقسيم النظام إلى إجراءات متقاربة الطول باإلضافة إلى أزمان التأخير التي يمكن أن
تصبح طويلة في بعض الحاالت.
على سبيل المثال ،تخيّل اإلجراء الذي يحقق بروتوكول اتصال ما (مثل FTPأو )... POP3من
ناحية المخدّم .يمكن تقسيم هذا اإلجراء بالطريقة المذكورة أعاله بسهولة كما يلي:
إذا كنا في حالة انتظار لورود اتصال ،وورد اتصال ،نرسل رسالة للزبون تسأله عن اسم
المستخدم وكلمة المرور ونصبح في حالة انتظار السم المستخدم وكلمة المرور.
إذا كنا في حالة انتظار السم المستخدم وكلمة المرور ،وورد للمخدم اسم مستخدم وكلمة
مرور صحيحتان ،نرسل للزبون رسالة ترحيب وننتقل لحالة انتظار ألوامر المستخدم.
إذا كنا في حالة انتظار السم المستخدم وكلمة المرور ،وورد للمخدم اسم مستخدم وكلمة
مرور غير صحيحتين ،نرسل للزبون رسالة تطلب منه إعادة المحاولة ونبقى في نفس
حالة انتظار اسم المستخدم وكلمة المرور (مع زيادة عداد المحاوالت الفاشلة) وهكذا .يمكن
االستمرار بهذا الشكل لتوصيف كامل إجراء المخدم باستعمال شروط وحاالت.
تسمح طريقة التقسيم هذه بتجميد إجراء ما لفترة مؤقتة دون اإلخالل بعمله (وذلك بتجميده بعد
االنتهاء من تنفيذ تعليمة ifالموافقة للحالة الحالية) .يس ّهل هذا األمر عملية تحقيق تعددية المهام
بأساليب مثل "الروتينات التعاونية" Co-routinesالتي سنراها في الفقرة التالية .كذلك ،تناسب
20
طريقة التقسيم هذه أسلوب "التنفيذي الدوري" عندما تكون اإلجراءات طويلة جدا ً أو متفاوتة
األطوال.
من ميزات هذه الطريقة أيضا ً أنها مبنية على فكرة األوتومات المنتهي .FSAتوجد طرق رياضية
خوارزمية ألمثلة optimizationاألوتومات ،وهناك أيضا ً العديد من الدراسات والنظريات التي
يمكن استعمالها للحصول على أفضل تصميم للنظام.
لكن ،ليست كل اإلجراءات مناسبة لهذه الطريقة ،حيث توجد بعض اإلجراءات ال تسمح طبيعتها بأن
سم لحاالت .كذلك ،يمكن أن يكون عدد الحاالت كبير جدا ً مع وجود عالقات بينها ،مما يعقّد كثيرا ً تق ّ
عملية تحقيقها برمجياً.
تتصل اإلجراءات فيما بينها باستعمال المتحوالت العامة ،global variablesوأية معلومات
يحتاج اإلجراء للحفاظ عليها من انتقاء آلخر (من ق َبل الموزع) يجب كذلك أن ّ
يخزن في متحوالت
عامة.
لنأخذ على سبيل المثال نظاما ً تعاونيا ً مكونا ً من إجرائين يعمالن "على التفرع" وبشكل مستقل .بعد
تنفيذ المرحلة phase_a1من اإلجراء ،process_aينتقل التنفيذ إلى الموزع المركزي (بسبب
تعليمة )returnالذي يستدعي process_bالذي يستدعي بدوره .phase_b1بعد االنتهاء من
،phase_b1ينتقل التنفيذ للموزع من جديد الذي يستدعي process_aالذي يستدعي بدوره
phase_a2وهكذا .يبين البرنامج التالي الشكل العام لإلجراءات process_aو
ّ
الموزع ال تظهر في هذا البرنامج ،لكنها بديهية. process_bبلغة .Cحلقة
{ ) ( void process_a
{ )switch(state_a
;) (case 1: phase_a1
21
;return
;) (case 2: phase_a2
;return
;) (case 3: phase_a3
;return
;) (case 4: phase_a4
;return
;) (case 5: phase_a5
;return
}
}
{ ) ( void process_b
{ )switch(state_b
;) (case 1: phase_b1
;return
;) (case 2: phase_b2
;return
;) (case 3: phase_b3
;return
;) (case 4: phase_b4
;return
;) (case 5: phase_b5
;return
}
}
المتحوالت state_aو state_bهي متحوالت حالة عامة لك ّل من اإلجرائين process_aو
process_bعلى الترتيب .يمكن بسهولة تعميم البرنامج السابق لجدولة nإجراء .يمكن كذلك
تعديل هذا األسلوب ليعمل مع إجراء ذي حلقة استقصاء .بذلك يمكن للمعالج القيام بأعمال أخرى
مفيدة (أي تنفيذ باقي اإلجراءات) بدالً من إضاعة وقته بانتظار حدوث الحدث .يجب طبعا ً في هذه
الحالة أن تتحول حلقة االستقصاء إلى فحص للعالم ثم االنتقال للموزع.
باختصار ،يُعتبَر أسلوب الروتينات التعاونية من أسهل خوارزميات الجدولة "العادلة" fairالتي
يمكن تحقيقها بسهولة .كذلك يمكن لعدة مبرمجين أن يتشاركوا بكتابة اإلجراءات وليس من
الضروري معرفة عدد اإلجراءات مسبقاً .أخيراً ،تملك بعض لغات البرمجة (مثل )ADAبن ً
ى
جاهزة لتحقيق الروتينات التعاونية بسهولة.
هناك العديد من نظم الزمن الحقيقي الضخمة التي جرى تحقيقها باستعمال الروتينات التعاونية ،مثل
نظام ) Customer Information Control System (CICSالذي طورته شركة IBM
22
لمعالجة المناقالت transactionالتي يقوم بها الزبائن ،ونظام OS/2 Presentation
المطور من نفس الشركة .لألسف ال يمكن استعمال هذا األسلوب إال مع اإلجراءات
َّ Manager
التي يمكنها أن تترك المعالج بفواصل منتظمة والتي يمكن تقسيمها ألجزاء منتظمة .كذلك فإن
طريقة االتصال الوحيدة المتاحة بين اإلجراءات هي باستعمال المتحوالت العامة ،وهو أمر غير
مرغوب به عموماً.
عند استعمال الجدولة بالمقاطعة المادية ،تولّد ساعة خارجية أو أي جهاز خارجي إشارات مقاطعة
تو َّجه إلى متحكم مقاطعات مخصص ،interrupt controllerالذي يقوم بدوره بتوجيهها إلى
المعالج حسب ترتيب ورودها وأولوياتها .إذا كان التصميم المادي للنظام (المعالج بشكل أساسي)
يدعم عدة مقاطعات ،عندها يقوم العتاد المادي أيضا ً بعملية التوزيع (أي استدعاء اإلجراء الموافق
للمقاطعة) .أما إذا دعم المعالج مقاطعة واحدة فقط ،عندها تصبح مسؤولية التوزيع ملقاة على عاتق
روتين تخديم المقاطعة وذلك بسؤال متحكم المقاطعات عن مصدر المقاطعة ثم القفز إلى اإلجراء
المسؤول عن تلبيتها.
سل إلى مقاطعات مادية :وهي إشارات تولّدها التجهيزات المحيطية peripheralsوتر َ
المعالج الذي يستجيب لها بتنفيذ روتين تخديم المقاطعة .ISRيتولى هذا الروتين (وهو
برنامج جزئي عادي) بالقيام بما يلزم لتلبية هذه المقاطعة .هذه المقاطعات هي الوسيلة التي
تم ّكن التجهيزات المحيطية من إخبار المعالج بحاجتها ألن يلتفت إليها لسبب ما (حدوث
خطأ ،إنتهاء عملية دخل/خرج.)... ،
مقاطعات برمجية :تشبه المقاطعات المادية ،لكن مصدر المقاطعة هو تعليمات خاصة
عى برمجياً .عادة ما يُستّعمل هذا النوع من المقاطعات الستدعاء الخدمات التي يقدمهاتُستد َ
نظام التشغيل (التي تكون على شكل روتينات تخديم هذه المقاطعات البرمجية).
23
يوجد في لغات البرمجة الحديثة مفهوما ً هاما ً هو "االستثناءات" exceptionsالتي تعتبَر بمثابة
مقاطعات برمجية داخلية (أي يولّدها المعالج داخلياً) عندما يحاول البرنامج تنفيذ عمليات غير
قانونية وغير متوقعة (مثل التقسيم على صفر أو محاولة فتح ملف غير موجود) .يقفز المعالج عند
حدوث االستثناء إلى روتين تخديم المقاطعة وينفّذ التعليمات الموافقة له.
توصف المقاطعات المادية بأنها ذات طبيعة غير متزامنة ،أي أنها يمكن أن تحدث في أية لحظة.
وعندما تحدث ،يتوقف تنفيذ البرنامج الذي كان المعالج ينفذه وينتقل التنفيذ (فورا ً أو بعد حين) إلى
مطور النظام عادة ً لكتابة ISRلبعض المقاطعات المادية، ّ روتين تخديم المقاطعة .ISRيحتاج
ومن المهم عندها أن يفهم جيدا ً م َّم تتألف حالة المعالج وما هي السجالت التي يجب على ISRأن
يحفظها.
عندما يتشارك أي برنامج مع روتين تخديم مقاطعة ما ببعض المصادر المشتركة ،فإن الطريقة
الوحيدة لتنسيق عملية الوصول إليها هي حجب المقاطعة قبل الوصول إليها في البرنامج وتأهيلها
من جديد بعد االنتهاء منها .السبب هو أنه ال يمكن استعمال طرق التزامن (أو المنع المتبادل
)mutual exclusionاألخرى داخل روتين تخديم المقاطعة ألن ذلك يمكن أن يسبب تجميده
لفترة طويلة وغير محدودة بانتظار تحرير المصدر ،وهذا أمر غير مرغوب فيه ألنه يمكن أن
يؤخر تلبية مقاطعات هامة لفترة غير محدودة .وعندما تكون المقاطعات محجوبة ،تصبح استجابة
النظام لألحداث الخارجية ضعيفة جداً .لذلك يجب أن يكون الجزء من البرنامج الذي يحجب
المقاطعات أقصر ما يمكن.
نقول عن ISRأنه "قابل إلعادة الدخول" reentrantإذا سمح بتلبية أي مقاطعة قبل أن ينتهي
تنفيذه (حتى ولو كانت المقاطعة الجديدة هي نفسها التي يقوم بتلبيتها حاليا ً لكن حدثت لسبب آخر).
مهما كان نوع المقاطعة (مادية أو برمجية) ،يجب على ISRتخزين حالة النظام (وهو ما يسمى
طع بعدبالسياق )contextقبل أن يقوم بعمله حتى يكون باإلمكان متابعة تنفيذ اإلجراء المقا َ
االنتهاء من تلبية المقاطعة.
تُح َفظ معلومات السياق عادة على مكدس النظام .system stackيؤثر الزمن الالزم لتبديل
السياق تأثيرا ً كبيرا ً على زمن استجابة النظام .لذلك ،يجب أن يكون أمثليا ً وأصغر ما يمكن .عادة ً ما
تتضمن معلومات السياق األمور التالية:
24
قيمة سجل عداد البرنامج .program counter
قيم سجالت المعالج الحسابي المساعد ( math coprocessorفي حال وجوده).
سجل صفحة الذاكرة.
مواقع الذاكرة التي تعنون تجهيزات دخل/خرج .memory-mapped I/O
عادةً ،يقوم روتين تخديم المقاطعة بتحجيب المقاطعات أثناء قيامه بتبديل السياق ألنها ت ُعتبَر عملية
حرجة يجب أن تتم دون مقاطعة ،ثم يفعّلها من جديد بعد االنتهاء من التبديل.
يُستع َمل أسلوب تخزين السياق على المكدس في النظم المض ّمنة على األغلب ،ألن عدد إجراءات
الزمن الحقيقي أو اإلجراءات المقادة باألحداث محدد في هذه النظم .عندما تحدث المقاطعة ،يستدعي
المعالج روتين تخديم المقاطعة المناسب الذي يقوم بحفظ سياق اإلجراء قيد التنفيذ على المكدس (أو
في منطقة محددة وساكنة في الذاكرة إذا كان النظام وحيد المقاطعة).
يبين شبه البرنامج التالي جزءا ً من نظام زمن حقيقي مكتوب بلغة .Cويتكون من برنامج رئيسي
يحوي حلقة whileفارغة وغير منتهية ،وثالثة روتينات تخديم مقاطعة تستعمل أسلوب تخزين
السياق على مكدس.
) (void main
/* initialize system, load interrupt handlers */
{
;) (init
;)while(TRUE /* infinite wait loop */
}
25
) (void int3 /* interrupt handler 3 */
{
;)save(context /* save context on stack */
;) (task3 /* execute task 3 */
;)restore(context /* restore context from stack */
}
يجب على اإلجرائية )( initأن تحفظ عناوين التوابع الثالث int1و int2و int3في مكان محدد
من الذاكرة اسمه شعاع المقاطعة .interrupt vectorعندما ترد مقاطعة إلى المعالج ،يستفهم
المعالج من متحكم المقاطعات عن مصدرها كما ذكرنا سابقاً ،ثم يستفيد من شعاع المقاطعة للقفز إلى
روتين تخديم المقاطعة الموافق لها .تقوم اإلجرائية )( saveبحفظ قيم السجالت الهامة على
المكدس ،بينما تقوم اإلجرائية )( restoreباسترجاعها منه.
يمكن أن تكون أولويات المقاطعات ساكنة أو ديناميكية (قابلة للتغيير) .النظم ذات المقاطعات الساكنة
أقل مرونة ألنه ال يمكن تغيير أولويات المقاطعات أثناء عمل النظام بما يتناسب مع تغير احتياجاته،
بينما يمكن عمل ذلك في النظم ذات المقاطعات الديناميكية.
تعاني نظم األولوية الشفعية من مشكلة استئثار اإلجراءات ذات األولوية األعلى بالمصادر المتاحة
في النظام ،مما يؤدي لحرمان اإلجراءات ذات األولوية األدنى منها .نقول في هذه الحالة أن
اإلجراءات ذات األولوية األقل تعاني من مشكلة "المجاعة" .starvation
هناك نوع خاص من نظم األولوية الشفعية المقادة بالمقاطعات تسمى النظم "رتيبة المعدّل" Rate
طى فيها األولوية ،Monotonicوهي تضم نظم الزمن الحقيقي ذات اإلجراءات الدورية التي يُع َ
األعلى لإلجراء الدوري الذي له أعلى معدل تنفيذ (أي يُنفَّذ عددا ً أكبر من المرات في الثانية) .هذا
األسلوب شائع في النظم المض ّمنة وخصوصا ً نظم الطيران ،وهناك الكثير من الدراسات حوله.
صل المعطيات من جهاز قياس لنأخذ على سبيل المثال نظام المالحة في الطائرة .اإلجراء الذي يح ّ
صل معطيات التسارع كل 10ميلي ثانية له أعلى أولوية .يأتي في الدرجة الثانية اإلجراء الذي يح ّ
26
التوازن كل 40ميلي ثانية .أما اإلجراء الذي يُظهر المعطيات على شاشة الطيار كل ثانية فله
األولوية األدنى .سندرس النظم الرتيبة المعدّل في الفقرات التالية بالتفصيل.
شفعية معهناك نوع آخر من النظم الهجينة موجود في نظم التشغيل التجارية وهو مزيج من النظم ال ُ
أسلوب الشريط الدوار .round-robinفي هذه النظم ،يمكن دائما ً لإلجراءات ذات األولوية
شفع preemptاإلجراءات ذات األولوية األدنى .لكن إذا وجد المجدول عدة األعلى أن تقوم ب ُ
إجراءات لها نفس األولوية وجاهزة للتنفيذ ،يقوم بجدولتها بطريقة الشريط الدوار التي سندرسها
الحقاً.
مقاطعة
البرنامج الرئيسي اإلجراء 1
مقاطعة
اإلجراء 2
27
شفعية أو النظم الهجينة .أماتعمل إجراءات الواجهة األمامية بطريقة الشريط الدوار أو األولوية ال ُ
إجراء الواجهة الخلفية فهو قابل ألن يشفع من قبل أي إجراء من الواجهة األمامية .لذلك فهو يمث ّل
اإلجراء ذو األولوية األدنى في النظام.
كل أنظمة الزمن الحقيقي هي حالة خاصة من هذا النوع من النظم .على سبيل المثال ،حلقة
االستقصاء هو نظام واجهة أمامية/واجهة خلفية دون واجهة أمامية (تمثّل حلقة االستقصاء الواجهة
الخلفية) .وإذا أضفنا المقاطعات ،نحصل على نظام واجهة أمامية/واجهة خلفية كامل .النظم المقادة
بالحالة هي أيضا ً نظم واجهة أمامية/واجهة خلفية ليس لها واجهة أمامية وحلقتها المقادة بالحالة هي
واجهتها الخلفية .الروتينات التعاونية هي أيضا ً حالة خاصة فيها إجراء خلفي معقّد فقط .أخيراً،
النظم المقادة بالمقاطعة هي أيضا ً نظم واجهة أمامية/واجهة خلفية ليس لها واجهة خلفية.
يمكن أيضا ُ وضع عمليات اختبار ذاتي منخفضة األولوية في إجراء الواجهة الخلفية .على سبيل
المثال ،يمكن في الكثير من األنظمة إجراء اختبار كامل لمجموعة تعليمات المعالج في الواجهة
الخلفية .هذا األمر يجعل النظام متينا ً وموثوقا ً جداً .أخيراً ،يمكن أن نضع في الواجهة الخلفية
عمليات تحديث لشاشات اإلظهار المنخفضة األولوية أو الطباعة على طابعة أو التخاطب مع أية
تجهيزات دخل/خرج بطيئة ومنخفضة األولوية.
-3 -4 -1التهيئة initialization
التهيئة هي الجزء األول من إجراء الواجهة الخلفية ،وتتضمن الخطوات التالية:
28
تأهيل المقاطعة من جديد
من المهم أن تُح َّجب المقاطعات في بداية عملية التهيئة ،ألن بعض النظم تقلع بمقاطعات مؤهلة بينما
لم تج َّهز األمور الضرورية الستقبال المقاطعات بعد ،مثل شعاع المقاطعة والمكدس .من المهم كذلك
إجراء اختبار ذاتي للنظام قبل تفعيل المقاطعات .بعدها ،يصبح النظام جاهزا ً للعمل.
لنأخذ على سبيل المثال حالة نظام فيه مقاطعة وحيدة ويحتوي على إجراء واجهة أمامية واحد
وإجراء الواجهة الخلفية .نفرض أن تعليمة EPIتفعّل المقاطعة وأن DPIتح ّجبها وأن المعالج
يح ّجب المقاطعة آليا ً عند حدوثها (ضمنيا ً دون استعمال )DPIإلى أن تُفعَّل صراحةً باستدعاء
.EPI
من أجل تحقيق عملية تبديل السياق ،يجب حفظ قيم سجالت المعالج الثمانية R1-R8على المكدس
من قبل إجراء الواجهة األمامية وذلك ألن إجراء الواجهة الخلفية يستعملها وال نريد أن تضيع قيمها
عند حدوث المقاطعة .سيعمل إجراء الواجهة األمامية حتى ينتهي ،لذلك ال حاجة لحفظ سياقه ألنه
ّ
مخزن في العنوان 5من الذاكرة (وهو طع .نفترض أخيرا ً أن عنوان روتين تخديم المقاطعة لن يُقا َ
شعاع المقاطعة).
إذا فرضنا أن reg0وحتى reg7تمثّل عناوين في الذاكرة نستعملها لحفظ قيم سجالت المعالج،
عندها يمكن أن نكتب روتين تخديم المقاطعة كما يلي:
29
STORE R6,®6 ; save register 6
STORE R7,®7 ; save register 7
توجد في العديد من المعالجات تعليمات خاصة مثل saveو restoreتقوم بحفظ واسترجاع قيم
جميع سجالت المعالج الهامة في مواقع متتالية من الذاكرة .الحظ أن روتين المقاطعة هذا ال يسمح
طع ألنه ال يعيد تفعيل المقاطعة حتى نهايته .إذا أردنا أن نسمح بقاطعة روتين المقاطعة،بأن يُقا َ
يجب استعمال مكدس لتخزين قيم سجالت المعالج بدالً من المواقع الساكنة reg0حتى .reg7
يمكن إلجراء الواجهة الخلفية أن يشمل استدعاءا ً لتابع التهيئة ،باإلضافة ألية عمليات معالجة غير
حرجة زمنياً .على سبيل المثال ،يبين البرنامج التالي المكتوب بلغة Cمثل هذا اإلجراء:
) ( void main
/*allocate space for context variable */
;int reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7
/*declare other global variables here */
{
;)(init /*initialize system */
)while (TRUE /*background loop */
background(); /* non-real-time processing here */
}
تتميز نظم الواجهة األمامية/الواجهة الخلفية عادة ً بزمن استجابة جيد ألنها تعتمد على العتاد المادي
لجدولة إجراءاتها ،وهي الخيار المفضل لدى الكثير من مصممي نظم الزمن الحقيقي المض ّمنة .لكن
توجد فيها نقطة ضعف أساسية وهي ضرورة كتابة الواجهات البرمجية المعقدة (سواقات األجهزة)
30
للكثير من األجهزة المحيطية يدوياً.هذا األمر صعب ومليء باألخطاء والمشاكل .باإلضافة إلى ذلك،
يناسب هذا النوع من النظم التطبيقات التي يكون فيها عدد إجراءات الواجهة األمامية ثابتا ً ومعروفا ً
مسبقاً .لذلك يصعب استعمالها في التطبيقات التي يتغير فيها عدد إجراءات الواجهة األمامية .وعلى
الرغم من أن اللغات التي تدعم الحجز الديناميكي للذاكرة يمكنها التعامل مع عدد متغير من
اإلجراءات ،لكن يبقى األمر غير سهل.
ينشئ النظام في هذا النموذج بنية معطيات خاصة (تسجيلة )recordلكل إجراء يعمل في الذاكرة.
تسمى هذه التسجيلة "كتلة تحكم اإلجراء" ،Task Control Blockوتحتوي على األقل على
المعلومات التالية:
يخزن النظام كتل التحكم هذه في بنية معطيات مناسبة (الئحة مترابطة linked-listعلى األغلب).
-1 -5 -1حاالت اإلجراء
يدير نظام التشغيل اإلجراءات بحفظ حالة كل منها في كتلة تحكمه .عادة ما يكون اإلجراء في إحدى
الحاالت األربع التالية:
31
جاهز للتنفيذ ready
متوقف ( suspendedأو مج ّمد )blocked
في سبات ( dormantأو نائم )sleeping
اإلجراء قيد التنفيذ هو اإلجراء الذي ينفّذه المعالج في هذه اللحظة ،وهو وحيد إذا احتوى النظام على
معالج واحد فقط .إذا كان النظام متعدد المعالجات ،يمكن لعدة إجراءات أن تكون في حالة "قيد
التنفيذ" .يمكن إلجراء أن يدخل هذه حالة بُعَيد إنشائه (إذا لم يكن هناك أي إجراء آخر في حالة
"جاهز للتنفيذ") ،أو من حالة "جاهز للتنفيذ" (إذا كان مؤهالً للتنفيذ حسب أولويته أو موقعه في رتل
الدوار لإلجراءات الجاهزة للتنفيذ) .عندما ينتهي تنفيذ اإلجراء ،ينتقل إلى الحالة "متوقف".
الشريط ّ
اإلجراءات التي حالتها "جاهز للتنفيذ" هي تلك اإلجراءات التي يمكن أن تنتقل لحالة "قيد التنفيذ"
لكنها ليست "قيد التنفيذ" .يدخل اإلجراء حالة "جاهز للتنفيذ" إذا كان "قيد التنفيذ" وانتهت حصته
الزمنية التي خصصها المجدول له ،أو إذا جرى شفعها preemptedمن قبَل إجراء آخر له
أولوية أعلى.كذلك ،إذا كان اإلجراء في حالة "متوقف" ،وحدث الحدث الذي ينتظره ،تصبح حالة
اإلجراء "جاهز للتنفيذ" .اإلجراءات في حالة "متوقف" أو "مج ّمد" هي تلك اإلجراءات التي تنتظر
توفر مصدر محدد ،فهي بالتالي ليست "جاهزة للتنفيذ" .عندما يتوفر هذا المصدر ،ينتقل اإلجراء
لحالة "جاهز للتنفيذ".
تُستع َمل حالة السبات في النظم التي يكون فيها عدد كتل التحكم محدوداً .يمكن توصيف هذه الحالة
بأنها حالة إجراء موجود لكنه غير متاح لمجدول نظام التشغيل ،المتالء جدول كتل التحكم .عند
إنشاء إجراء جديد ،يمكن أن يوضع في حالة سبات إلى أن يتوقف أحد اإلجراءات األخرى ويصبح
مكانه متاحا ً في جدول كتل التحكم .عندها ينتقل من حالة سبات إلى حالة "جاهز للتنفيذ".
-2 -5 -1إدارة اإلجراءات
يمكن النظر إلى نظام التشغيل على أنه اإلجراء ذو األولوية األعلى في النظام .إن أية مقاطعة أو
استدعاء لخدمة من خدمات النظام (مثل طلب مصدر ما) تستدعي نظام التشغيل .يحتفظ نظام
التشغيل بالئحتين مترابطتين من كتل التحكم .األولى لإلجراءات الجاهزة والثانية لإلجراءات
المتوقفة .ويحتفظ كذلك بجدول للمصادر المتاحة وآخر لطلبات المصادر التي طلبتها اإلجراءات.
يحتوي كل كتلة إجراء نفس المعلومات التي يحتفظ بها روتين تخديم المقاطعة على المكدس .يبين
الشكل التالي مثاالً لبنية كتلة تحكم اإلجراء.
األولوية
حالة اإلجراء
32
السجل 1
.......
السجل n
يتميز نموذج TCBبأنه مناسب عندما ال يكون عدد إجراءات النظام محددا ً خالل مرحلة تصميمه،
أو يمكن أن يتغير عددها أثناء عمله .أي أنه نموذج مرن جداً.
األسلوب األبسط لعمل المجدول في هذا النموذج هو على الشكل التالي :عند استدعائه (دوريا ً أو
عند حدوث حدث) ،يفحص المجدول الالئحة المترابطة لإلجراءات الجاهزة للتنفيذ .إذا وجد إجراء
في هذه الالئحة ،عندها تُنقَل كتلة تحكم اإلجراء الذي كان قيد التنفيذ إلى آخر الئحة اإلجراءات
الجاهزة ،وينتقي المجدول أحد اإلجراءات الجاهزة للتنفيذ لنقله إلى حالة "قيد التنفيذ".
يمكن تبسيط عملية إدارة اإلجراءات بتغيير حالتها فقط دون نقلها من الئحة مترابطة ألخرى .على
سبيل المثال ،بفرض أن عدد كتل التحكم األعظمي ثابتاً ،يمكن أن يحتفظ النظام بالعدد األعظمي من
كتل التحكم في الئحة واحدة وتكون كلها في حالة سبات عند إقالعه .يمكن بعدها إضافة إجراءات
جديدة للنظام باختيار أحد الكتل التي في حالة سبات وتهيئة حقولها وتغيير حالتها إلى "جاهز
للتنفيذ" .أثناء عمل النظام ،تتغير حالة اإلجراءات بين القيم الممكنة لها ("قيد التنفيذ"" ،جاهز
للتنفيذ"" ،متوقف") حسب ما يطرأ عليها من أحداث وتبقى في نفس الالئحة .وعند انتهاء تنفيذ
إجراء ما ،يُزال من النظام بتغيير حالته إلى "سبات" .ميزة هذا األسلوب أنه يلغي الحاجة إلى
الذاكرة الديناميكية التي تتطلبها إدارة كتل التحكم ،كما أنه يجعل أداء النظام محددا ً وقابالً للتنبؤ به
ألن الئحة كتل التحكم لها طول ثابت.
-3 -5 -1إدارة المصادر
باإلضافة إلى عملية الجدولة ،يهتم نظام التشغيل بمعرفة حالة كل مصدر متاح في النظام (جهاز
دخل/خرج ،ذاكرة )... ،ويحتفظ بمعلومات عنها في جدول خاص اسمه "جدول المصادر" .يفحص
النظام دوريا ً حالة اإلجراءات الموجودة في رتل اإلجراءات المتوقفة .فإذا وجد إجراءا ً متوقفا ً ألنه
ينتظر توفر مصدر ما ،ووجد أن هذا المصدر أصبح متوفراً ،عندها يغير حالته إلى "جاهز للتنفيذ"
وينقل كتلة تحكمه إلى رتل اإلجراءات الجاهزة للتنفيذ.
33
-2األسس النظرية لنظم تشغيل الزمن الحقيقي
نحتاج في البداية لصياغة بعض المفاهيم النظرية بشكل رياضي وواضح لكي نتمكن من فهم نظم
تشغيل الزمن الحقيقي فهما ً صحيحاً .نستعرض بعد ذلك خوارزميات جدولة إجراءات الزمن
الحقيقي المختلفة ونناقش مزايا ومساوئ كل منها.
تتصف معظم نظم الزمن الحقيقي بأنها تشاركية ،concurrentأي أن طبيعة تفاعلها مع األحداث
الخارجي ة تتطلب عادة أن تقوم عدة إجراءات بالتخاطب مع العالم الخارجي في نفس الوقت (على
التفرع) .تحدثنا سابقا ً عن اإلجراءات ورأينا أن لكل منها حالة يغيرها المجدول حسب حدوث
أحداث عينة (انتهاء الحصة الزمنية إلجراء ،طلب اإلجراء لمصدر محجوز من قبل إجراء
آخر .)...،يبين الشكل التالي الحاالت المختلفة لإلجراءات واألحداث التي تسبب االنتقاالت فيما
بينها.
تجدر اإلشارة أن بعض نظم التشغيل تستعمل مصطلحات مختلفة عن المصطلحات المستعملة هنا،
لكن األفكار العامة تبقى نفسها.
-1 -2جدولة اإلجراءات
تُعتبَر الجدولة من المهام األساسية لنظام التشغيل .لكي نحقق االحتياجات الزمنية لبرنامج زمن
حقيقي ،نحتاج الستعمال خوارزميات جدولة مختلفة عن تلك المستعملة في نظم التشغيل العادية.
نحتاج كذلك السراتيجيات خاصة لترتيب استعمال مصادر النظام من قبل إجراءات الزمن الحقيقي
حسب أولوياتهم وقيودهم الزمنية .هناك نوعين أساسيين لخوارزميات الجدولة في الزمن الحقيقي:
خوارزميات ما قبل التنفيذ وخوارزميات زمن التنفيذ .الهدف المشترك لهذه الخوارزميات هو تحقيق
الشروط الزمنية إلجراءات الزمن الحقيقي.
تقوم خوارزميات ما قبل التنفيذ بجدولة اإلجراءات مسبقا ً بحيث تكون الجدولة الناتجة محققة للقيود
الزمنية وال يوجد تضارب في استعمال المصادر (أي ال يستعمل أكثر من إجراء نفس المصدر في
34
نفس اللحظة) ،وذلك قبل بدء التنفيذ الفعلي لإلجراءات .تحاول هذه الخوارزميات أيضا ً تخفيف كلفة
تبديل السياق قدر اإلمكان ،مما يزيد احتمال إيجاد جدولة محققة لجميع القيود الزمنية.
أما في خوارزميات زمن التنفيذ ،فتعطى أولويات ساكنة لإلجراءات ،وتخصص المصادر حسب
هذه األولويات .تعتمد هذه الخوارزميات على تقنيات معقدة في زمن التنفيذ لتحقيق االتصال
والتزامن بين اإلجراءات.
قيود األسبقية :precedence constraintsتحدد فيما إذا كان هناك إجراء (أو
إجراءات) يجب أن تُنفَّذ قبل تنفيذ .𝜏i
زمن الوصول arrivalأو التحرير :releaseرمزه 𝑟i,jوهو اللحظة التي يحين فيها
تنفيذ التكرار رقم jلإلجراء ( 𝜏iإذا كان دورياً ،أي ي َّ
ُكرر تنفيذه كل دور).
الطور :phaseرمزه 𝜑iوهو زمن التحرير ألول تكرار لإلجراء .𝜏i
زمن االستجابة :response timeوهو الفترة الزمنية بين لحظة تحرير اإلجراء ولحظة
اكتمال تنفيذه.
الحد الزمني المطلق :absolute deadlineرمزه 𝑑iوهو اللحظة الزمنية التي يجب
أن ينتهي اإلجراء قبلها.
الحد الزمني النسبي :relative deadlineرمزه 𝐷iوهي القيمة العظمى المسموحة
لزمن االستجابة.
نوعية السماحية :laxity typeهو مقدار اإللحاح urgencyفي تنفيذ اإلجراء .𝜏i
الدور periodورمزه :𝑝iهو الفترة الزمنية التي تفصل بين لحظة التحرير إلجراء دوري
ولحظة التحرير التالية مباشرة.
زمن التنفيذ execution timeورمزه :𝑒iوهو الزمن (األعظمي) الالزم إلتمام تنفيذ
اإلجراء 𝜏iعندما يُنفَّذ لوحده وتكون جميع المصادر التي يحتاجها متاحة.
هناك بعض العالقات الرياضية التي تربط بين هذه الواصفات الزمنية:
إذا فرضنا أن 𝑑i,jهو الحد الزمني المطلق للتكرار رقم jلإلجراء ،𝜏iيكون لدينا:
35
وإذا كان الحد الزمني النسبي إلجراء دوري 𝜏iيساوي دوره ،𝑝iيكون لدينا:
)(3.3 𝑑i,k = ri,k + pi = φi + k ∗ pi
حيث kهو عدد صحيح موجب أكبر أو يساوي ،1وهو يعبّر عن التكرار رقم kلإلجراء .𝜏i
من المهم جدا ً في نظم الزمن الحقيقي أن تكون الجدولة الناتجة عن خوارزمية الجدولة قابلة للتنبؤ
،predictableأي أنه يمكننا معرفة اإلجراء الذي سيُنفَّذ الحقا ً في كل لحظة .تستعمل العديد من
الدوار الذي يتميز بأنه بسيط وقابل للتنبؤ.
نظم تشغيل الزمن الحقيقي خوارزمية الشريط ّ
شفعية لخوارزمية الشريط الدوار ،وذلك يالسماح لإلجراءات ذات يمكن إدخال مفهوم األولوية ال ُ
شفع المعالج إذا كان ينفذ إجراءا ً أقل أولوية لحظة وصولها .يبين الشكل التالي األولوية األعلى ب ُ
مثاالً توضيحيا ً لهذه الفكرة.
وصول اإلجراء B
وتنفيذه
36
انتهاء تنفيذ Aوبدء تنفيذ C
الزمن
حصة زمنية
شُفع اإلجراء A متابعة تنفيذ A
اإلجراءان Aو Cلهما نفس األولوية واإلجراء Bله أولوية أعلى .يبدأ Aبالتنفيذ لبعض الوقت،
إلى أن يصل اإلجراء Bذو األولوية األعلى ويقوم ب ُ
شفع Aويستمر بالتنفيذ حتى انتهائه .بعدها
يعود Aللتنفيذ إلى أن تنتهي حصته الزمنية وينتقل التنفيذ لإلجراء Cحتى انتهاء حصته الزمنية
وهكذا.
يتخذ هذا األسلوب قرارات الجدولة دوريا ً ومسبقا ً ،وليس في أية لحظة مثل الشريط الدوار .تسمى
الفترات الزمنية (المتساوية) التي تفصل بين لحظات اتخاذ قرارات الجدولة باألطر framesأو
األدوار الصغيرة ،minor cyclesويُر َمز لطولها بالرمز ،fويسمى "حجم اإلطار" .الدور الكبير
major cycle or hyper periodهو المضاعف المشترك األصغر لجميع أدوار إجراءات
النظام.
شفع داخل اإلطار .إنبما أن قرارات الجدولة تؤخذ فقط في بداية كل إطار ،لذلك ال يحدث أي ُ
طور phaseأي إجراء دوري هو مضاعف صحيح غير سالب من حجم اإلطار .يبين الشكل
التالي بعض القيود المفروضة على حجم اإلطار .f
37
يجب أن يكون اإلطار كبيرا ً كفاية بحيث يبدأ وينتهي أي إجراء ضمن إطار واحد .هذا يقتضي أن
يكون حجم اإلطار fأكبر من كل أزمان التنفيذ 𝑒iلإلجراءات .𝑇iأي:
)(3.4 ) 𝐶1 ∶ f ≥ max (ei
1≤i≤n
ولكي يكون طول الجدول الدوري أصغر ما يمكن ،يجب أن يحتوي الدور الكبير على عدد صحيح
من األطر:
وللتأكد من أن كل إجراء ينتهي قبل حده الزمني ،يجب أن يكون اإلطار صغيرا ً بحيث يكون هناك
إطارا ً واحدا ً على األقل بين كل تحرير إلجراء وبين حده الزمني .العالقة التالية مشتقة من الحالة
األسوأ التي تحدث عندما يبدأ دور إجراء ما مباشرة بعد بدء اإلطار ،وال يمكن بالتالي تحريره قبل
بدء اإلطار التالي:
حيث gcdهو القاسم المشترك األعظم و 𝐷iهو الحد الزمني النسبي لإلجراء .i
سنوضح عملية حساب حجم اإلطار fباستعمال مثال عددي .ليكن لدينا نظاما ً يحتوي على
اإلجراءات الدورية المبينة في الجدول التالي:
قيمة الدور الكبير لهذه اإلجراءات هي ( 660وهو المضاعف المشترك األصغر للقيم 15و 20و
.)22نطبّق الشروط الثالثة السابقة 𝐶1و 𝐶2و 𝐶3فنحصل على العالقات التالية:
نستنتج مما سبق أن القيم الممكنة لحجم اإلطار fهي إما 3أو 4أو .5
38
-4 -2جدولة األولويات الثابتة – الخوازمية "الرتيبة المعدّل" )Rate Monotonic (RM
-1 -4 -2فكرة الخوارزمية
طى لكل إجراء أولوية محددة نسبةً لباقي اإلجراءات .تُعت َبر
في النظم ذات األولويات الثابتة ،يُع َ
خوارزمية RMمن أهم خوارزميات الجدولة في هذه النظم ،وهي تعطي جدولة أمثلية في نموذج
اإلجراءات المبسط المذكور سابقا ً .يُعطى لكل إجراء في هذه الخوارزمية أولوية تتناسب عكسا ً مع
دوره :فأولوية اإلجراء الذي له دور كبير أصغر من أولوية اإلجراء الذي له دور قصير.
سنشرح طريقة عمل هذه الخوارزمية على المثال التالي .ليكن لدينا مجموعة اإلجراءات التالية:
نفترض أن زمن تحرير كل اإلجراءات الثالثة هو .0يبين الشكل التالي طريقة جدولة هذا النظام
باستعمال خوارزمية .RMبما أن اإلجراء 𝜏1له أصغر دور ،فإن أولويته أعلى من أولويات باقي
اإلجراءات ،لذلك يُنفَّذ أوالً .الحظ أنه في اللحظة 4يصل التكرار الثاني لإلجراء 𝜏1الذي يقوم
ب ُ
شفع اإلجراء 𝜏3ألن أولويته أعلى.
تسمى القيمة " 𝑢iاالنشغالية" utilizationوهي النسبة (من واحد) التي يُشغل فيها إجراء له دور
𝑝iوزمن تنفيذ 𝑒iالمعالج .تذكر أن انشغالية المعالج في حالة nإجراء تعطى بالعالقة 1.2وهي:
𝑛
)(3.7 ∑=𝑈 𝑖𝑝𝑒𝑖 /
𝑖=1
39
-2 -4 -2بعض نتائج خوارزمية RM
من المهم عمليا ً معرفة ما هي الشروط الواجب تحققها في نظام أولويات ثابتة ليكون قابالً للجدولة
(أي لكي توجد جدولة واحدة على األقل تحقق جميع القيود الزمنية لجميع إجراءات النظام) .تحدد
النظرية التالية شروطا ً على انشغالية النظام لكي يكون قابالً للجدولة حسب خوارزمية .RM
نفترض أن الحد الزمني النسبي ألي إجراء يساوي دوره.
نظرية
تكون أية مجموعة من اإلجراءات الدورية عددها nقابلة للجدولة حسب خوارزمية RMإذا كانت
1
انشغالية المعالج Uأصغر أو تساوي ).𝑛 (2𝑛 − 1
تجدر المالحظة أنه عندما تصبح nكبيرة جداً ،يمكن البرهان على أن قيمة الحد السابق تصبح:
1
lim (2n − 1) = ln 2 ≈ 0.69
∞→𝑛
يبين الجدول التالي قيم الحد السابق من أجل عدة قيم لـ :n
يبين الشكل التالي مخططا ً يبين كيفية تغير حد االنشغالية بداللة عدد اإلجراءات:
تجدر اإلشارة إلى أن حد االنشغالية هو شرط كاف وغير الزم ،أي أنه يمكن في بعض األحيان بناء
نظام له انشغالية أعلى من الحد ويكون قابالً للجدولة حسب RMرغم ذلك .على سبيل المثال،
انشغالية النظام السابق المكون من اإلجراءات 𝜏1و 𝜏2و 𝜏3تساوي ،0.9وهي أعلى من حد
االنشغالية ،0.78ورغم ذلك فهو قابل للجدولة حسب RMكما رأينا.
40
-5 -2جدولة األولويات الديناميكية – خوارزمية "الحد األبكر أوال" Earliest-Deadline-
)First (EDF
على عكس نظم األولويات الساكنة ،تتغير أولويات اإلجراءات أثناء عمل النظام في نظم األولويات
الديناميكية .تُعتبَر خوارزمية EDFمن أشهر خوارزميات هذه النظم ،حيث تعتمد أولويات
اإلجراءات على حدودها الزمنية بدالً من أزمان تنفيذها .في أية لحظة ،اإلجراء الذي له أقرب حد
زمني هو اإلجراء ذو األولوية األعلى.
تعطي النظرية التالية الشرط الواجب تحقيقه لكي تكون مجموعة إجراءات قابلة للجدولة حسب
خوارزمية .EDF
نظرية
في نظام زمن حقيقي يحتوي على nإجراء دوري حدودها النسبية تساوي دورها ،الشرط الالزم
ليكون قابالً للجدولة حسب خوارزمية EDFهو:
n
ei
)(3.8 ∑( ) ≤ 1
pi
𝑖=1
رغم أن لحظة تحرير كال اإلجرائين هي اللحظة ،0يبدأ اإلجراء 𝜏1بالتنفيذ ألن له حد زمني
أقرب .في اللحظة ،t=2ينتهي تنفيذ 𝜏1ويبدأ تنفيذ .𝜏2في اللحظة ،t=5يصل التكرار الثاني
شفع 𝜏2ألن حده الزمني أبعد من حد .𝜏2في اللحظة ،t=15يقوم 𝜏1 لإلجراء ،𝜏1لكنه ال يقوم ب ُ
41
شفع 𝜏2ألن حده الزمني (وهو )20أقرب من الحد الزمني لإلجراء ( 𝜏2وهو .)21يتابع 𝜏2 ب ُ
تنفيذه بعد انتهاء 𝜏2في اللحظة .t=17
خوارزمية EDFأكثر مرونة من RMوتعطي انشغالية أفضل .لكن عادة ما تكون الجدولة الناتجة
عن خوارزميات األولوية الثابتة ذات تنبؤية أكبر من خوارزميات األولوية الديناميكية .وفي حال
زيادة العبء على النظام (التحميل الزائد) ،تتميز RMبأنها أكثر ثباتا ً من ،EDFإذ أن نفس
اإلجراء ذي األولوية المنخفضة الذي يتعدى حده الزمني سيتعدى حده الزمني في المستقبل ولن
تتأثر اإلجراءات ذات األولوية المرتفعة .بالمقابل ،يصعب معرفة اإلجراء الذي سيتعدى حده الزمني
في نظام EDFعند حدوث التحميل الزائد.
تجدر اإلشارة أيضا ً إلى أن اإلجراء الذي يتعدى حده الزمني في EDFتبقى أولويته أعلى من
اإلجراءات التي لم تتعدى حدها الزمني بعد .إذا استمر هذا اإلجراء بالتنفيذ ،يمكن أن يؤدي ذلك إلى
تعدي اإلجراءات األخرى لحدودها الزمنية .من األفضل في هذه الحالة أن يترك هذا اإلجراء
المعالج أمالً بتلبية الحدود الزمنية لإلجراءات األخرى.
على سبيل المثال ،يبين الجدول التالي مجموعة إجراءات دورية في نظام زمن حقيقي .عند جدولة
هذه اإلجراءات حسب خوارزمية ،EDFسيتعدى كل من اإلجرائين 𝜏1و 𝜏2حدودهما الزمنية إذا
سمحنا لإلجراء الذي تعدى حده الزمني باالستمرار بالتنفيذ .بينما سيتعدى 𝜏2فقط حده الزمني إذا
استعملنا إجرائية .RM
42
-3مزامنة اإلجراءات ومشاركة المصادر
افترضنا حتى اآلن أن إجراءات النظام مستقلة ويمكن أن يجري ُ
شفعها في أية لحظة .هذه
الفرضيات غير واقعية عمليا ً في معظم النظم ،إذ تحتاج اإلجراءات أن تتصل وتتفاعل مع بعضها
البعض .سنقدم في هذا القسم المشاكل الناتجة عن مشاركة المصادر وخوارزميات الجدولة
المستعملة في هذه الحالة.
-1 -3المصادر Resources
المصادر هي أية تسهيالت يقدمها النظام لإلجراءات لمساعدتها في تأدية عملها .فيما يلي بعض
األمثلة على المصادر المشتركة في النظام:
الملفات
التجهيزات المختلفة (طابعات ،شاشات)... ،
المتحوالت المشتركة في الذاكرة التي غالبا ً ما تُستع َمل لالتصال بين اإلجراءات
هناك الكثير من التقنيات البرمجية المستع َملة كمتحوالت مشتركة في الذاكرة لتسهيل االتصال بين
اإلجراءات نذكر منها:
𝜏1 𝜏2
43
كالً من اإلجرائين ينفَّذ مرة واحدة ،تكون القيمة النهائية الصحيحة في iهي الصفر .لكن لو فرضنا
أن 𝜏1بدأ بالتنفيذ وجرى ُ
شفعه بين التعليمتين ) (1و ) ،(2وانتقل التنفيذ لإلجراء ،𝜏2ثم عاد التنفيذ
لإلجراء 𝜏1بعد االنتهاء من التنفيذ الكامل لإلجراء ،𝜏2عندها تكون القيمة النهائية في iتساوي ،1
وهي قيمة خاطئة.
تس َمى مجموعة التعليمات التي يتعامل اإلجراء فيها مع المصدر المشترك "القسم الحرج" critical
.sectionيمكن أن يحتوي إجراء ما على أقسام حرجة لنفس المصدر أو لمصادر مختلفة .إذا دخل
إجراءان قسمين حرجين لنفس المصدر وفي نفس الوقت ،يؤدي ذلك لحدوث أخطاء في نتائج
التنفيذ ،مما يمكن أن يؤدي لنتائج كارثية في بعض الحاالت .لذلك ،هناك حاجة كبيرة لتقنيات تمنع
حدوث مثل هذا الوضع في معظم نظم الزمن الحقيقي العملية .من هذه التقنيات نذكر "العالّم"
semaphoreو "المراقب" monitorوتعليمة "اختبر وضع" .test and setسنناقش تقنية
العالّم بالتفصيل لبساطتها وفعاليتها ولكونها موجودة في معظم نظم التشغيل.
-3 -3العالّمات semaphores
العالّم Sهو موقع في الذاكرة يعمل كقفل يحمي القسم الحرج المتعلق بمصدر ما .عادة ً ما تكون
قيمة Sثنائية ( binaryصفرا ً أو واحداً) :عندما تكون ،S=1يدل ذلك على أن القفل مفتوح
ويمكن ألي إجراء الدخول للقسم الحرج .وعندما ،S=0يدل ذلك على أن القفل مغلق ويوجد حاليا ً
إجراء واحد يعمل في القسم الحرج ،ويجب على جميع اإلجراءات التي تريد الدخول إليه االنتظار
ريثما يخرج ذلك اإلجراء منه.
ُعرف على العالّم عمليتان أساسيتان هما )( P(Sإنتظار وإغالق) و )( V(Sتحرير) .فيما يلي
ي َّ
خوارزمية عمل ك ّل منهما:
تفحص العملية ) P(Sقيمة العالّم .Sطالما بقيت قيمته تساوي ،0يبقى اإلجراء يدور في حلقة
whileبانتظار أن تصبح قيمة Sتساوي ( 1أي يجمد اإلجراء الذي استدعى ) P(Sفي هذه
الحالة) .عندما تصبح ،S=1يخرج اإلجراء من حلقة االنتظار ويقفل العالّم (بجعل قيمته تساوي
.)0تقوم العملية ) V(Sبفتح العالّم بجعل قيمته تساوي .1
44
تُستع َمل العمليتان ) P(Sو ) V(Sلتحقيق التنسيق بين اإلجراءات كما يلي :قبل الدخول إلى القسم
الحرج ،يستدعي اإلجراء العملية ) P(Sوعند االنتهاء منه ،يستدعي ) V(Sكما هو مبيّن في الشكل
التالي:
تجدر اإلشارة إلى أننا نحتاج لعالّم مستقل لحماية كل مصدر مشترك .وإذا احتاج قس ٌم حر ٌج ما
للوصول إلى عدة مصادر مشتركة ،عندها يجب استدعاء العملية Pمن أجل كل العالّمات الموافقة
لهذه المصادر قبل الدخول إليه لحجزها كلها.
غالبا ً ما تكون العمليتان Pو Vجزءا ً من نواة نظام التشغيل أو استدعاءات لخدمات النظام ،ألنها
يجب أن تُنفَّذ دون مقاطعة لكي تعمل بشكل صحيح .سنبيّن أهمية هذا األمر في المثال التالي.
لنفترض أن التابع Pالسابق قد جرى ترجمته إلى لغة اآللة كما يلي:
نفترض كذلك أنه يوجد إجراءان يريدان الدخول للقسم الحرج ويستدعيان بالتالي التابع Pقبل
الدخول .القيمة االبتدائية للعالّم Sتساوي ،1مما يعني أن القسم الحرج حر .يبدأ اإلجراء األول
بتنفيذ تعليمات لغة اآللة السابقة .قبل أن يصل التنفيذ لتعليمة ،STOREتحدث مقاطعة وينتقل
التنفيذ لإلجراء الثاني الذي يستدعي نفس التابع السابق .بما أن اإلجراء األول قوطع قبل تخزين
القيمة 0في ،Sيجد اإلجراء الثاني أن قيمة Sمازالت ،1فيجعلها 0ويدخل في القسم الحرج .قبل
أن يفرغ هذا اإلجراء من استعمال المصدر المشترك والخروج من القسم الحرج ،تحدث مقاطعة
ويعود التنفيذ لإلجراء األول الذي يتابع التنفيذ من تعليمة STOREالتي توقف عندها ويدخل في
القسم الحرج .بهذا يدخل كال اإلجرائين إلى القسم الحرج مما يمكن أن يؤدي لمشاكل جدية كما
ذكرنا سابقاً.
أخيراً ،على الرغم من بساطة العالمات ،يجب استعمالها بحذر وفهم عملها جيداً ،وإال أدى سوء
استعمالها لحدوث مشاكل منطقية مثل "المنع المتبادل" deadlockالذي سنتحدث عنه فيما يلي.
45
-4 -3المنع المتبادل Deadlock
يمكن أن تحدث هذه المشكلة الخطيرة عندما تحاول عدة إجراءات الوصول إلى مصدرين على
األقل ،مما يؤدي لتوقفها كلها إذا جرى تنفيذها بحالة خاصة سنوضحها في المثال التالي .لنفترض
أنه لدينا اإلجرائين التاليين:
يحتاج اإلجراءان TASK_Aو TASK_Bالوصول إلى مصدرين يحميهما العالّمان Rو .S
يحجز اإلجراء TASK_Aالمصدر األول بعد استدعاء ) P(Sويبدأ باستعماله .وقبل أن يصل إلى
االستدعاء ) P(Rتحدث مقاطعة وينتقل التنفيذ إلى TASK_Bالذي يحجز المصدر الثاني
ويستعمله .عندما يصل التنفيذ إلى ) ،P(Sيتوقف TASK_Bعن التنفيذ ألن اإلجراء TASK_A
يحجز المصدر األول .عندها ينتقل التنفيذ إلى اإلجراء TASK_Aالذي يصل بدوره لالستدعاء
) P(Rويتوقف ألن TASK_Bيحجز المصدر الثاني .بهذا يحجز كل إجراء مصدر وينتظر
المصدر الذي يحجزه اإلجراء اآلخر إلى ما ال نهاية.
TASK_A TASK_B
يحجز
مطلوب من
المصدر 2
إن المنع المتبادل مشكلة خطيرة جدا ً ألنها تحدث باحتمال صغير جدا ً ومن الصعب معرفة أنها
موجودة بأي اختبار إلى أن تحدث .كذلك فإن حلولها ليست سهلة ولها نتائج عديدة غير مرغوبة،
من أهمها إضافة عبء حسابي على النظام يؤدي إلضعاف أدائه .سوف نتطرق إلى إحدى الطرق
46
الشهيرة لتفادي حدوث المنع المتبادل والمسماة "بخوارزمية المصرفي" .banker’s algorithm
يمكن االطالع على حلول المنع المتبادل األخرى في الكتب التي تدرس نظم التشغيل بشكل عام.
تتأكد الخوارزمية في كل لحظة من أن عدد المصادر المحجوزة من ق َبل إجراءات النظام زائد عدد
المصادر التي يحتاج إليها أحد هذه اإلجراءات إلتمام تنفيذه ال يتجاوز العدد الكلي المتاح من
المصدر .نقول في هذه الحالة أن النظام في حالة آمنة .وبالعكس ،يكون النظام في حالة غير آمنة إذا
كان المجموع السابق أكبر تماما ً من العدد الكلي المتاح من المصدر .من الممكن لكن ليس من
الضروري أن تؤدي الحاالت الغير آمنة إلى منع متبادل ،لكن من المؤكد أن الحاالت اآلمنة لن
تؤدي أبدا ً لحدوث منع متبادل .لذلك تضمن الخوارزمية بقاء النظام في حالة آمنة وتضمن بالتالي
عدم حدوث المنع المتبادل.
مكونا ً من ثالثة إجراءات Aو Bو Cو 10مصادر من نوع واحد لنأخذ على سبيل المثال نظاما ً ّ
(كتل ذاكرة مثالً) .إذا علمنا أن اإلجراء Aلن يحتاج لحجز أكثر من 6مصادر في نفس الوقت ولن
يحتاج Bألكثر من 5ولن يحتاج Aبأكثر من .7يحتاج النظام لبناء جدول مشابه للجدول التالي
في كل لحظة لتتبع المصادر المتاحة والمطلوبة في تلك اللحظة.
العدد الذي من الممكن أن عدد المصادر المحجوزة
العدد األعظمي المطلوب اإلجراء
يحتاج إليه حاليا ً
عند كل طلب حجز للمصادر ،يح ّدث نظام التشغيل هذا الجدول للتأكد من أن النظام ما زال في
وضع آمن .فيما يلي مثال على وضع آمن للنظام:
47
العدد الذي من الممكن أن عدد المصادر المحجوزة
العدد األعظمي المطلوب اإلجراء
يحتاج إليه حاليا ً
هذه الحالة آمنة ألن العدد الكلي المتاح حاليا ً (وهو )4أكبر أو يساوي العدد الذي من الممكن أن
يحتاج إليه أحد اإلجراءات إلتمام تنفيذه (مثل اإلجراء Bعلى سبيل المثال ،وكذلك اإلجراء .)A
فيما يلي مثال على حالة غير آمنة ألن العدد الكلي المتاح ال يكفي أي إجراء ،ومن الممكن إذا ً أن
يحدث منع متبادل:
العدد الذي من الممكن أن عدد المصادر المحجوزة
العدد األعظمي المطلوب اإلجراء
يحتاج إليه حاليا ً
لدينا نظام يحتوي على ثالثة إجراءات 𝜏1و 𝜏2و .𝜏3أولوية 𝜏1أعلى من أولوية 𝜏2وأولوية 𝜏2
أعلى ممن أولوية .𝜏3يتشارك 𝜏1و 𝜏3بمصدر مشترك ويحتاجان لتقنية مزامنة تنظم وصولهما
إليه (عالّم مثالً مع عمليات Pو Vالخاصة به) .ال يحتاج 𝜏2للوصول إلى هذا المصدر .لنفترض
أنه حدث تنفيذ اإلجراءات حسب المخطط الزمني التالي (القسم الحرج ملون باللون الغامق).
تنفيذ طبيعي
48
مج ّمد
الزمن
القسم الحرج
يبدأ 𝜏3العمل في اللحظة 𝑡0ويقوم بقفل العالّم في اللحظة 𝑡1ألنه يريد العمل مع المصدر
شفع اإلجراء 𝜏3قبل أن ينتهي من القسم الحرج المشترك .يصل اإلجراء 𝜏1في اللحظة 𝑡2ويقوم ب ُ
ألن له أولوية أعلى .في اللحظة ،𝑡3يحاول اإلجراء 𝜏1قفل العالّم ألنه يريد أيضا ُ العمل مع
المصدر المشترك ،لكنه يدخل في حالة انتظار (يصبح مج ّمداً) ألن العالّم محجوز مسبقا ُ من قبَل
.𝜏3عندها ،يعود التنفيذ إلى 𝜏3ليتابع قسمه الحرج .لكن في اللحظة 𝑡4يصل اإلجراء 𝜏2الذي له
شفعه .وبما أن 𝜏2ال يحتاج للوصول إلى المصدر المشترك ،يستمر أولوية أعلى من ،𝜏3فيقوم ب ُ
تنفيذه إلى أن ينتهي في اللحظة ،𝑡5مطيالً بذلك زمن انتظار 𝜏1ذي األولوية األعلى بمقدار زمن
ويحرر العالّم.
َّ تنفيذ .𝜏2يعود بعدها التنفيذ لإلجراء 𝜏3إلى أن ينتهي القسم الحرج في اللحظة 𝑡6
عندها ينتقل التنفيذ لإلجراء 𝜏1ألن أولويته أعلى وألن العالّم الذي ينتظره أصبح حراً .بعد أن
ينتهي تنفيذ اإلجراء 𝜏1في اللحظة ،𝑡7يعود التنفيذ لإلجراء 𝜏3حتى ينتهي تنفيذه في اللحظة .𝑡8
تصور لو أنه كان هناك عدد أكبر من اإلجراءات المشابهة لإلجراء 𝜏2بأن لها أولوية أعلى من 𝜏3
ّ
وأقل من . 𝜏1من الممكن في هذه الحالة أن تزيد هذه اإلجراءات من زمن انتظار 𝜏1لفترة طويلة
رغم أولويته المرتفعة.
نقول بشكل عام أنه حصلت حالة إنعكاس أولوية خالل فترة زمنية ما إذا ُمنع إجراء ذو أولوية
مرتفعة من التنفيذ من قبَل إجراءات لها أولوية أقل .حصل هذا األمر في المثال السابق في المجال
الزمني ] [𝑡3 , 𝑡6حين ُمنع 𝜏1من التنفيذ من ق َبل 𝜏2و .𝜏3
من الواضح أنه من غير المرغوب به أن يحصل انعكاس لألولوية في نظم الزمن الحقيقي .لذلك،
تُستع َمل في هذه الحالة خوارزميات جدولة مختلفة عن الخوارزميات التي رأيناها سابقا ً بهدف
التقليل قدر اإلمكان من هذه الظاهرة .سنناقش فيما يلي خوارزميتين شهيرتين في هذا المجال هما
"وراثة األولوية" و "سقف األولوية".
49
-1 -6 -3خوارزمية وراثة األولوية priority inheritance
تتغير أولويات اإلجراءات في هذه الخوارزمية ديناميكيا ً بحيث يأخذ اإلجراء الذي يعمل ضمن القسم
الحرج األولوية العظمى لإلجراءات التي تنتظر خروجه من القسم الحرج .بكلمات أخرى ،عندما
يج ّمد إجراء ما 𝜏iإجراءات أخرى ذات أولوية أعلى ،يرث مؤقتا ً أعلى أولوية من أولويات هذه
اإلجراءات إلى أن يخرج من القسم الحرج حيث يستعيد أولويته األصلية .فيما يلي الخطوات
األساسية للخوارزمية:
سيدخل أي إجراء مهما كانت أولويته في حالة انتظار إذا حاول حجز عالّم محجوز من قبَل
إجراء آخر.
إذا ُج ّمد إجراء 𝜏1من قبَل إجراء آخر ،𝜏2وكانت أولوية 𝜏1أعلى من أولوية ،𝜏2يرث
𝜏2أولوية 𝜏1طالما بقي مجمدا ً له ،ويعمل وفق هذه األولوية الجديدة الموروثة .عندما
يخرج 𝜏2من القسم الحرج الذي سبب هذا التجميد ،تعود أولويته إلى القيمة التي كانت
عليها قبل دخول القسم الحرج.
وراثة األولوية متعدية .أي إذا كان 𝜏3يج ّمد 𝜏2و 𝜏2يج ّمد ،𝜏1وأولوية 𝜏3أقل من
أولوية 𝜏2وأولوية 𝜏2أقل من أولوية ،𝜏1عندها يرث 𝜏3أولوية 𝜏1عبر .𝜏2
ففي المثال الذي ناقشناه في الفقرة السابقة ،إذا استعملنا فكرة وراثة األولوية ،ستزيد أولوية 𝜏3
لتصبح مساوية ألولوية 𝜏1في اللحظة 𝑡3التي يج ّمد فيها اإلجراء 𝜏3اإلجراء .𝜏1عندها ،لن
شفع 𝜏3عندما يصل ألن أولوية 𝜏3أصبحت أعلى من أولوية .𝜏2يبين الشكل التالي يتمكن 𝜏2من ُ
المخطط الزمني الناتج عن تطبيق فكرة وراثة األولوية على المثال السابق.
تنفيذ طبيعي
مج ّمد
تأجل
الزمن
القسم الحرج
تجدر اإلشارة أخيرا ً إلى أن خوارزمية وراثة األولوية ال تمنع حدوث المنع المتبادل على عكس
خوارزمية "سقف األولوية" التي سنناقشها في الفقرة التالية.
50
-2 -6 -3خوارزمية سقف األولوية priority ceiling
هذه الخوارزمية هي تحسين لخوارزمية وراثة األولوية ،بحيث يُمنَع أي إجراء من الدخول إلى
القسم الحرج إذا كان هذا سيؤدي إلى تجميده .يُعطى لكل مصدر أولوية (تسمى سقف األولوية)
تساوي أعلى أولوية إلجراء سيستعمل هذا المصدر.
خطوات خوارزمية سقف األولوية هي نفسها خطوات خوارزمية وراثة األولوية ،مع فرق واحد هو
أنه يمكن إلجراء 𝜏iأن يُمنَع من دخول القسم الحرج إذا وجد عالّم محجوز من ق َبل إجراء آخر وله
سقف أولوية أكبر أو يساوي أولوية .𝜏iسنبين هذا الفرق في المثال التالي .ليكن لدينا نظام مؤلف
من ثالثة إجراءات 𝜏1و 𝜏2و 𝜏3ويوجد فيه المصادر التالية:
سقف األولوية اإلجراءات التي تصل إليه القسم الحرج
إذا فرضنا أن 𝜏2يحجز حاليا ً المصدر ،𝑆2وبدأ اإلجراء 𝜏1بالعمل وطلب حجز المصدر ،𝑆1
عندها سيج َّمد 𝜏1ولن يحجز المصدر 𝑆1رغم أنه حر وذلك ألن أولويته ليست أكبر تماما ً من سقف
أولوية المصدر المحجوز .𝑆2
لنأخذ مثاالُ آخر نظاما ً فيه ثالثة إجراءات أيضا ً هي 𝜏1و 𝜏2و .𝜏3أولوية 𝜏1أكبر من أولوية 𝜏2
وأولوية 𝜏2أكبر من أولوية .𝜏3تقوم هذه اإلجراءات بالعمليات التالية:
حسب قاعدة تحديد قيمة سقف األولوية ،تكون قيمة سقف أولوية 𝑆1تساوي ) 𝑃(𝜏1و قيمة سقف
أولوية 𝑆2تساوي ) .𝑃(𝜏2يبين الشكل التالي جدولة هذه اإلجراءات حسب خوارزمية سقف
األولوية.
الحصول على 𝑆1
51
محاولة الحصول
على 𝑆1 الحصول على 𝑆2
الحصول على 𝑆1
نفترض أن 𝜏3يبدأ التنفيذ أوالً ويحجز المصدر 𝑆2في اللحظة 𝑡1ويدخل في القسم الحرج .يبدأ 𝜏2
شفع 𝜏3ألن أولويته أعلى .يحاول بعد ذلك حجز المصدر 𝑆1في التنفيذ في اللحظة 𝑡2ويقوم ب ُ
اللحظة .𝑡3في هذه اللحظة ،يج َّمد 𝜏2ألن أولويته ليست أعلى من سقف أولوية 𝑆2الذي يحجزه
اإلجراء ،𝜏3ويرث 𝜏3أولوية 𝜏2مؤقتا ً ويتابع تنفيذه .في اللحظة ،𝑡4يصل اإلجراء 𝜏1ويقوم
شفع 𝜏3ويستمر بالتنفيذ حتى اللحظة 𝑡5حيث يحاول حجز المصدر .𝑆1يُعطى المصدر 𝑆1 ب ُ
لإلجراء 𝜏1ألن أولويته أعلى من أسقف أولويات جميع المصادر المحجوزة في هذه اللحظة (وهي
فقط المصدر 𝑆2الدي يحجزه .)𝜏3ينتهي تنفيذ اإلجراء 𝜏1في اللحظة 𝑡6ويعود التنفيذ إلى 𝜏3
الذي يتابع تنفيذه حتى ينتهي في اللحظة .𝑡7عندها يُس َمح لإلجراء 𝜏2بحجز 𝑆1ثم 𝑆2ومتابعة
التنفيذ حتى ينتهي في اللحظة .𝑡8
52
الفصل الثالث :تصميم برمجيات نظم الزمن الحقيقي
-1هندسة االحتياجات
إن هندسة االحتياجات هي جزء من علم هندسة البرمجيات .وهو يهتم بتحديد أهداف ومهام والقيود
المفروضة على النظم البرمجية ،وتمثيل هذه المعلومات بأشكال مناسبة للنمذجة والتحليل .هدفها
األساسي إذا ً هو إنشاء توصيف كامل وصحيح ومفهوم لكل من الزبون والمطور الحتياجات النظام
البرمجي .هذا األمر يحتوي على تناقض بشكل من األشكال ،إذ يجب على هندسة االحتياجات تقديم
توصيف سهل الفهم للزبون لكي يتأكد من أن النظام قيد التطوير يالئم تماما ً احتياجاته وتوقعاته،
وي جب كذلك أن تحتوي على توصيف كامل للمهام والقيود المفروضة على النظام لتكون أساسا ً
يعتمد عليه المطورون .وفي حالة نظم الزمن الحقيقي ،يضاف إلى كل ما سبق التعقيدات الناتجة عن
الحاجة لتمثيل قيود األداء والزمن.
يبين الشكل التالي المخطط العام لتدفق العمل في مرحلة هندسة االحتياجات من مراحل بناء نظام
الزمن الحقيقي .تُمثَّل الفعاليات على شكل مستطيالت ذات حواف ناعمة ،بينما تُمث َّل الوثائق الناتجة
عن هذه الفعالياتعلى شكل مستطيالت ذات رمادية.
تعريف االحتياجات
تقرير جدوى
نموذج النطاق التحقق من صالحية
االحتياجات
تعاريف االحتياجات
يبدأ إجراء هندسة االحتياجات بمرحلة الدراسة األولية ،وتتضمن القيام ببحث حول دوافع المشروع
وطبيعة المشكلة والقيود المفروضة عليها وتحديد نطاق العمل واألولويات المستقبلية ،باإلضافة إلى
تحليل مبكر للقيود الزمنية المفروضة على النظام إذا كان النظام يعمل في الزمن الحقيقي .الوثيقة
األساسية الناتجة عن هذه المرحلة هو تقرير الجدوى الذي من الممكن أن يقترح عدم جدوى المتابعة
في تطوير هذا النظام ،وهو أمر ال يحدث في غالبية األحيان.
53
ينتقل اإلجراء بعدها لمرحلة استخالص االحتياجات ،وهي تتضمن عمليات جمع االحتياجات
والمتطلبات باستعمال أساليب متعددة مثل مقابلة الزبون وطرح األسئلة المفصلة عليه وإجراء
صة من هذه النماذج األولية للمشروع .prototypesيمكن التعبير عن االحتياجات المستخل َ
المرحلة بأساليب متعددة تتراوح بين النص العادي المكتوب بلغة إنسانية والتوصيف الصوري
الرياضي المجرد .لكن ،عادة ً ما يُعبَّر عنها باستعمال نموذج النطاق ،وهو نموذج يتضمن مخططات
عديدة مثل مخطط حاالت االستعمال ،use-caseوالمخططات العالقاتية ومخططات السياق
.context
صة
المرحلة التالية هي مرحلة تعريف االحتياجات .فمن الضروري تعريف كل االحتياجات المستخل َ
تعريفا ً دقيقا ً بحيث يمكن تحليلها الحقا ً للتحقق من صالحيتها وكفايتها وعدم تناقضها .خرج هذه
المرحلة هي وثيقة متطلبات تحتوي على مواصفات الحاجات البرمجية Software
) Requirement Specification (SRSالتي تصف مزايا وتصرف النظام النهائي،
باإلضافة إلى القيود المفروضة عليه.
-2أنواع االحتياجات
على الرغم من وجود العديد من التصنيفات لالحتياجات ،فإن التصنيف المتبع عادة في نظم الزمن
يعرف هذا التصنيف األنواع
المعرف من قبل المنظمة ّ .IEEEَّ الحقيقي هو التصنيف IEEE830
التالية من االحتياجات:
54
تشمل االحتياجات الوظيفية توصيفا ً لجميع مداخل النظام ،باإلضافة إلى سلسلة العمليات الواجب
تنفيذها والخرج الموافق لكل قيمة دخل ممكنة ،سوا ٌء كانت هذه القيمة طبيعية أو غير طبيعية .يمكن
أن تشمل الحاالت الغير طبيعية توصيفا ً لكيفية معالجة األخطاء والسيما حاالت تعدي إجراءات
الزمن الحقيقي لحدودها الزمنية .بكلمات أخرى ،تصف االحتياجات الوظيفية التصرف الحتمي
الكامل للنظام.
االسم
الهدف
مصدر الدخل أو وجهة الخرج
المجاالت المقبولة والدقة والسماحية
وحدة القياس
التوقيت
العالقات مع المداخل والمخارج األخرى
أنماط المعطيات
أنماط األوامر
تشمل احتياجات األداء االحتياجات الديناميكية والساكنة المفروضة على النظام البرمجي أو تفاعل
المستخدم مع النظام البرمجي ككل .يمكن أن تشمل االحتياجات الساكنة في نظم الزمن الحقيقي عدد
المستخدمين الذين يمكنهم استخدام النظام في نفس الوقت ،بينما يمكن أن تشمل االحتياجات
الديناميكية عدد المناقالت transactionsوحجم المعطيات التي يمكن معالجتها في فترة زمنية
محددة في الحاالت العادية وحاالت العبء الزائد المح َّمل على النظام.
أما احتياجات قواعد المعطيات المنطقية فهي تتضمن تعريف أنماط المعطيات المستعملة في
الوظائف المختلفة للنظام ومعدل استعمالها وسماحيات الوصول وكائنات المعطيات entity
والعالقات بينها وشروط تكامل المعطيات.
أخيراً ،تتعلق احتياجات قيود التصميم بمدى المطابقة مع المعايير وبحدود البينان المادي المستع َمل.
بينما تتعلق احتياجات واصفات النظم البرمجية بالوثوقية واإلتاحية واألمن وقابلية الصيانة والناقلية.
55
األساليب الغرضية التوجه.
لغات توصيف البرامج أو شبه البرنامج pseudo-code
التوصيفات الوظيفية عالية المستوى
أساليب أخرى عملية مثل اللغات المحكية والتوصيف الرياضي
يمكن تصنيف هذه األساليب بشكل عام إلى ثالثة أصناف :أساليب صورية formalوغير صورية
وشبه صورية .تعتمد األساليب الصورية مثل مخطط الحاالت المنتهية Finite State
Diagramولغة Zعلى أساس رياضي متين ودقيق ،بينما ال يمكن توصيف األساليب الغير
صورية مثل مخططات التدفق بشكل رياضي متين وال يمكن بالتالي دراستها تحليلياً .كل ما يمكن
عمله باستعمال األساليب الغير صورية هو إيجاد مثال معاكس يبين أين فشل النظام في تحقيق
احتياجاته أو أين حدث تعارض في النظام .هذه الطريقة ليست مناسبة في نظم الزمن الحقيقي حيث
نحتاج لتوصيف دقيق وواضح الحتياجات أداء النظام.
تسمى األساليب التي ال يمكن تصنيفها على أنها صورية تماما ً أو غير صورية تماما ً باألساليب شبه
الصورية .يمكن أن تعتمد بعض هذه األساليب على توصيف رياضي ،رغم أنها تبدو كأنها ليست
كذلك .على سبيل المثال ،يعتبر البعض أن لغة النمذجة الموحدة Unified Modeling
) Language (UMLهي شبه صورية ألن مخطط الحالة Statechartفيها هو صوري لكنه
يستعمل تقانات نمذجة لها أساس شبه رياضي ،بينما يعتبر البعض اآلخر أن UMLهي ليست حتى
شبه صورية ألن توصيفها فيه ثغرات خطيرة وعدم تجانس .لذلك جرى اقتراح تعديل على UML
اسمه UML2.0يحوي مكونات لها توصيف صوري نظامي .وهناك محاوالت أخرى لجعلها أكثر
صورية.
لكن تتصف الطرق الصورية مع ذلك بأنها صعبة القراءة واالستعمال حتى من قبل الخبراء
المدربين .لذلك يتفادى الكثيرون استعمال هذه الطرق لتوصيف احتياجات أنظمتهم ويستعملون
عوضا ً عنها طرقا ً غير صورية أو شبه صورية.
56
لغة Z
آلة الحاالت المنتهية Finite State Machine
مخططات الحالة Statecharts
شبكات بتري Petri nets
سنستعرض فيما يلي نموذجا "آلة الحاالت المنتهية" و "شبكات بتري" األكثر استعماالً في تصميم
نظم الزمن الحقيقي.
يمكن التعبير عن FSMعلى شكل مخطط أو جدول .لنفترض على سبيل المثال أننا نريد نمذجة
نظام تحكم حاسوبي بطائرة مقاتلة .يحتوي النظام على وحدة قياس للعطالة ،ويمكن لنظام التحكم أن
يعمل في أحد الحاالت الخمس التالية :اإلقالع TAKوالمالحة NAVوالمالحة/هروب NAE
والمالحة/هجوم NAAوالهبوط .LANيستجيب النظام لعدد من اإلشارات الواردة من أجزاء
أخرى من الطائرة وهي :إسناد المهمة MAوقفل العدو LOواكتشاف الهدف TDوإتمام المهمة
MCوهروب العدو EEوتدمير العدو .EDالحالة البدائية للنظام هي TAKوالحالة النهائية
الوحيدة هي .LANيبين الشكل التالي مخطط انتقال النظام من حالة ألخرى حسب اإلشارات
الواردة إليه:
57
يمكن كذلك التعبير عن نفس المخطط السابق على شكل جدول انتقال حالة ،أسطره هي الحالة
الحالية ،أعمدته هي إشارة الدخل ،والقيم المخزنة فيه هي الحالة التالية .يبين الجدول التالي تمثل
نفس FSMالسابقة باستعمال جدول الحالة:
كمثال آخر على آلة الحاالت المنتهية ،نفترض أن أي إجراء في نظام تشغيل الزمن الحقيقي يمكن
أن يكون في أحد الحاالت الثالث التالية :مج َّمد suspendedوجاهز readyوقيد التنفيذ
.executingيمكن بسهولة استنتاج األحداث التي تجعل اإلجراء ينتقل من حالة ألخرى من
المخطط التالي:
اصبح المصدر
متاح
مج َّمد جاهز
اختاره
تم المجدول
مقاطعة
تجميد
قيد التنفيذ
تتصف FSMبأنها سهلة التطوير ويمكن تحقيقها بسهولة باستعمال جداول االنتقال .وهي كذلك
غير غامضة وقادرة على التعبير عن مفاهيم مهمة بأسلوب سهل .كذلك تتوفر الكثير من الدراسات
والخوارزميات التي تمكن المصمم من اختزال FSMألقصى حد .لكن يمكن أحيانا ً أن يكبر عدد
الحاالت لمقدار كبير يجعل من الصعب قراءتها والتعبير عنها بوضوح.
58
-2 -4شبكات بتري
وهي طريقة صورية أخرى تستع َمل لتوصيف العمليات التي يجب تأديتها في بيئة متعددة المعالجات
أو متعددة اإلجراءات .يمكن التعبير عنها بأسلوب رياضي أو بأسلوب بياني .تحتوي شبكة بتري
على مجموعة من الدوائر تسمى "األماكن" placesوتمثّل اإلجراءات أو مخازن المعطيات .تمثّل
المستطيالت العمليات أو االنتقاالت .يكت َب بجانب كل إجراء عدد المعطيات الموجودة فيه ،وبجانب
كل انتقال تابع االنتقال الموافق .يصل بين الدوائر والمستطيالت أضالع وحيدة االتجاه.
يُعبَّر عن الحالة االبتدائية للشبكة بجموعة m0من القيم تمثّل أعداد المعطيات االبتدائية في كل
إجراء .ينتج عن الحالة m0حاالت أخرى … m1, m2,ناتجة عن قدح االنتقاالت .يمكن النتقال
أن يُق َدح إذا توفر على مداخله عدد المعطيات التي يحتاج إليها الخرج .ال يتغير شكل الشبكة مع
مرور الوقت ،بل يتغير فقط قيم أعداد المعطيات في كل إجراء .يبين الشكل التالي مثاالً لشبكة بتري
بسيطة ،ويبين الجدول الذي يليه جدول القدح الموافق لها:
قبل القدح
بعد القدح
يبين الشكل التالي والجدول الذي يليه مثاالُ آخر لشبكة بتري أعقد من السابقة:
59
يمكن لشبكات بتري أن تستع َمل لنمذجة النظم وتحليل القيود الزمنية وحاالت التسابق race
،conditionsكما يمكنها نمذجة البنى المعروفة لمخططات التدفق flowchartsكما هو مبين
في األشكال التالية .يبين الشكل ) (aكيفية الحصول على التسلسل sequenceباستعمال شبكات
بتري .أما الشكل ) (bفيبين كيفية الحصول على التفريع الشرطي ويعبر الشكل ) (cعن حلقة
.while
60
تفيد شبكات بتري كثيرا ً عند الحاجة لتمثيل النظم المتعددة المعالجات أو المتعددة اإلجراءات .هناك
أيضا ً عدد من التمديدات التي يمكن تطبيقها على هذا النموذج للحصول على نماذج أكثر قوة مثل
شبكات بتري الموقوتة وشبكات بتري الملونة وشبكات بتري الملونة والموقوتة.
61
إن ش بكة بتري هي أداة قوية يمكن استعمالها أثناء تحليل أو تصميم النظام لكشف حاالت القفل
المتبادل dead-lockوحاالت التسابق .لنفرض على سبيل المثال أن جزءا ً من شبكة بتري لنظام
ما هو المبين في الشكل التالي:
من الواضح أنه في هذه الحالة ال يمكن معرفة أي االنتقالين سيقدح .يمكن كذلك استعمال شبكات
بتري لكشف الدورات في النظام التي يمكن أن تؤدي لقفل متبادل كما هو مبين في الشكل التالي:
من الواضح أيضا ً أن هذه الحالة هي حالة قفل متبادل .يمكن أخيرا ً استعمال شبكات بتري لكشف
وجود حلقات أكبر وأقل وضوحا ً من هذا المثال وتضم عددا ً كبيرا ً من اإلجراءات.
62
الفصل الرابع :لغات برمجة نظم الزمن الحقيقي
-1مقدمة
يسبّب سوء استعمال لغة البرمجة المستعملة لبرمجة نظام الزمن الحقيقي أثرا ً كبيرا ً على أداء النظام
ككل ،ويسبب بالتالي تعدي العديد من اإلجراءات لحدودها الزمنية .كذلك فإن االستعمال المتزايد
للغات الغرضية التوجه Object-Oriented Programming Languagesمثل Javaو
C++و ADAتجعل المشكلة أكثر حرجا ً وصعوبة .لكن ال يمكن إنكار أن لهذه اللغات العالية
المستوى مزايا عديدة جعلت مبرمجي نظم الزمن الحقيقي يستعملونها بكثرة عوضا ً عن اللغات
المنخفضة المستوى مثل Cولغة التجميع .assembly language
إن البرمجة هي أقرب إلى "الحرفة" و "الفن" منها إلى اإلنتاج الكمي .ومثل أية حرفة ،تحتاج
البرمجة إلى األدوات الضرورية والمالئمة ذات الجودة العالية ،وتحتاج ألن يتقن المبرمج العمل
عليها .األداة األساسية التي يستعملها المبرمج لتطوير البرمجيات هي المترجم .compiler
استعملت العديد من لغات البرمجة لبناء نظم الزمن الحقيقي مثل Cو C++و C#و Javaو
فورتران وباسكال و ADA95ولغة التجميع ،وحتى Visual Basicو Lispو .Prolog
بعض هذه اللغات غرضية التوجه مثل C++و Javaو ،C#وبعضها إجرائية procedural
مثل باسكال وفورتران .تمتلك لغة ADA95عناصر من الطرفين ويمكن استعمالها كلغة إجرائية
أو غرضية التوجه حسب رغبة المبرمج .استعمال بعض اللغات الخاصة مثل Lispو Prolog
في برمجة نظم الزمن الحقيقي غير شائع ،وإن كان موجوداً.
السؤال المهم هنا هو" :كيف يمكن معرفة مدى مالئمة لغة ما لبرمجة نظم الزمن الحقيقي ،وما هو
المعيار الذي يمكن استعماله لقياس ذلك؟" يمكن اإلجابة على هذا السؤال بشكل تقريبي عبر المعايير
التجريبية التالية المسماة "معايير كارديللي" :Cardelli’s Criteria
االقتصاد في زمن التنفيذ :ما هي السرعة التي يعمل بها البرنامج الناتج؟
االقتصاد في زمن الترجمة :ما هو الزمن الناتج لتوليد البرنامج التنفيذي انطالقا ً من
البرنامج المصدر؟
االقتصاد في التطوير على نطاق صغير :مقدار الجهد الذي يجب على مبرمج وحيد أن
يبذله لتطوير النظام
االقتصاد في التطوير على نطاق واسع :مقدار الجهد الذي يجب على مجموعة من
المبرمجين أن يبذلوه لتطوير النظام
االقتصاد من ناحية ميزات اللغة :ما هو مقدار صعوبة تعلم ميزات featuresلغة
البرمجة؟
63
لكل لغة برمجة نقاط قوة وضعف عندما يُراد استعمالها لبرمجة نظم الزمن الحقيقي ،ويمكن
استعمال المعايير السابقة لمقارنتها مع بعضها البعض واختيار األنسب منها حسب التطبيق المطلوب
والمهارات البرمجية المتاحة لدى فريق التطوير.
سنقدّم في هذا الفصل عرضا ً للغات البرمجة التي يمكن استعمالها لبرمجة نظم الزمن الحقيقي،
باإلضافة إلى األساليب الواجب اتباعها لتحسين البرنامج الناتج قدر اإلمكان بحيث يصبح أمثليا ً
وقابالً للتنبؤ من ناحية األداء والتصرف.
تعاني أيضا ً لغة التجميع من أنها غير مهيكلة وذات تجريد ضعيف جداً .وهي تختلف كثيرا ً من
معالج آلخر والبرنامج الناتج عنها ذو ناقلية portabilityضعيفة .كذلك فإن البرمجة بلغة التجميع
صح باستعمالها على اإلطالق .يقتصر صعبة ومجهدة ومليئة باألخطاء البرمجية .لذلك ال يُن َ
است عمالها عادة في الحاالت التي ال يقدم فيها مترجم اللغة عالية المستوى بعض التعليمات أو البنى
الضرورية لعمل النظام ،أو عندما تكون القيود الزمنية المفروضة على النظام حرجة جدا ً بحيث
يجب أن يُكت َب بلغة اآللة ليكون أمثليا ً و ُمتنبَّأ به تماماً.
كحل وسط ،يمكن كتابة األجزاء الحساسة فقط من النظام بلغة التجميع وكتابة الباقي بلغة عالية
المستوى .تسمح بعض اللغات عالية المستوى مثل ADA95و باسكال بحشر أجزاء مكتوبة بلغة
التجميع ضمن البرنامج.
إذا أردنا تقييم لغة التجميع حسب معايير كارديللي ،يمكن القول أنها أقتصادية جدا ً في زمن التنفيذ
والترجمة (ألنها غير مترجمة أصالً!) ،لكنها غير اقتصادية في التطوير على نطاق ضيق أو واسع،
وفقيرة من ناحية ميزات اللغة.
64
functionsأو البرامج الجزئية .sub-programsهناك العديد من الميزات التي من المهم
توفرها في هذا النوع من اللغات لجعلها مناسبة أكثر لبرمجة نظم الزمن الحقيقي نذكر منها:
سنناقش اآلن معايير كارديللي للغات اإلجرائية .يؤدي التنميط القوي للمتحوالت إلى تحسين عملية
توليد برنامج التجميع الناتج ،مما يجعل اللغات اإلجرائية اقتصادية جدا ً من ناحية زمن التنفيذ
(بفرض أن المترجم جيد) .كذلك يؤدي توفر الوحدات البرمجية في اللغة إلى إمكانية ترجمة كل
وحدة على حدة ،مما يجعل اللغات اإلجرائية اقتصادية أيضا ً في زمن الترجمة ويس ّهل عملية ترجمة
النظم الكبيرة بفرض أن واجهات interfacesالوحدات ثابتة إلى حد ما.
تتصف هذه اللغات أيضا ً بأنها اقتصادية في التطوير على نطاق صغير ،ألن عملية التحقق من
األنماط الموجودة في مترجماتها تكشف معظم أخطاء البرمجة وتخفف من جهود االختبار والتنقيح.
كذلك فإن تجريد المعطيات وتوفر الوحدات البرمجية لهما تأثير كبير في تسهيل التطوير على نطاق
واسع .يمكن لفريق كبير من المبرمجين االتفاق على الواجهات بين الوحدات البرمجية ،ثم تطوير
كل منها واختبارها بشكل مستقل ،شرط تقليل البنى والعمليات العامة globalواعتمادية الوحدات
على بعضها البعض ما أمكن.
أخيراً ،تتصف اللغات اإلجرائية باالقتصاد من ناحية ميزات اللغة ،حيث ال تتصف بالتعقيد ويسهل
عادة تعلمها واإللمام بميزاتها المختلفة.
إن األغراض objectsهي وسيلة فعّالة لتخفيف تعقيد النظام ألنها تؤ ّمن بيئة طبيعية إلخفاء
سلتها ،encapsulationحيث تُج َمع معطيات الغرض والعمليات التي تتم عليه المعطيات وك ْب َ
(تسمى الطرائق methodsوهي تقابل التوابع في اللغات اإلجرائية) في كتلة واحدة سهلة
65
االستعمال .عادة ً ما يكون استعمال األسلوب الغرضي التوجه لتوصيف نظام ما سهل وطبيعي أكثر
من األساليب األخرى.
تدعم لغات البرمجة غرضية التوجه الحديثة العديد من التقنيات المهمة في نظم الزمن الحقيقي وذلك
سلة
سل َ
من أساس اللغة ،مثل النياسب threadsوالمزامنة synchronizationوال َ
.serialization
لنناقش اآلن معايير كارديللي للغات الغرضية التوجه .فيما يتعلق باالقتصاد في زمن التنفيذ ،تتصف
هذه اللغات بأنها أسوأ من اللغات اإلجرائية بطبيعتها وذلك لعدة أسباب أهمها بطء استدعاء الطرائق
بسبب مستوى الوصول الغير مباشر اإلضافي ( indirectionيحوي كل غرض على جدول
بعناوين طرائقه يجب الرجوع إليه عند كل استدعاء ألحدها).
فيما يتعلق باالقتصاد في زمن الترجمة ،فإن اللغات غرضية التوجه أسوأ من اللغات اإلجرائية من
هذه الناحية أيضاً .إذ أن مترجماتها معقدة وعادة ما يكون من الصعب تقسيم النظم الكبيرة إلى
وحدات مستقلة تماما ً عن بعضها البعض .على سبيل المثال ،إذا أدخل المبرمج تعديالً على صف
classما ،يجب عندها إعادة ترجمة كل الصفوف الموروثة منه .لذلك فإنه من الممكن أن يزيد
الزمن الالزم لترجمة النظام بمعدل كبير عندما يصبح حجمه كبيراً.
بالمقابل فإن اللغات غرضية التوجه أفضل من اللغات اإلجرائية من ناحية االقتصاد في التطوير
على نطاق صغير ألنه يمكن للمبرمجين المنفردين االستفادة من مكتبات الصفوف وبيئات العمل
المتوفرة بكثرة لتخفيض جهد وزمن التطوير إلى حد كبير .مع ذلك ،يحتاج المبرمجون في كثير من
األحيان إلى الدخول في تفاصيل مكتبات الصفوف لفهم عملها واستعمالها بفعالية ،وهو أمر أصعب
عادة من الدخول في تفاصيل الوحدات البرمجية اإلجرائية.
أما من ناحية االقتصاد في التطوير على نطاق واسع ،فتتفوق فيها اللغات اإلجرائية على اللغات
غرضية التوجه على الرغم تميّز األخيرة بصفة "إعادة االستعمال" .reusabilityيعود السبب في
ذلك إلى افتقارها لإلجتزائية modularityبسبب صعوبة تعديل الصفوف باستعمال الوراثة
.inheritanceعلى سبيل المثال ،يمكن أن يقوم المبرمج عن طريق الخطأ بإعادة تعريف
overrideبعد التوابع الموروثة التي يجب عدم إعادة تعريفها لكي يعمل الصف جيداً .لذلك
يضطر المبرمج في كثير من األحيان إلى الدخول في تفاصيل الصف األصلي لكي ينمكن من تعديله
باستعمال الوراثة.
أخيراً ،تتصف اللغات غرضية التوجه بضعف االقتصاد في ميزات اللغة .على سبيل المثال ،اعتمد
تصميم لغة C++على نموذج بسيط نسبيا ً مبني على لغة ،Simulaلكنها مليئة بالميزات التي
يصعب تعلمها واستعمالها بالشكل الصحيح .حتى اللغات الحديثة مثل جافا هي أعقد بكثير مما يظنه
الكثير من الناس .لسوء الحظ ،تبين أن مبدأ "كل شيء هو غرض "objectالذي بدا اقتصاديا ً
66
ومنتظما ً في البداية ،انتهى به األمر ليصبح مجموعة هائلة من الصفوف المتعلقة ببعضها البعض
والتي يصعب استعمالها ما لم تُف َهم بمجملها.
-1 -5لغة ADA95
كان الهدف األساسي لتطوير لغة ADAهو أن تصبح اللغة اإلجبارية لتطوير كافة مشاريع إدارة
الدفاع األمريكية والتي تتضمين الكثير من النظم المض ّمنة .لكن النسخة القياسية األولى التي ظهرت
عام 1983احتوت على الكثير من المشاكل التي أصبحت معروفة للمبرمجين منذ ظهور أول
مترجم لها .لذلك قام مطوروها بحل هذه المشاكل لتظهر النسخة الثانية المسماة ADA 95والتي
تُعت َبر أول لغة غرضية التوجه قياسية عالمية .لكن إدارة الدفاع وافقت على استعمال لغات أخرى
في العديد من المشاريع ،مما جعل المطورون يدركون أن لغة ADAغير مناسبة لتلبية الهدف
األساسي منها.
ص ّممت لغة ADAخصيصا ً لتطبيقات نظم الزمن الحقيقي المض َّمنة .لكن المطورون وجدوا أنها ُ
لغة ثقيلة وغير فعّالة لمثل هذه التطبيقات ،باإلضافة إلى احتوائها على العديد من المشاكل عند
تحقيق النظم المتعددة المهام باستعمال األدوات القليلة التي تتيحها اللغة.
أخيراً ،على الرغم من أن عدد المطورين الذين يستعملون لغة ADAيتناقص باستمرار ،إال أن
توفر نسخة مفتوحة المصدر من لغة ADAعلى نظام لينوكس أعطاها دفعا ً صغيرا ً مؤخرا ً.
-2 -5لغة C
عت لغة Cعام 1971وهي لغة مناسبة للتطبيقات "المنخفضة المستوى" .يعود السبب في أختُر َ
ذلك إلى أنها مشتقة من لغة BCPLالتي كان النمط الوحيد الذي تدعمه هو "كلمة اآللة"
.machine wordتدعم لغة Cاألنماط األساسية منخفضة المستوى مثل البايتات والبتات
والمحارف والعناوين التي يمكن استعمالها للتعامل مع متحكمات المقاطعات interrupt
controllersوسجالت المعالج والتجهيزات األخرى الضرورية في نظم الزمن الحقيقي .لذلك،
غالبا ً ما تُستع َمل لغة Cكلغة تجميع عالية المستوى مستقلة عن البنيان المادي.
تحتوي لغة Cعلى العديد من أنماط المتحوالت التي تسمح بالتحكم بتوليد الترميز النهائي من
ع ّرفمستوى عال مثل registerو volatileو staticو .constantعلى سبيل المثال ،إذا ُ
متحول بالنمط ،registerفهذا يدل على أنه سيُستع َمل كثيراً ،مما يدعو المترجم compiler
لتخصيص سجل من سجالت المعالج لهذا المتحول مما يجعل ناتج الترجمة أسرع وأصغر حجماً.
67
المعرفة بهذه
َّ كذلك ،تخبر الصفة volatileالمترجم بأال يحاول أمثلة optimizeالمتحوالت
الصفة .هذا األمر مفيد على سبيل المثال للتعامل مع الدخل/خرج المعنون بالذاكرة.
بشكل عام ،تُعتبَر لغة Cمناسبة للبرمجة المض َّمنة ألنها لغة مهيكة ومرنة وخالية من القيود.
-3 -5لغة C++
لغة C++هي لغة غرضية التوجهة هجينة (أي أنها لغة إجرائية أيضاً) بدأت كطبقة ماكروية مبنية
على لغة ،Cلكنها أصبحت اليوم لغة مستقلة لها مترجماتها الخاصة المتوافقة مع .Cتمتلك C++
جميع مزايا اللغات غرضية التوجهة وتؤ ّمن كبسلةً وتجريدا ً أفضل من .C
يتفق معظم المبرمجون أن إساءة استعمال المؤشرات هو المصدر األساسي لألخطاء البرمجية في
.C/C++فقد استعمل مبرمجو C/C++األوائل عمليات حسابية معقدة على المؤشرات إلنشاء
ومعالجة بنى المعطيات المعقدة ،والسيما سالسل المحارف .stringsلذلك ،كانوا يقضون وقتا ً
طويالً الصطياد أخطاء برمجية معقدة ناتجة عن معالجة بسيطة لسالسل المحارف .حالياً ،تحتوي
C++على العديد من المكتبات النظامية لبنى المعطيات الديناميكية مثل Standard Template
) Library (STLوالتي تحتوي على األنماط stringو ،wstringمما يريح المبرمج من عناء
التعامل مع سالسل المحارف.
يتزايد كل يوم عدد النظم المض ّمنة المبرمجة باستعمال C++ويسأل المبرمجون أنفسهم كل يوم:
هل أستعمل Cأم C++لتحقيق نظامي المض ّمن؟ الجواب هو :األمر يعتمد على ما يريده المبرمج.
اختيار Cبدالً من C++يعني الحصول على برنامج سريع ويسهل التنبؤ بتصرفاته ،لكنه صعب
الصيانة .وبالعكس ،فإن البرامج المكتوبة بلغة C++أبطأ ويصعب التنبؤ بتصرفاتها ،لكن صيانتها
أسهل بكثير من البرامج المكتوبة بلغة .C
-4 -5لغة C#
وهي لغة شبيهة بلغة Javaولها بيئة تشغيل تشبه كثيرا ً آلة جافا االفتراضية Java Virtual
) Machine (JVMوتسمى "منصة عمل .".NETلكنها على عكس جافا ،تسمح بتعليمات "غير
آمنة" unsafe codeيمكن فيها التعامل مع المؤشرات مباشرة وإجراء العمليات عليها كما هو
لغة .C/C++
على األغلب ،ال تناسب لغة C#وبيئة التشغيل .NETتطبيقات نظم الزمن الحقيقي الصعبة لعدة
أسباب ،منها زمن التنفيذ الغير محدود لجامع النفايات Garbage Collectorالذي تعتمد عليه
بيئة التشغيل ،وعدم توفر البنى الالزمة لجعل جدولة النياسب threadsحتمية .من الممكن أن
تناسب C#تطبيقات نظم الزمن الحقيقي الرخوة والقاسية وذلك لقابليتها الستدعاء خدمات نظام
التشغيل operating system APIبشكل يحجب تعقيد إدارة الذاكرة عن المبرمج ،باإلضافة
إلى أن أداء عمليات الفاصلة العائمة فيها يقارب أداء لغة .C
68
-5 -5فورتران Fortran
تُعتبَر لغة فورتران من أقدم اللغات عالية المستوى المستعملة لبرمجة نظم الزمن الحقيقي .وبسبب
افتقاد النسخ األولية من فورتران للعودية recursionوالحجز الديناميكي للذاكرة ،فقد احتوت
النظم المكتوبة بها على أجزاء كبيرة مكتوبة بلغة التجميع لمعالجة المقاطعات وجدولة اإلجراءات.
أما االتصال مع األجهزة الخارجية ،فكان يجري باستعمال DMAوالدخل/خرج المعنون بالذاكرة
Memory-mapped I/Oوتعليمات الدخل/خرج .تحتوي النسخ الحديثة من فورتران على دعم
للعودية .رغم ذلك ،مازالت نظم الزمن الحقيقي الحالية المكتوبة بها تحتوي على أجزاء مكتوبة بلغة
التجميع.
طورت فورتران في وقت كان من الضروري فيه الحصول على أداء أمثلي على أجهزة حاسوب ّ
صغيرة الحجم وبطيئة .ونتيجة لذلك ،كانت البنى األساسية للغة منتقاة لهدف واحد هو األداء ،وهو
ما كان محققا ً بالفعل في أغلب األحيان .تتلخص مساوئها بأنها ضعيفة التنميط weakly-typed
وتفتقر لمعالجة أخطاء زمن التنفيذ وأنماط المعطيات المجردة .لكنها ما زالت تُست َع َمل حتى اآلن في
العديد من نظم الزمن الحقيقي الحديثة.
حاسوب
ميزة هذا األسلوب هو الناقلية ،portabilityحيث يمكن لبرنامج جافا المتر َجم أن يعمل على أية
آلة يتوفر عليها آلة جافا االفتراضية .هناك العديد من التطبيقات الهامة لهذا األسلوب في النظم
المض ّمنة والمحمولة ،مثل الهواتف الخلوية والبطاقات الذكية والويب.
يتوفر أيضا ً مترجمات حقيقية للغة جافا ينتج عنها ترميز ثنائي يعمل على نوع خاص من المعالجات
كغيرها من اللغات المتر َج َمة األخرى مثل .C++يتوفر كذلك معالجات قادرة على تنفيذ تعليمات
byte codeمباشرة.
69
جافا هي لغة غرضية التوجه تشبه كثيرا ً لغة ،C++لكنها ال تعتمد مفهوم المعالجة األولية للبرنامج
.preprocessorوهي كذلك ال تدعم التمرير بالمرجع call by referenceوليس فيها
مؤشرات صريحة .جميع األغراض والمصفوفات فيها هي مؤشرات ضمنية ويجب حجزها
ديناميكياً ،وتقع مسؤولية تحريرها على كاهل جزء خاص من المفسر هو جامع النفايات
.Garbage Collectorكذلك فإن المفسر يختبر معظم الحاالت التي يمكن أن تولّد أخطاءا ً في
زمن التنفيذ مثل خروج دليل مصفوفة خارج المجال الصحيح أو التقسيم على صفر .كل هذا يجعل
أداء لغة جافا أسوأ من أداء اللغات المتر َجمة األخرى مثل .C++
للتغلب على هذه المشاكلُ ،كلّف المعهد الوطني للمقاييس والتكنولوجيا National Institut of
) Standards and Technology (NISTبتطوير نسخة من جافا مناسبة لتطبيقات الزمن
الحقيقي والنظم المض ّمنة .نُشر تقرير مجموعة العمل المكلفة بهذا األمر في شهر أيلول عام
وعرف تسعة احتياجات أساسية لمواصفات نسخة الزمن الحقيقي من لغة جافا Real- َّ ،1999
) Time Specification for Java (RTSJوهي:
يجب أن تتضمن المواصفات إطار عمل الكتشاف والبحث عن أية محلالت profilers .1
متاحة.
شفعي محدود. يجب أن يكون جامع النفايات ذو تأخير ُ .2
تعرف المواصفات العالقات بين نياسب الزمن الحقيقي بنفس مستوى التفصيل يجب أن ّ .3
المتاح حاليا ً في وثائق المعايير األخرى.
يجب أن تتضمن المواصفات واجهات APIالتصال ومزامنة اإلجراءات المكتوبة بلغة .4
جافا مع اإلجراءات المكتوبة باللغات األخرى.
يجب أن تتضمن المواصفات أسلوب معالجة األحداث الداخلية والخارجية الغير متزامنة. .5
يجب أن تتضمن المواصفات إمكانية اإلنهاء الغير متزامن للنياسب. .6
يجب أن تتضمن المواصفات أساليب لتحقيق المنع المتبادل دون تجميد. .7
يجب أن تتضمن المواصفات أساليب تم ّكن تعليمات البرنامج من معرفة هل يجري تنفيذها .8
في نيسب زمن حقيقي أم في نيسب عادي.
تعرف المواصفات العالقات بين نياسب الزمن الحقيقي والنياسب العادية. يجب أن ّ .9
70
-2 -6 -5تحقيق لغة Real-time Java
تعرف المواصفات RTSJصفا ً RTيعبّر عن نيسب زمن حقيقي ،ويقوم مجدول مقيم خاص ّ
بجدولتها وفقا ً لمفاهيم الزمن الحقيقي .يمكن لنياسب RTالوصول إلى األغراض في الكومة
،heapلذلك هي عرضة للتأخيرات الزمنية التي يسببها جامع النفايات.
تستعمل RTSJمفهوم أولويات أكثر "رخاوة" مما هو مقبول عادة في نظم الزمن الحقيقي .تدل
األولوية العالية إلجراء ما على أنه المؤهل األكبر لينتقيه المجدول من بين اإلجراءات الجاهزة
للتنفيذ ،وال تدل أبدا ً على أن عملية التوزيع dispatchingتجري بأسلوب يعتمد على األولويات.
يقوم النظام بتخزين جميع النياسب التي تنتظر امتالك مصدر ما في رتل أولوية (أي مرتبة في
الرتل حسب أولوياتها) .تشمل هذه المصادر المعالج ومناطق الذاكرة المشتركة .يقدّم RTSJ
للمبرمج صفان يمكنانه من الوصول المباشر للذاكرة الفيزيائية .األول هو
يعرف توابع تسمح ببناء أغراض تمثّل مجاالت في الذاكرة RawMemoryAccessالذي ّ
الفيزيائية ،والوصول إليها على مستوى byteو wordو .longالصف الثاني هو
PhysicalMemoryالذي يسمح بالحصول على أغراض من PhysicalMemoryArea
الذي يعبّر عن مجال من عناوين الذاكرة الفيزيائية التي يمكن للنظام أن يحجز األغراض فيها.
ص ّم َمت لغة Occam 2أصالً لدعم المعالجة التفرعية على األجهزة التفرعية من نوع ُ
،transputersلكن يوجد لها أيضا ً مترجمات للبنى األخرى .أخيراً ،استُعملت هذه اللغة في
العديد من التطبيقات في بريطانيا خصوصاً.
71
ط ّورت هذه اللغة من قبل مجموعة من الباحثين األلمان في بدايات اللغة ُ :PEARL
السبعينيات ،ولها تطبيقات واسعة خصوصا ً في مجال األتمتة الصناعية في ألمانيا.
لغة :Real-Time Euclidوهي لغة تجريبية تتمتع بكونها من اللغات القليلة المناسبة
تماما ً لتحليل قابلية الجدولة .scheduability analysisلألسف ،لم تجد هذه اللغة
طريقا ً لتحقيق تطبيقات عملية في مجال نظم الزمن الحقيقي.
لغة :Real-Time Cوهو اسم عام للعديد من التمديدات الماكروية للغة Cالتي تقدم بنى
خاصة للتوقيت والتحكم الغير متوفرة في لغة Cاألصلية.
المطورة خصيصا ً َّ لغة :Real-Time C++وهو اسم عام للعديد من المكتبات الغرضية
للغة ،C++وهي تقدم امكانات متقدمة للتوقيت والحكم.
72