You are on page 1of 78

‫ﻧظم اﻟزﻣن اﻟﺣﻘﯾﻘﻲ‬

‫اﻟدﻛﺗور أﺣﻣد وﺑﻲ‬

‫‪Books‬‬
‫نظم الزمن الحقيقي‬
‫الدكتور أحمد وبي‬

‫من منشورات الجامعة االفتراضية السورية‬


‫الجمهورية العربية السورية ‪2018‬‬

‫هذا الكتاب منشور تحت رخصة المشاع المبدع – النسب للمؤلف – حظر االشتقاق (‪)CC– BY– ND 4.0‬‬

‫‪https://creativecommons.org/licenses/by-nd/4.0/legalcode.ar‬‬

‫يحق للمستخدم بموجب هذه الرخصة نسخ هذا الكتاب ومشاركته وإعادة نشره أو توزيعه بأية صيغة وبأية وسيلة للنشر وألية غاية تجارية‬
‫أو غير تجارية‪ ،‬وذلك شريطة عدم التعديل على الكتاب وعدم االشتقاق منه وعلى أن ينسب للمؤلف األصلي على الشكل اآلتي حصرا‪:‬‬
‫أحمد وبي‪ ،‬نظم الزمن الحقيقي‪ ،‬من منشورات الجامعة االفتراضية السورية‪ ،‬الجمهورية العربية السورية‪2018 ،‬‬

‫متوفر للتحميل من موسوعة الجامعة ‪https://pedia.svuonline.org/‬‬

‫‪Real Time Systems‬‬


‫‪Ahmad Wabbi‬‬

‫)‪Publications of the Syrian Virtual University (SVU‬‬

‫‪Syrian Arab Republic, 2018‬‬

‫‪Published under the license:‬‬

‫‪Creative Commons Attributions- NoDerivatives 4.0‬‬

‫)‪International (CC-BY-ND 4.0‬‬

‫‪https://creativecommons.org/licenses/by-nd/4.0/legalcode‬‬

‫‪Available for download at: https://pedia.svuonline.org/‬‬


‫اﻟﻔﮭرس‬

‫الفصل األول‪ :‬مفاهيم نظم الزمن الحقيقي ‪1 .................................................‬‬


‫‪ -1‬المصطلحات األساسية في نظم الزمن الحقيقي ‪1 ....................................‬‬
‫‪ -1 -1‬مفهوم النظام ‪1 .................................................... System‬‬
‫‪ -2 -1‬نظم الزمن الحقيقي ‪2 ........................... Real-time Systems‬‬
‫‪ -3 -1‬األحداث ‪ events‬والحتمية ‪5 ........................... determinism‬‬
‫‪ -4 -1‬انشغالية المعالج ‪8 ................................... CPU utilization‬‬
‫‪ -2‬عوامل تتعلق بتصميم نظم الزمن الحقيقي ‪9 .......................................‬‬
‫‪ -3‬أمثلة على نظم الزمن الحقيقي ‪11 ....................................................‬‬
‫‪ -4‬بعض المعتقدات الخاطئة المتعلقة بنظم الزمن الحقيقي ‪13 .........................‬‬
‫‪ -5‬لمحة تاريخية مختصرة ‪13 ...........................................................‬‬
‫‪ -1 -5‬التطورات النظرية ‪14 .........................................................‬‬
‫‪ -2 -5‬بعض نظم الزمن الحقيقي المبكرة ‪14 ........................................‬‬
‫‪ -3 -5‬برمجيات الزمن الحقيقي المبكرة ‪14 .........................................‬‬
‫‪ -4 -5‬نظم تشغيل الزمن الحقيقي التجارية ‪15 ......................................‬‬
‫الفصل الثاني‪ :‬نظم تشغيل الزمن الحقيقي‪16 ...............................................‬‬
‫‪ -1‬نواة نظام تشغيل الزمن الحقيقي ‪16 ..................................................‬‬
‫‪ -1 -1‬أشباه النوى ‪17 ....................................... pseudo-kernels‬‬
‫‪ -1 -1 -1‬حلقة االستقصاء ‪17 ................................. polling loop‬‬
‫‪ -2 -1 -1‬حلقة االستقصاء المتزامنة ‪18 Synchronized polling loop‬‬
‫‪ -3 -1 -1‬التنفيذي الدوري ‪19 ......................... Cyclic Executive‬‬
‫‪ -4 -1 -1‬البرمجة المقادة بالحالة ‪20 ............. State-driven coding‬‬
‫‪ -5 -1 -1‬الروتينات التعاونية ‪21 ............................. Co-routines‬‬
‫‪ -2 -1‬النظم المقادة بالمقاطعة ‪23 .............Interrupt-driven systems‬‬
‫‪ -1 -2 -1‬روتينات تخديم المقاطعات ‪Interrupt Service Routines‬‬
‫)‪23 .......................................................................... (ISR‬‬
‫‪ -2 -2 -1‬تبديل السياق ‪24 ................................ context switch‬‬
‫‪ -3 -1‬نظم األولوية ال ُ‬
‫شفعية ‪26 ....................... preemptive-priority‬‬
‫‪ -4 -1‬النظم الهجينة ‪27 ...................................... hybrid systems‬‬
‫‪ -1 -4 -1‬نظم الواجهة األمامية‪/‬الواجهة الخلفية‬
‫‪27 ............................................. foreground/background‬‬
‫‪ -2 -4 -1‬المعالجة في الواجهة الخلفية ‪28 .......................................‬‬
‫‪ -3 -4 -1‬التهيئة ‪28 ........................................... initialization‬‬
‫‪ -4 -4 -1‬عمليات الزمن الحقيقي ‪29 .............................................‬‬
‫‪ -5 -4 -1‬نظم تشغيل الزمن الحقيقي كاملة المواصفات ‪31 .....................‬‬
‫‪ -5 -1‬نموذج كتلة تحكم اإلجراء )‪31 ....... Task Control Block (TCB‬‬
‫‪ -1 -5 -1‬حاالت اإلجراء ‪31 .....................................................‬‬
‫‪ -2 -5 -1‬إدارة اإلجراءات‪32 ....................................................‬‬
‫‪ -3 -5 -1‬إدارة المصادر ‪33 ......................................................‬‬
‫‪ -2‬األسس النظرية لنظم تشغيل الزمن الحقيقي ‪34 .....................................‬‬
‫‪ -1 -2‬جدولة اإلجراءات ‪34 ..........................................................‬‬
‫‪ -1 -1 -2‬العبء على المعالج وصفات المهام ‪35 ...............................‬‬
‫‪ -2 -1 -2‬نموذج مبسط لإلجراء ‪36 .............................................‬‬
‫الدوار ‪36 ...................... round-robin‬‬
‫‪ -2 -2‬خوارزمية جدولة الشريط ّ‬
‫‪ -3 -2‬التنفيذي الدوري ‪37 ................................. cyclic executive‬‬
‫‪ -4 -2‬جدولة األولويات الثابتة – الخوازمية "الرتيبة المعدّل" ‪Rate‬‬
‫)‪39 ............................................................ Monotonic (RM‬‬
‫‪ -1 -4 -2‬فكرة الخوارزمية ‪39 ...................................................‬‬
‫‪ -2 -4 -2‬بعض نتائج خوارزمية ‪40 ...................................... RM‬‬
‫‪ -5 -2‬جدولة األولويات الديناميكية – خوارزمية "الحد األبكر أوالُ" ‪Earliest-‬‬
‫)‪41 ..................................................... Deadline-First (EDF‬‬
‫‪ -1 -5 -2‬خصائص الخوارزمية ‪42 ..................................... EDF‬‬
‫‪ -2 -5 -2‬مقارنة الخوارزميتان ‪ RM‬و ‪42 ............................. EDF‬‬
‫‪ -3‬مزامنة اإلجراءات ومشاركة المصادر ‪43 ..........................................‬‬
‫‪ -1 -3‬المصادر ‪43 ................................................. Resources‬‬
‫‪ -2 -3‬األقسام الحرجة ‪43 ................................... critical sections‬‬
‫‪ -3 -3‬العالّمات ‪44 ............................................... semaphores‬‬
‫‪ -4 -3‬المنع المتبادل ‪46 .............................................. Deadlock‬‬
‫‪ -5 -3‬خوارزمية المصرفي ‪47 .................. the banker’s algorithm‬‬
‫‪ -6 -3‬انعكاس األولوية ‪48 ................................ priority inversion‬‬
‫‪ -1 -6 -3‬خوارزمية وراثة األولوية ‪50 ........... priority inheritance‬‬
‫‪ -2 -6 -3‬خوارزمية سقف األولوية ‪51 ................... priority ceiling‬‬
‫‪ -3 -6 -3‬نتائج خوارزميات التحكم بالوصول للمصادر ‪52 ....................‬‬
‫الفصل الثالث‪ :‬تصميم برمجيات نظم الزمن الحقيقي ‪53 ..................................‬‬
‫‪ -1‬هندسة االحتياجات ‪53 ................................................................‬‬
‫‪ -2‬أنواع االحتياجات ‪54 .................................................................‬‬
‫‪ -3‬توصيف احتياجات نظم الزمن الحقيقي ‪55 ..........................................‬‬
‫‪ -4‬الطرق الصورية لتوصيف االحتياجات البرمجية ‪56 ...............................‬‬
‫‪ -1 -4‬آلة الحاالت المنتهية )‪57 ...........Finite State Machine (FSM‬‬
‫‪ -2 -4‬شبكات بتري ‪59 ...............................................................‬‬
‫الفصل الرابع‪ :‬لغات برمجة نظم الزمن الحقيقي ‪63 .......................................‬‬
‫‪ -1‬مقدمة ‪63 ..............................................................................‬‬
‫‪ -2‬لغة التجميع ‪64 ....................................................... Assembly‬‬
‫‪ -3‬اللغات اإلجرائية ‪64 ............................... procedural languages‬‬
‫‪ -4‬اللغات غرضية التوجه ‪65 ................. object-oriented languages‬‬
‫‪ -5‬لمحة عامة عن لغات برمجة الزمن الحقيقي ‪67 ....................................‬‬
‫‪ -1 -5‬لغة ‪67 ............................................................. ADA95‬‬
‫‪ -2 -5‬لغة ‪67 ...................................................................... C‬‬
‫‪ -3 -5‬لغة ‪68 .................................................................. C++‬‬
‫‪ -4 -5‬لغة ‪68 .................................................................... C#‬‬
‫‪ -5 -5‬فورتران ‪69 ....................................................... Fortran‬‬
‫‪ -6 -5‬لغة جافا ‪69 ............................................................ Java‬‬
‫‪ -1 -6 -5‬لغة ‪70 ............................................ real-time java‬‬
‫‪ -2 -6 -5‬تحقيق لغة ‪71 .................................. Real-time Java‬‬
‫‪ -7 -5‬لغة ‪71 .......................................................... Occam 2‬‬
‫‪ -8 -5‬لغات الزمن الحقيقي المخصصة ‪71 ..........................................‬‬
‫الفصل األول‪ :‬مفاهيم نظم الزمن الحقيقي‬

‫سنقدم في هذا الفصل المفاهيم األساسية والمصطلحات الالزمة لفهم ماهية نظم الزمن الحقيقي‪.‬‬
‫سنقدم كذلك بعض األمثلة الواقعية عنها ولمحة تاريخية عن تطورها‪.‬‬

‫‪ -1‬المصطلحات األساسية في نظم الزمن الحقيقي‬

‫‪ -1 -1‬مفهوم النظام ‪System‬‬


‫يمكن تعريف النظام على أنه تقابل بين مجموعة مداخل ‪ inputs‬ومخارج ‪.outputs‬‬

‫يمكن نمذجة أي كينونة في الطبيعة على شكل نظام‪ .‬عندما ال تكون التفاصيل الداخلية للنظام مهمة‪،‬‬
‫يمكن التعبير عنه على شكل صندوق أسود له عدة مداخل وعدة مخارج كما يلي‪:‬‬

‫نظام‬

‫النظم الحاسوبية ‪ computer systems‬هي نظم مكونة من برمجيات ‪ software‬وعتاد مادي‬


‫‪ .hardware‬يشمل العتاد المادي جميع األجهزة اإللكترونية والكهربائية والميكانيكية في الحاسب‬
‫كالمعالج والذاكرة الرئيسية وأجهزة الدخل‪/‬خرج‪ .‬أما البرمجيات فهي مجموعة تعليمات ينفذها العتاد‬
‫المادي (المعالج) لحل مسألة ما‪ ،‬وتقسم إلى نوعين‪ :‬برمجيات النظام ‪system software‬‬
‫والتطبيقات البرمجية ‪.software applications‬‬

‫تغلّف برمجيات النظام العتاد المادي وتؤ ّمن للتطبيقات البرمجية واجهة تخاطب مجردة تمكنها من‬
‫الوصول إلى خدمات العتاد المادي بسهولة‪ .‬غالبا ً ما تج ّمع برمجيات النظام األساسية مثل مجدول‬
‫المهام ‪ scheduler‬وسواقات األجهزة ‪ device drivers‬ومدير الذاكرة ‪memory‬‬
‫‪ manager‬في كتلة واحدة هي نظام التشغيل ‪.operating system‬‬

‫أما التطبيقات البرمجية فهي مصممة لحل مشاكل محددة تهم المستخدم مثل حسابات الرواتب وإدارة‬
‫المستودعات وتصفح الويب و األلعاب وغيرها‪.‬‬

‫تمثّل المداخل في النظم الحاسوبية أقنية المعلومات الرقمية الواردة من األجهزة الحاسوبية‬
‫والبرمجيات األخرى‪ .‬وهي تأتي غالبا ً من حساسات ‪ sensors‬كالكاميرات والميكروفونات‬

‫‪1‬‬
‫وغيرها من األجهزة التي تولد معطيات رقمية ‪ digital‬أو تمثيلية ‪ .analog‬أما مخارج النظم‬
‫وتحول إلى تمثيلية إلرسالها إلى أجهزة الخرج المختلفة‬
‫ّ‬ ‫الحاسوبية فهي على األغلب رقمية‬
‫كالشاشات والسماعات وغيرها كما هو مبين في الشكل التالي‪.‬‬

‫نظام‬
‫حاسوبي‬

‫بالنظر إلى النظام السابق‪ ،‬نجد أن هناك تأخير زمني بين لحظة ورود المداخل (وتسمى أيضا ً‬
‫المحرضات ‪ )stimulus‬ولحظة ظهور المخارج الموافقة لها (وتسمى أيضا ً اإلجابة‬
‫‪.)response‬‬

‫تعريف‪:‬‬
‫يدعى الزمن الفاصل بين لحظة ورود مداخل النظام ولحظة ظهور قيم الخرج على مخارجه بزمن‬
‫استجابة النظام‪.‬‬

‫‪ -2 -1‬نظم الزمن الحقيقي ‪Real-time Systems‬‬

‫تعريف‪:‬‬
‫نظام الزمن الحقيقي هو نظام يجب أن يحقق قيود صريحة (حدود محددة) على زمن االستجابة‪.‬‬
‫يمكن أن يؤدي عدم احترام هذه القيود لنتائج خطيرة‪ ،‬أو حتى لفشل ‪ 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‬‬
‫وأجهزة اإلسقاط) للحصول على صورة متحركة ذات جودة مقبولة ألن العين اإلنسانية في هذه‬
‫الحالة ال تحس بانقطاع الحركة بسبب دوام االنطباع الشبكي‪ .‬إذا لم يحقق جهاز العرض هذه‬
‫السرعة‪ ،‬تصبح حركة الصورة مقطعة‪ .‬الظاهرة الفيزيائية التي يعتمد عليها النظام هنا هي العين‬
‫اإلنسانية‪ .‬وفي نظم المالحة المختلفة‪ ،‬يجب حساب تسارع الجسم المدروس (طائرة‪ ،‬سيارة‪،‬‬
‫صاروخ‪ )... ،‬بمعدل يعتمد على السرعة القصوى للجسم‪ .‬لهذا فإن معدل حساب تسارع السيارة أقل‬
‫من معدل حساب سرعة الصاروخ ألن السرعة القصوى للسيارة أقل بكثير من السرعة القصوى‬
‫للصاروخ‪.‬‬

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

‫‪ -3 -1‬األحداث ‪ events‬والحتمية ‪determinism‬‬


‫إن األسلوب الطبيعي لتنفيذ التعليمات في أي نظام برمجي ‪ software‬هو التنفيذ التسلسلي‪ .‬يحتوي‬
‫المعالج الذي ينفذ هذا البرنامج سجالً خاصا ً يسمى عادة ً "سجل عداد البرنامج" ‪Program‬‬
‫‪ Counter Register‬يحتوي بدوره على عنوان التعليمة التي ينفذها المعالج حالياً‪ .‬عندما يكون‬
‫تنفيذ البرنامج تسلسلياً‪ ،‬تجري زيادة قيمة هذا السجل بمقدار محدد للحصول على عنوان التعليمة‬
‫التالية بعد االنتهاء من تنفيذ التعليمة الحالية‪ .‬لكن هناك بعض الحاالت التي تغير هذا التنفيذ التسلسلي‬
‫وتجعل المعالج يقفز لمكان آخر في البرنامج لتنفيذ التعليمات الموجودة فيه‪ .‬المثال التقليدي على مثل‬
‫هذه الحاالت هو تنفيذ تعليمة ‪ if-then-goto‬المبينة على شكل معيّن في مخطط التدفق التالي‪:‬‬

‫من األمثلة األخرى على الحاالت التي تغير من التدفق التسلسلي للتنفيذ‪ :‬استدعاء التوابع في اللغات‬
‫اإلجرائية مثل ‪ C‬و باسكال وإنشاء األغراض ‪ objects‬واستدعاء طرائقها ‪ methods‬في‬
‫اللغات الغرضية التوجه ‪ Object Oriented Languages‬مثل ‪ C++‬و ‪.Java‬‬

‫تعريف‬
‫أي شي يحدث ويؤدي لتغير عداد البرنامج بأسلوب غير تسلسلي (وهو ما نعتبره تغيرا ً في تدفق‬
‫البرنامج) يسمى "حدثاً" ‪.event‬‬

‫عادة ما تتكون نظم الزمن الحقيقي من عدد من اإلجراءات ‪ Tasks or Jobs‬تعمل على التفرع‬
‫وكل منها يؤدي عمالً محدداً‪ .‬يمكن أن تكون هذه اإلجراءات دورية ‪ Periodic‬أو غير دورية‬

‫‪5‬‬
‫‪( aperiodic‬تحدث استجابة لحدث ما)‪ .‬على سبيل المثال‪ ،‬اإلجراء الذي يقوم بالحفاظ على سرعة‬
‫الطائرة في الجو هو إجراء دوري يقوم دوريا ً بقراءة سرعة الطائرة الحالية ويحسب الفرق بينها‬
‫وبين السرعة المطلوب الحفاظ عليها ويرسل على أساسها أوامر التحكم لمحركات الطائرة‪ .‬أما في‬
‫نظام مراقبة الحريق فيؤدي ارتفاع درجة الحرارة إلقالع إجراء إطفاء الحريق‪ ،‬فهو إذا إجراء غير‬
‫دوري‪.‬‬

‫تعريف‬
‫لحظة اإلطالق ‪ Release time‬إلجراء هي اللحظة التي يصبح فيها هذا اإلجراء جاهزا ً للتنفيذ‬
‫(بشكل دوري أو غير دوري)‪.‬‬

‫غالبا ً ما تتعلق لحظة اإلطالق بمقاطعة ‪ interrupt‬ما‪ .‬إما أن تكون هذه المقاطعة ناتجة عن مؤقت‬
‫دوري ‪ timer‬كما هو الحال في اإلجراءات الدورية‪ ،‬أو أحداث محددة كارتفاع درجة الحرارة مثال ً‬
‫في نظام مراقبة الحريق‪.‬‬

‫هناك نوعان من األحداث‪ :‬األحداث المتزامنة ‪ synchronous‬واألحداث الغير متزامنة‬


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

‫تجدر اإلشارة إلى أننا نعتبر المؤقت الذي يولد نبضات منتظمة (كل ‪ 5‬ميلي ثانية على سبيل المثال)‬
‫حدثا ً غير متزامن‪ .‬فعلى الرغم من أنه يمثّل حدثا ً دوريا ً (بافتراض أن المؤقت مثالي ودقيق تماما ً‬
‫وهو أمر مستحيل عملياً)‪ ،‬فإن اللحظات التي سيولد فيها مقاطعة لتدفق تنفيذ البرنامج تخضع لعوامل‬
‫عديدة ال يمكن التنبؤ بها‪ ،‬مثل اللحظة التي بدأ فيها المؤقت بالعمل نسبةً لبداية تنفيذ البرنامج وزمن‬
‫تأخير انتشار اإلشارة في النظام الحاسوبي نفسه وغيرها من العوامل‪ .‬لذلك ال يمكن التنبؤ بلحظات‬
‫المقاطعة تلك‪.‬‬

‫ذكرنا سابقا ً أن األحداث التي ال تحدث بدور منتظم تسمى أحداثا ً غير دورية ‪ .aperiodic‬تسمى‬
‫األحداث الغير دورية والتي قلما تحدث باألحداث المتباعدة ‪ .sporadic‬يبين الجدول التالي ملخصا ً‬
‫لتصنيف األحداث وبعض األمثلة عليها‪.‬‬

‫دورية‬ ‫غير دورية‬ ‫متباعدة‬

‫‪periodic‬‬ ‫‪aperiodic‬‬ ‫‪sporadic‬‬

‫متزامنة‬ ‫تعليمات برنامج في‬ ‫تعليمة قفز تقليدية‪،‬‬ ‫تعليمة قفز لمعالجة‬
‫حلقة‪ ،‬إجراءات‬ ‫مجمع النفايات في‬ ‫االستثناءات (أخطاء‬
‫‪synchronous‬‬
‫مجدولة باستعمال‬ ‫اللغات الحديثة‬ ‫زمن التنفيذ)‬

‫‪6‬‬
‫مؤقت داخلي‬ ‫‪garbage‬‬ ‫‪exception or‬‬
‫‪collection‬‬ ‫‪traps‬‬

‫غير متزامنة‬ ‫مقاطعات منتظمة‬ ‫استثناءات مولدة‬


‫مقاطعات مولدة من‬
‫ولكن ليس لها دور‬ ‫خارجياً‪ ،‬أحداثا ُ‬
‫‪asynchronous‬‬ ‫مؤقت خارجي‬
‫ثابت‬ ‫عشوائية‬

‫من المهم في أي نظام‪ ،‬وخصوصا ً في النظم المض ّمنة‪ ،‬أن يبقى النظام المتحكم به تحت سيطرة‬
‫نظام التحكم باستمرار‪ .‬يمكن أن تحدث بعض الحاالت الخاصة التي يخرج فيها النظام المتحكم به‬
‫عن السيطرة‪ .‬يجب على برنامج التحكم أن يتوقع هذه الحاالت ويتعامل معها ليعيد السيطرة على‬
‫النظام‪.‬‬

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

‫تعريف‬
‫نقول عن نظام أنه حتمي ‪ 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%‬يبين الجدول التالي بعض القيم الممكنة‬
‫لالنشغالية والحاالت النموذجية الموافقة لها‪.‬‬

‫التطبيقات النموذجية‬ ‫المنطقة التي يعمل فيها النظام‬ ‫االنشغالية (‪)%‬‬

‫إمكانيات معالجة زائدة جدا ً –‬


‫متعددة‬ ‫‪0-25‬‬
‫المعالج أقوى بكثير من الحاجة‬

‫متعددة‬ ‫آمنة جدا ً‬ ‫‪26-50‬‬

‫متعددة‬ ‫آمنة‬ ‫‪51-68‬‬

‫النظم المض ّمنة‬ ‫الحد النظري‬ ‫‪69‬‬

‫‪8‬‬
‫النظم المض ّمنة‬ ‫قريبة من الخطر‬ ‫‪70-82‬‬

‫النظم المض ّمنة‬ ‫خطيرة‬ ‫‪83-99‬‬

‫النظم المج َهدة‬ ‫تحميل زائد‬ ‫‪100+‬‬

‫يمكن حساب ‪ U‬بجمع معامالت انشغاليات اإلجراءات الدورية وغير الدورية المشاركة‪ .‬بفرض أن‬
‫النظام يحتوي على ‪ n ≥ 1‬إجراء دوري دور كل منها يساوي 𝑖𝑝 (وبالتالي يكون معدل تنفيذها‬
‫𝑖𝑝‪ .)𝑓𝑖 = 1/‬إذا علمنا أن زمن التنفيذ االعظمي التقديري (في أسوأ األحوال) لإلجراء ‪ i‬هو 𝑖𝑒‪،‬‬
‫سب معامل االنشغالية 𝑖𝑢 كما يلي‪:‬‬
‫يُح َ‬
‫𝑖𝑒‬
‫)‪(1.1‬‬ ‫= 𝑖𝑢‬
‫𝑖𝑝‬

‫بذلك تكون االنشغالية الكلية ‪ U‬للنظام مساوية لـ ‪:‬‬


‫𝑖𝑒‬
‫)‪(1.2‬‬ ‫‪𝑈 = ∑𝑛𝑖=1 𝑢𝑖 = ∑𝑛𝑖=1‬‬
‫𝑖𝑝‬

‫عادة ما يكون الحد الزمني ‪ deadline‬لإلجراء الدوري رقم ‪( i‬ونرمزه 𝑖𝑑) محدودا ً ببداية دوره‬
‫التالي‪ .‬القيمة المنطقية العظمى لـ 𝑖𝑑 هي 𝑖𝑒‪ .‬يمكن أن تكون عملية تحديد قيمة 𝑖𝑒 قبل أو بعد تنفيذ‬
‫البرنامج صعبة جدا ً أو مستحيلة في بعض األحيان‪ ،‬عندها نقدّر قيمتها تقديراً‪ .‬في حال اإلجراءات‬
‫الغير دورية ‪ aperiodic‬والمتباعدة ‪ ،sporadic‬نحسب 𝑖𝑢 بداللة الحالة األسوأ لزمن تنفيذها‬
‫والزمن الفاصل بين لحظات حدوثها‪.‬‬

‫يعرف بأنه عدد تعليمات اآللة التي ينفذها‬


‫تختلف انشغالية المعالج عن أدائه ‪ ،throughput‬الذي َّ‬
‫المعالج في الثانية‪ .‬عادة ما يُست َعمل هذا القياس لمقارنة أداء المعالجات المختلفة عند تنفيذها لتطبيق‬
‫محدد‪.‬‬

‫‪ -2‬عوامل تتعلق بتصميم نظم الزمن الحقيقي‬


‫تعتبر نظم الزمن الحقيقي فرعا ً معقدا ً من هندسة النظم الحاسوبية وتتأثر بكل من نظرية التحكم‬
‫وهندسة البرمجيات وبحوث العمليات (بسبب الحاجة لجدولة اإلجراءات ‪ .)scheduling‬يبين‬
‫الشكل التالي بعض فروع هندسة الحاسوب واإللكترونيات التي تؤثر بتحليل وتصميم نظم الزمن‬
‫الحقيق‬

‫‪9‬‬
‫خوارزميات وبنى معطيات‬ ‫لغات البرمجة‬

‫نظرية التحكم‬ ‫بحوث العمليات‬

‫نظم الزمن الحقيقي‬

‫بنيان الحواسيب‬ ‫نظرية األرتال‬

‫هندسة البرمجيات‬ ‫نظم التشغيل‬

‫يجب االنتباه إلى عدة مشاكل يجب حلها عند تصميم وتحقيق نظم الزمن الحقيقي وتتضمن‪:‬‬

‫اختيار العتاد المادي والبرمجيات وإيجاد الحل األمثل بالكلفة األقل‪.‬‬ ‫‪‬‬
‫تحديد مواصفات النظام وتصميمه واختيار التمثيل األفضل لتصرفه الزمني‪.‬‬ ‫‪‬‬
‫فهم الفروق بين لغات البرمجة المختلفة ومدى مالءمتها لنظم الزمن الحقيقي‪.‬‬ ‫‪‬‬
‫تصميم النظام بحيث تكون وثوقيته وتحمله لألخطاء أكبر ما يمكن‪.‬‬ ‫‪‬‬
‫اختبار النظام بدقة‪.‬‬ ‫‪‬‬
‫االستفادة من تقنية النظم المفتوحة والمتوافقة قدر اإلمكان‪ .‬النظام المفتوح هو مجموعة‬ ‫‪‬‬
‫مستقلة وقابلة للتوسع من التطبيقات التي تتعاون لتعمل كنظام متكامل‪ .‬على سبيل المثال‪،‬‬
‫يُستع َمل حاليا ً عد ٌد من نسخ نظام التشغيل المفتوح لينوكس ‪ Linux‬في تطبيقات الزمن‬
‫الحقيقي‪ .‬تُقاس التوافقية بمدى تحقيق النظام لمقاييس النظم المفتوحة مثل مقياس كوربا‬
‫‪ CORBA‬لنظم الزمن الحقيقي‪.‬‬
‫قياس وتقدير أزمان االستجابة لإلجراءات ومحاولة تصغيرها قدر اإلمكان‪ ،‬وإجراء تحليل‬ ‫‪‬‬
‫إلمكانية جدولة اإلجراءات‪ ،‬أي إمكانية إيجاد ترتيب ما لجدولة اإلجراءات بحيث تحترم‬
‫جمعيها حدودها الزمنية‪ .‬تدخل هذه الدراسة في نطاق نظرية الجدولة‪ ،‬وهي جزء من‬
‫بحوث العمليات‪.‬‬

‫يمكن بالطبع استعمال التقانات الهندسية لنظم الزمن الحقيقي الصعبة ‪ hard real-time‬لهندسة‬
‫األنواع األخرى من نظم الزمن الحقيقي للحصول على نظم أفضل وأكثر وثوقية ومتانة‪ .‬هذه أحد‬
‫أسباب أهمية دراسة نظم الزمن الحقيقي‪.‬‬

‫‪10‬‬
‫‪ -3‬أمثلة على نظم الزمن الحقيقي‬
‫إن نظم الزمن الحقيقي المض ّمنة متنوعة جدا ً وتوجد حتى في األلعاب واألجهزة المنزلية‪ .‬يبين‬
‫الجدول التالي بعض العينات من نظم الزمن الحقيقي ومجاالت تطبيقاتها‪.‬‬
‫التطبيقات‬ ‫المجال‬

‫المالحة‬
‫الطيران‬
‫شاشات اإلظهار‬

‫األلعاب‬
‫تعدد الوسائط‬
‫نظم المحاكاة‬

‫جراحة الروبوتات‬

‫الجراحة البعيدة‬ ‫الطب‬

‫التصوير الطبي‬

‫خطوط التجميع المؤتمتة‬


‫النظم الصناعية‬
‫التفتيش اآللي‬

‫المصاعد‬
‫النظم المدنية‬
‫السيارات‬

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

‫لنعتبر نظام القياس العطالي في الطائرة‪ .‬يبين الشكل التالي الحركات الممكنة التي يمكن أن تقوم بها‬
‫الطائرة والتي يجب على النظام قياسها‪.‬‬

‫‪11‬‬
‫زيغ‬ ‫لف‬

‫انحدار‬

‫حسب مواصفات النظام‪ ،‬ترسل تجهيزات خاصة نبضات مقياس التسارع على المحاور ‪ x‬و ‪ y‬و ‪z‬‬
‫إلى برنامج التحكم كل ‪ 10‬ميلي ثانية‪ .‬يحسب البرنامج تسارع الطائرة على المحاور الثالث‪،‬‬
‫باإلضافة إلى قيم اللف واالنحدار والزيغ الحالية للطائرة‪ .‬يصل كذلك للبرنامج قيمة درجة الحرارة‬
‫كل ثانية‪ .‬يجب عليه حساب شعاع السرعة اعتمادا ً على هذه المعطيات كل ‪ 40‬ميلي ثانية‬
‫وإظهارها للطيار‪.‬‬

‫لنناقش مثال آخر وهو نظام مراقبة لمفاعل نووي عليه التعامل مع ثالثة أحداث يُ َّدل عليها‬
‫بمقاطعات‪ .‬يحدث الحدث األول عندما تكتشف نقاط المراقبة األمنية أي اختراق أمني للمفاعل‪ .‬يحب‬
‫على النظام في هذه الحالة االستجابة خالل ثانية واحدة إلطالق أجهزة اإلنذار‪ .‬يدل الحدث الثاني‬
‫واألهم على حدوث ارتفاع كبير لدرجة الحرارة في المفاعل‪ ،‬ويجب االستجابة له خالل ميلي ثانية‬
‫واحدة فقط‪ .‬أخيراً‪ ،‬يجب تحديث شاشة اإلظهار ‪ 30‬مرة في الثانية‪.‬‬

‫المثال التالي هو نظام حجز التذاكر لشركة طيران‪ .‬قررت إدارة الشركة أنه يجب أال يتجاوز زمن‬
‫االنتظار الكلي ألي عملية حجز ‪ 15‬ثانية حتى ال يؤدي ذلك إلى عدم رضا الزبائن‪ .‬يجب كذلك أال‬
‫يسمح النظام بالحجز الزائد عن عدد المقاعد المتوفرة‪ .‬يمكن لعدة وكالء أن يحاولوا الوصول إلى‬
‫قاعدة المعطيات في نفس الوقت لحجز نفس المقعد‪ .‬لذلك يجب تزويد النظام بإمكانيات االتصال‬
‫والقفل الالزمة لذلك‪.‬‬

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

‫‪12‬‬
‫‪ -4‬بعض المعتقدات الخاطئة المتعلقة بنظم الزمن الحقيقي‬
‫من المهم أن نذكر بعض المعتقدات الشائعة الخاطئة لفهم طبيعة نظم الزمن الحقيقي فهما ً كامالً‪.‬‬
‫نلخص فيما يلي هذه المعتقدات‪:‬‬

‫"نظم الزمن الحقيقي" هي من مرادفات "النظم السريعة"‪ :‬يأتي هذا االعتقاد الخاطئ من‬ ‫‪‬‬
‫حقيقة أن العديد من نظم الزمن الحقيقي تتعامل حقا ً مع حدود زمنية من رتبة الميلي ثانية‪،‬‬
‫كما هو حال نظم المالحة الجوية‪ .‬لكن هناك كذلك نظم زمن حقيقي أخرى بطيئة مثل نظام‬
‫حجز تذاكر الطيران‪ .‬المهم في نظم الزمن الحقيقي هو النجاح في تحقيق الحدود الزمنية‬
‫وليس السرعة‪.‬‬
‫تحل خوارزمية الجدولة ‪ )Rate Monotonic( RM‬مشكلة الزمن الحقيقي‪ :‬تعتبر هذه‬ ‫‪‬‬
‫الخوارزمية من أكثر خوارزميات جدولة اإلجراءات الدورية شهرة ً في أدبيات نظم الزمن‬
‫الحقيقي منذ عام ‪ .1970‬وهي بسيطة وتعطي عادة نتائج جيدة‪ ،‬لكنها ليست دائما ً الحل‬
‫السحري لنظم الزمن الحقيقي‪ .‬سندرس هذه الخوارزمية بالتفصيل في الفصول الالحقة‪.‬‬
‫هناك طرق عامة ومقبولة دائما ً لتصميم ووضع مواصفات نظم الزمن الحقيقي‪ :‬ال توجد‬ ‫‪‬‬
‫لألسف مثل هذه الطرق وذلك لصعوبة إيجاد حلول عامة لكل الحاالت‪ .‬يجب دراسة‬
‫وتصميم كل نظام على حدا حسب خصوصيته‪.‬‬
‫ال حاجة لبناء نظم تشغيل الزمن الحقيقي من الصفر وذلك لتوفر الكثير من الحلول‬ ‫‪‬‬
‫التجارية‪ :‬صحيح أن هناك العديد من نظم تشغيل الزمن الحقيقي الشائعة ذات الكلفة‬
‫المقبولة‪ ،‬لكنها ليس مناسبة لكل تطبيقات الزمن الحقيقي‪ .‬نحتاج أحيانا ً لكتابة نظام تشغيل‬
‫مناسب لتطبيق محدد من الصفر‪ ،‬أو تعديل نظام تشغيل جاهز ليتناسب مع خصوصية‬
‫التطبيق‪ .‬كذلك فإن اختيار نظام التشغيل المناسب من بين النظم المتوفرة ليس باألمر‬
‫السهل‪.‬‬
‫تتعلق معظم دراسة نظم الزمن الحقيقي بدراسة نظرية الجدولة‪ :‬غالبا ً ما تكون النتائج التي‬ ‫‪‬‬
‫يحصل عليها الباحثون في نظرية الجدولة غير عملية وليس لها قيمة كبيرة هندسيا ً‪ .‬لذلك‬
‫سنناقش في هذا الكتاب الخوارزميات القابلة للتطبيق عمليا ً فقط‪.‬‬

‫‪ -5‬لمحة تاريخية مختصرة‬


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

‫‪13‬‬
‫‪ -1 -5‬التطورات النظرية‬
‫إن معظم نظريات نظم الزمن الحقيقي مشتقة من نظريات فروع العلوم األخرى التي تعتمد عليها‬
‫والتي ذكرناها سابقاً‪ ،‬وتأثرت بشكل خاص بالتطورات النظرية لبحوث العمليات التي حصلت في‬
‫نهاية األربعينيات ونظرية األرتال ‪ Queuing Theory‬التي تطورت في نهاية الخمسينيات‪.‬‬

‫تبلورت النتائج النظرية المتعلقة بوثوقية وتنبؤية ‪ predictability‬نظم الزمن الحقيقي في‬
‫الثمانينيات والتسعينيات من القرن العشرين‪ .‬وجرت كذلك في هذه الفترة دراسة المشاكل المتعلقة‬
‫بنظم الزمن الحقيقي متعددة المعالجات ‪.multiprocessing‬‬

‫‪ -2 -5‬بعض نظم الزمن الحقيقي المبكرة‬


‫يمكن اعتبار أن بداية ظهور مفهوم نظام الزمن الحقيقي بشكل واضح كان في النظامين‬
‫‪( Whirlwind‬وهو نظام محاكاة طيران طورته شركة ‪ IBM‬لمصلحة البحرية األمريكية ‪US‬‬
‫طور لمصلحة القوى الجوية‬ ‫‪ Navy‬في عام ‪ )1947‬و ‪( SAGE‬وهو نظام محاكاة للدفاع الجوي ّ‬
‫األمريكية ‪ US Air Force‬في بدايات الخمسينيات)‪ .‬يحقق هذين النظامين المعايير التي تجعلهما‬
‫يُصنَّفان كنظم زمن حقيقي فعلية‪.‬‬

‫من األمثلة األخرى على نظم الزمن الحقيقي المبكرة نجد النظام ‪ ،SABRE‬وهو نظام حجز‬
‫للخطوط الجوية طورته الخطوط الجوية األمريكية عام ‪.1959‬‬

‫‪ -3 -5‬برمجيات الزمن الحقيقي المبكرة‬


‫ُكتبت برمجيات الزمن الحقيقي األولية بلغة اآللة أو لغة التجميع ‪ ،Assembly‬ثم استُعملت الحقا ً‬
‫اللغات ذات المستوى األعلى لهذا الغرض مثل ‪ Fortran‬و ‪.CMS-2‬‬

‫تبنّت إدارة الدفاع األمريكية ‪ Department of Defense‬في السبعينيات من القرن العشرين‬


‫فكرة تطوير لغة برمجة موحدة يمكن استعمالها لبرمجة جميع الخدمات الممكنة‪ ،‬وتؤمن البنى‬
‫البرمجية عالية المستوى الضرورية لبرمجة نظم الزمن الحقيقي‪ .‬ظهرت لغة ‪ ADA‬نتيجة لذلك‬
‫عام ‪ 1983‬بعد عدة عمليات انتقاء وتحسين‪ ،‬وكان من المتوقع أن تكون هي اللغة المثلى لجميع‬
‫سنة من ‪ ADA‬سميت ‪ ADA-95‬تحل بعض‬ ‫التطبيقات‪ .‬في العام ‪ ،1995‬صدرت نسخة مح ّ‬
‫المشاكل التي اكتشفت في النسخة األصلية‪.‬‬

‫لكن يستعمل عدد قليل فقط من المبرمجين لغة ‪ 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‬‬
‫بعض الواصفات األخرى (زمن التنفيذ الكلي‪ )... ،‬ومجموعة المصادر (ملفات‪ ،‬أجهزة‪ )... ،‬التي‬
‫يحجزها هذا اإلجراء‪.‬‬

‫النيسب ‪ thread‬هو إجراء خفيف ‪ lightweight‬يتشارك بالمصادر مع بعض النياسب األخرى‪.‬‬


‫يتألف كل إجراء من عدة نياسب (واحد على األقل) تشاركه مصادره التي يحجزها‪ .‬يصعب عادة‬
‫المكونة لنفس اإلجراء‪.‬‬
‫ّ‬ ‫مشاركة المصادر بين عدة إجراءات‪ ،‬لكن المشاركة سهلة بين النياسب‬

‫يجب على نظام تشغيل الزمن الحقيقي أن يؤ ّمن ثالثة خدمات لإلجراءات‪ :‬الجدولة ‪scheduling‬‬
‫والتوزيع ‪ dispatching‬واالتصال والتزامن بين اإلجراءات ‪intercommunication and‬‬
‫‪ .synchronization‬نواة نظام التشغيل ‪ kernel‬هي الجزء األصغر من نظام التشغيل الذي‬
‫يؤمن هذه المهام الثالث‪ .‬كما ذكرنا سابقاً‪ ،‬يحدد المجدول ‪ scheduler‬اإلجراء الذي سينفذ في‬
‫نظام تشغيل متعدد المهام ‪ ،multitasking‬بينما يقوم الموزع ‪ dispatcher‬بالعمليات التنظيمية‬
‫الالزمة لتنفيذ هذا اإلجراء‪ .‬أخيراً‪ ،‬يضمن الجزء الثالث أن اإلجراءات تتعاون وتتواصل فيما بينها‪.‬‬
‫يبين الشكل التالي طبقات نظام التشغيل المختلفة والمهام التي تقوم بها‪.‬‬

‫المستخدم‬

‫نظام التشغيل‬ ‫برنامج ‪shell‬‬

‫التنفيذي ‪Executive‬‬ ‫دعم لألقراص والملفات‬

‫النواة‬ ‫االتصال والتزامن بين اإلجراءات‬

‫النواة الصغرية ‪micro-kernel‬‬ ‫جدولة اإلجراءات‬

‫النانو‪-‬نواة ‪nano-kernel‬‬ ‫إدارة النياسب‬

‫العتاد المادي‬

‫تؤمن النانو‪-‬نواة مهمة إدارة النياسب فقط‪ ،‬بينما تهتم النواة الصغرية بجدولة اإلجراءات‪ .‬تؤمن‬
‫النواة عمليات التزامن واالتصال بين اإلجراءات باستعمال العالمات ‪ semaphore‬وصناديق‬

‫‪16‬‬
‫البريد ‪ mailboxes‬وغيرها من الطرق األخرى‪ .‬الجزء "التنفيذي" ‪ Executive‬من نظام تشغيل‬
‫الزمن الحقيقي هو نواة تتضمن عمليات إدارة كتل الذاكرة وأجهزة الدخل‪/‬خرج وغيرها من‬
‫العمليات المعقدة‪ .‬معظم أنظمة تشغيل الزمن الحقيقي التجارية هي فقط هذا الجزء "التنفيذي" وال‬
‫تتضمن الطبقات األدنى‪ .‬أخيراً‪ ،‬تؤمن طبقة نظام التشغيل األعلى واجهات التخاطب مع المستخدم‬
‫واألمن وإدارة الملفات وغيرها‪.‬‬

‫مهما كان بنيان نظام التشغيل المستعمل‪ ،‬يبقى الهدف األساسي منه هي تلبية متطلبات الزمن‬
‫الحقيقي وتأمين بيئة عمل متعددة المهام متينة ومرنة‪.‬‬

‫‪ -1 -1‬أشباه النوى ‪pseudo-kernels‬‬


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

‫‪ -1 -1 -1‬حلقة االستقصاء ‪polling loop‬‬


‫عادة ما تُست َعمل حلقة االستقصاء لالستجابة السريعة لجهاز واحد‪ .‬وهي تتألف من حلقة غير منتهية‬
‫تحوي تعليمة اختبار متكرر لعالم ‪ flag‬يدل على حدوث أو عدم حدوث حدث ما‪ .‬تسمى عملية‬
‫الفحص المتكررة هذه "استقصاء" ‪.polling‬‬

‫على سبيل المثال‪ ،‬نفترض أننا بحاجة لنظام برمجي لمعالجة حزم ‪ packets‬من المعطيات بمعدل‬
‫ال يزيد عن حزمة واحدة في الميلي الثانية‪ .‬نفترض أنه لدينا عالم اسمه ‪ packet_here‬تصبح‬
‫قيمته ‪ 1‬عندما يستلم كرت الشبكة حزمة من المعلومات‪ .‬يبين البرنامج البسيط التالي حلقة استقصاء‬
‫مكتوبة بلغة ‪ C‬يتعامل مع حزم المعطيات الواردة‪:‬‬

‫{ ) ; ; ( ‪for‬‬ ‫‪/* do forever */‬‬


‫{ )‪if (packet_here‬‬ ‫‪/* check flag */‬‬
‫;)(‪process_data‬‬ ‫‪/* process data */‬‬
‫;‪packet_here = 0‬‬ ‫‪/* reset flag */‬‬
‫}‬
‫}‬
‫مكون من معالج وحيد مخصص للتعامل مع دخل‪/‬خرج سريع‪ .‬عادة‬ ‫تناسب هذه الطريقة حالة نظام ّ‬
‫ما تُستع َمل هذه الطريقة كإجراء خلفي ‪ background task‬في النظم المقادة بالمقاطعات‪ ،‬أو‬
‫كإجراء دوري‪ .‬تدور حلقة االستقصاء في هذه الحالة عددا ً قليالً من المرات كي ال تستأثر بالمعالج‬
‫ولتسمح لباقي اإلجراءات بالتنفيذ‪ ،‬وتقوم باقي اإلجراءات بتنفيذ المعالجة التي ال عالقة لها بالحدث‪.‬‬

‫‪17‬‬
‫‪ -2 -1 -1‬حلقة االستقصاء المتزامنة ‪Synchronized polling loop‬‬
‫هذه الطريقة مشابهة للطريقة السابقة‪ ،‬لكنها تضيف تأخيرا ً زمنيا ً بين لحظة االستجابة للحدث ولحظة‬
‫تصفير ‪ reset‬العالم (أي قبل السطر ";‪ "packet_here=0‬في المثال السابق)‪ .‬يُستفاد من هذه‬
‫الخوارزمية لالستجابة لألحداث التي تتصف بما يسمى "بارتداد المفتاح" ‪.switch bounce‬‬
‫تحدث هذه الظاهرة عندما يكون مسبب الحدث مفتاحا ً ميكانيكيا ً أو كهربائيا ً‪ ،‬ألنه من المستحيل صنع‬
‫مفتاح يغير حالته لحظيا ً دون اهتزاز لتماساته‪ .‬يبين الشكل التالي مخططا ً زمنيا ً لمفتاح لحظة إغالق‬
‫تماساته‪ .‬يظهر جليا ً من المخطط أن اهتزاز تماسات المفتاح سبب عدة األحداث متتالية‪ ،‬األول منها‬
‫حدث في اللحظة ‪ 𝑡0‬وهو صحيح واألحداث التالية التي حدثت في اللحظات ‪ 𝑡1‬و ‪ 𝑡2‬هي خاطئة‪.‬‬
‫عند إضافة تأخير زمني كاف (أكبر من الفرق الزمني بين ‪ 𝑡0‬و ‪ )𝑡2‬قبل تصفير عالم الحدث‪ ،‬لن‬
‫تسبب األحداث الخاطئة استجابات من النظام ألنه يكون عندها في حالة انتظار انقضاء فترة التأخير‬
‫الزمني‪.‬‬

‫حدث صحيح‬ ‫حدث خاطئ‬ ‫حدث خاطئ‬

‫الزمن‬
‫إغالق المفتاح‬
‫على سبيل المثال‪ ،‬إذا فرضنا أن ارتداد المفتاح يزول بعد ‪ 20‬ميلي ثانية‪ ،‬يمثّل البرنامج التالي‬
‫المكتوب بلغة ‪ C‬حلقة استقصاء متزامنة مناسبة له‪ .‬تعليمة )‪ pause(20‬هي استدعاء لخدمة من‬
‫نظام التشغيل تج ّمد تنفيذ البرنامج لمدة ‪ 20‬ميلي ثانية‪.‬‬

‫{ ) ; ; ( ‪for‬‬ ‫‪/* do forever */‬‬


‫{ )‪if (flag‬‬ ‫‪/* check flag */‬‬
‫;)(‪process_data‬‬ ‫‪/* process data */‬‬
‫;)‪pause(20‬‬ ‫‪/* wait 20 ms */‬‬
‫;‪flag = 0‬‬ ‫‪/* reset flag */‬‬

‫‪18‬‬
‫}‬
‫}‬
‫تتميز حلقات االستقصاء بأنها مناسبة جدا ً لالستجابة ألقنية المعطيات السريعة‪ ،‬وخاصة عندما‬
‫تحدث األحداث بلحظات غير منتظمة ويكون المعالج مخصصا ً لمعالجتها فقط‪ .‬لكنها غير كافية‬
‫عندما يكون النظام معقداً‪ ،‬وهي تضيع الكثير من وقت المعالج وخصوصا ً عندما تكون األحداث‬
‫قليلة الحدوث‪.‬‬

‫‪ -3 -1 -1‬التنفيذي الدوري ‪Cyclic Executive‬‬


‫نظام "التنفيذي الدوري" هو نظام غير مقاد بالمقاطعات (أي ال يعتمد على المقاطعات في عمله)‬
‫ويعطي انطباعا ً بالتنفيذ المتوازي لعدة إجراءات قصيرة على معالج سريع‪ .‬يتألف النظام من حلقة‬
‫غير منتهية تستدعي اإلجراءات على التتالي كما هو مبين في المثال التالي‪:‬‬

‫{ ) ; ; ( ‪for‬‬ ‫‪/* do forever */‬‬


‫;)(‪Process_1‬‬
‫;)(‪Process_2‬‬
‫…‬
‫;)(‪Process_n‬‬

‫}‬
‫موزع بالتساوي على جميع اإلجراءات ألنه يدور عليهم‬ ‫ّ‬ ‫نالحظ في هذا المثال أن زمن المعالج‬
‫الدوار" ‪ .round-robin‬يمكن بسهولة تعديل الحلقة السابقة إلعطاء إجراءات‬ ‫بأسلوب "الشريط ّ‬
‫محددة أزمان تنفيذ أكبر (وبالتالي أولوية وسرعة استجابة أكبر) كما هو مبين في المثال التالي الذي‬
‫يعطي اإلجراء ‪ Process_3‬زمن تنفيذ يساوي ضعف زمن تنفيذ اإلجراءات األخرى‪.‬‬

‫{ ) ; ; ( ‪for‬‬ ‫‪/* do forever */‬‬


‫;)(‪Process_1‬‬
‫;)(‪Process_2‬‬
‫;)(‪Process_3‬‬
‫;)(‪Process_3‬‬
‫}‬
‫}‬
‫لنأخذ على سبيل المثال برنامج لعبة فيديو بسيطة تتألف من مدفع يتحرك لليمين واليسار في أسفل‬
‫الشاشة ويطلق الصواريخ على سفن فضاء تتحرك أعلى الشاشة‪ .‬المهام األساسية التي يجب أن‬
‫ين فذها البرنامج هي تلبية أزرار لوحة المفاتيح وتحريك السفن األعداء واختبار حدوث تصادم (بين‬
‫الصاروخ وسفينة فضاء أو بين صواريخ األعداء والمدفع) وتحديث الشاشة‪ .‬بالتالي‪ ،‬يمكن أن يكون‬
‫الشكل العام للبرنامج كما يلي‪:‬‬

‫{ ) ; ; ( ‪for‬‬ ‫‪/* do forever */‬‬

‫‪19‬‬
‫;)(‪check_for_keypressed‬‬
‫;)(‪move_aliens‬‬
‫;)(‪check_for_keypressed‬‬
‫;)(‪check_for_collision‬‬
‫;)(‪check_for_keypressed‬‬
‫;)(‪update_screen‬‬

‫}‬
‫الحظ أن اإلجراء )(‪ check_for_keypressed‬الذي يخدّم لوحة المفاتيح قد استدعي ثالثة‬
‫مرات ضمن الحلقة‪ ،‬وهو بالتالي يُنفَّذ بمعدل أكبر بثالثة مرات من باقي اإلجراءات‪ .‬السبب في ذلك‬
‫هو أنه من الضروري أن يستجيب النظام بسرعة لضغطات الالعب على لوحة المفاتيح‪ .‬إذا كانت‬
‫اإلجراءات السابقة قصيرة نسبيا ً ومتجانسة الطول‪ ،‬نحصل على انطباع أنها تعمل على ا ّ‬
‫لتفرع دون‬
‫الحاجة للمقاطعات ‪ .interrupts‬لكن هذا األسلوب مناسب فقط لنظم الزمن الحقيقي البسيطة فقط‬
‫بسبب صعوبة تقسيم النظام إلى إجراءات متقاربة الطول باإلضافة إلى أزمان التأخير التي يمكن أن‬
‫تصبح طويلة في بعض الحاالت‪.‬‬

‫‪ -4 -1 -1‬البرمجة المقادة بالحالة ‪State-driven coding‬‬


‫الفكرة في هذا األسلوب هي تقسيم اإلجراء إلى عدة أقسام كل منها يقابل حالة ‪ state‬ما‪ .‬ثم يُبر َمج‬
‫اإلجراء باستعمال بتعليمات ‪ if-else‬متداخلة أو تعليمات ‪ case‬أو أية طريقة أخرى تعبّر عن‬
‫أوتومات منتهي )‪.Finite State Automata (FSA‬‬

‫على سبيل المثال‪ ،‬تخيّل اإلجراء الذي يحقق بروتوكول اتصال ما (مثل ‪ FTP‬أو ‪ )... POP3‬من‬
‫ناحية المخدّم‪ .‬يمكن تقسيم هذا اإلجراء بالطريقة المذكورة أعاله بسهولة كما يلي‪:‬‬

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

‫تسمح طريقة التقسيم هذه بتجميد إجراء ما لفترة مؤقتة دون اإلخالل بعمله (وذلك بتجميده بعد‬
‫االنتهاء من تنفيذ تعليمة ‪ if‬الموافقة للحالة الحالية)‪ .‬يس ّهل هذا األمر عملية تحقيق تعددية المهام‬
‫بأساليب مثل "الروتينات التعاونية" ‪ Co-routines‬التي سنراها في الفقرة التالية‪ .‬كذلك‪ ،‬تناسب‬

‫‪20‬‬
‫طريقة التقسيم هذه أسلوب "التنفيذي الدوري" عندما تكون اإلجراءات طويلة جدا ً أو متفاوتة‬
‫األطوال‪.‬‬

‫من ميزات هذه الطريقة أيضا ً أنها مبنية على فكرة األوتومات المنتهي ‪ .FSA‬توجد طرق رياضية‬
‫خوارزمية ألمثلة ‪ optimization‬األوتومات‪ ،‬وهناك أيضا ً العديد من الدراسات والنظريات التي‬
‫يمكن استعمالها للحصول على أفضل تصميم للنظام‪.‬‬

‫لكن‪ ،‬ليست كل اإلجراءات مناسبة لهذه الطريقة‪ ،‬حيث توجد بعض اإلجراءات ال تسمح طبيعتها بأن‬
‫سم لحاالت‪ .‬كذلك‪ ،‬يمكن أن يكون عدد الحاالت كبير جدا ً مع وجود عالقات بينها‪ ،‬مما يعقّد كثيرا ً‬ ‫تق ّ‬
‫عملية تحقيقها برمجياً‪.‬‬

‫‪ -5 -1 -1‬الروتينات التعاونية ‪Co-routines‬‬


‫وتسمى أيضا ً "تعددية المهام التعاونية" ‪ cooperative multitasking‬وتحتاج لبرمجة منضبطة‬
‫وتطبيق مناسب لكي تعمل بنجاح‪ .‬تتألف النواة التي تعمل بهذا األسلوب من إجرائين أو أكثر‬
‫مكتوبين بأسلوب البرمجة المقادة بالحالة المشروحة في الفقرة السابقة‪ .‬بعد االنتهاء من تنفيذ الحالة‬
‫عى موزع ‪ dispatcher‬مركزي الذي يقوم باختيار اإلجراء‬ ‫الفعّالة من اإلجراء الفعّال‪ ،‬يُستد َ‬
‫عى الموزع‬ ‫التالي الذي سيتم استدعاؤه‪ .‬وبعد االنتهاء من تنفيذ الحالة الفعّالة من هذا اإلجراء‪ ،‬يُستد َ‬
‫من جديد وهكذا‪.‬‬

‫تتصل اإلجراءات فيما بينها باستعمال المتحوالت العامة ‪ ،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‬‬
‫التي يمكنها أن تترك المعالج بفواصل منتظمة والتي يمكن تقسيمها ألجزاء منتظمة‪ .‬كذلك فإن‬
‫طريقة االتصال الوحيدة المتاحة بين اإلجراءات هي باستعمال المتحوالت العامة‪ ،‬وهو أمر غير‬
‫مرغوب به عموماً‪.‬‬

‫‪ -2 -1‬النظم المقادة بالمقاطعة ‪Interrupt-driven systems‬‬


‫في هذا النوع من النظم‪ ،‬يتألف البرنامج الرئيسي من حلقة فارغة (ال تحوي تعليمات) غير منتهية‪،‬‬
‫تجدول باستعمال مقاطعات مادية ‪ hardware‬أو برمجية‬ ‫َ‬ ‫باإلضافة إلى اإلجراءت المختلفة التي‬
‫‪ .software‬تجري عملية التوزيع ‪ dispatching‬ضمن روتين تخديم المقاطعة‪.‬‬

‫عند استعمال الجدولة بالمقاطعة المادية‪ ،‬تولّد ساعة خارجية أو أي جهاز خارجي إشارات مقاطعة‬
‫تو َّجه إلى متحكم مقاطعات مخصص ‪ ،interrupt controller‬الذي يقوم بدوره بتوجيهها إلى‬
‫المعالج حسب ترتيب ورودها وأولوياتها‪ .‬إذا كان التصميم المادي للنظام (المعالج بشكل أساسي)‬
‫يدعم عدة مقاطعات‪ ،‬عندها يقوم العتاد المادي أيضا ً بعملية التوزيع (أي استدعاء اإلجراء الموافق‬
‫للمقاطعة)‪ .‬أما إذا دعم المعالج مقاطعة واحدة فقط‪ ،‬عندها تصبح مسؤولية التوزيع ملقاة على عاتق‬
‫روتين تخديم المقاطعة وذلك بسؤال متحكم المقاطعات عن مصدر المقاطعة ثم القفز إلى اإلجراء‬
‫المسؤول عن تلبيتها‪.‬‬

‫‪ -1 -2 -1‬روتينات تخديم المقاطعات )‪Interrupt Service Routines (ISR‬‬


‫من المهم فهم كيفية عمل المقاطعات عند كتابة برمجيات النظم المض ّمنة‪ ،‬ألنه غالبا ً ما يتطلب‬
‫برنامج الزمن الحقيقي تلبية مقاطعات تجهيزات النظام المختلفة‪ .‬إما أن يقوم مهندس البرمجيات‬
‫سواقة الجهاز ‪ device driver‬من الصفر (وهي هنا تلعب دور روتينات تخديم المقاطعة)‪،‬‬ ‫بكتابة ّ‬
‫أو يقوم بتعديل وتخصيص سواقة جهاز عامة ‪ generic‬بما يتناسب مع خصوصية الجهاز المادي‬
‫المكتوبة ألجله‪ .‬يوجد نوعان للمقاطعة في أي نظام‪:‬‬

‫سل إلى‬‫‪ ‬مقاطعات مادية‪ :‬وهي إشارات تولّدها التجهيزات المحيطية ‪ peripherals‬وتر َ‬
‫المعالج الذي يستجيب لها بتنفيذ روتين تخديم المقاطعة ‪ .ISR‬يتولى هذا الروتين (وهو‬
‫برنامج جزئي عادي) بالقيام بما يلزم لتلبية هذه المقاطعة‪ .‬هذه المقاطعات هي الوسيلة التي‬
‫تم ّكن التجهيزات المحيطية من إخبار المعالج بحاجتها ألن يلتفت إليها لسبب ما (حدوث‬
‫خطأ‪ ،‬إنتهاء عملية دخل‪/‬خرج‪.)... ،‬‬
‫‪ ‬مقاطعات برمجية‪ :‬تشبه المقاطعات المادية‪ ،‬لكن مصدر المقاطعة هو تعليمات خاصة‬
‫عى برمجياً‪ .‬عادة ما يُستّعمل هذا النوع من المقاطعات الستدعاء الخدمات التي يقدمها‬‫تُستد َ‬
‫نظام التشغيل (التي تكون على شكل روتينات تخديم هذه المقاطعات البرمجية)‪.‬‬

‫‪23‬‬
‫يوجد في لغات البرمجة الحديثة مفهوما ً هاما ً هو "االستثناءات" ‪ exceptions‬التي تعتبَر بمثابة‬
‫مقاطعات برمجية داخلية (أي يولّدها المعالج داخلياً) عندما يحاول البرنامج تنفيذ عمليات غير‬
‫قانونية وغير متوقعة (مثل التقسيم على صفر أو محاولة فتح ملف غير موجود)‪ .‬يقفز المعالج عند‬
‫حدوث االستثناء إلى روتين تخديم المقاطعة وينفّذ التعليمات الموافقة له‪.‬‬

‫توصف المقاطعات المادية بأنها ذات طبيعة غير متزامنة‪ ،‬أي أنها يمكن أن تحدث في أية لحظة‪.‬‬
‫وعندما تحدث‪ ،‬يتوقف تنفيذ البرنامج الذي كان المعالج ينفذه وينتقل التنفيذ (فورا ً أو بعد حين) إلى‬
‫مطور النظام عادة ً لكتابة ‪ ISR‬لبعض المقاطعات المادية‪،‬‬ ‫ّ‬ ‫روتين تخديم المقاطعة ‪ .ISR‬يحتاج‬
‫ومن المهم عندها أن يفهم جيدا ً م َّم تتألف حالة المعالج وما هي السجالت التي يجب على ‪ ISR‬أن‬
‫يحفظها‪.‬‬

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

‫نقول عن ‪ ISR‬أنه "قابل إلعادة الدخول" ‪ reentrant‬إذا سمح بتلبية أي مقاطعة قبل أن ينتهي‬
‫تنفيذه (حتى ولو كانت المقاطعة الجديدة هي نفسها التي يقوم بتلبيتها حاليا ً لكن حدثت لسبب آخر)‪.‬‬
‫مهما كان نوع المقاطعة (مادية أو برمجية)‪ ،‬يجب على ‪ ISR‬تخزين حالة النظام (وهو ما يسمى‬
‫طع بعد‬‫بالسياق ‪ )context‬قبل أن يقوم بعمله حتى يكون باإلمكان متابعة تنفيذ اإلجراء المقا َ‬
‫االنتهاء من تلبية المقاطعة‪.‬‬

‫‪ -2 -2 -1‬تبديل السياق ‪context switch‬‬


‫نعرف تبديل السياق بأنه عملية حفظ معلومات كافية (سياق) عن إجراء زمن حقيقي نتيجة مقاطعته‪،‬‬ ‫ّ‬
‫بحيث يمكن متابعة تنفيذه الحقا ً بعد االنتهاء من تنفيذ روتين تخديم المقاطعة‪ .‬يُستع َمل هذا المصطلح‬
‫أيضا ُ عندما ينقل الموزع التنفيذ من إجراء آلخر‪ :‬تحفظ معلومات األول وتُستر َجع معلومات الثاني‬
‫ليتابع التنفيذ بدالً من األول‪.‬‬

‫تُح َفظ معلومات السياق عادة على مكدس النظام ‪ .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 */‬‬
‫}‬

‫) ( ‪void int1‬‬ ‫‪/* interrupt handler 1 */‬‬


‫{‬
‫;)‪save(context‬‬ ‫‪/* save context on stack */‬‬
‫;) (‪task1‬‬ ‫‪/* execute task 1 */‬‬
‫‪restore(context); /* restore context from stack */‬‬
‫}‬

‫) (‪void int2‬‬ ‫‪/* interrupt handler 2 */‬‬


‫{‬
‫;)‪save(context‬‬ ‫‪/* save context on stack */‬‬
‫;) (‪task2‬‬ ‫‪/* execute task 2 */‬‬
‫;)‪restore(context‬‬ ‫‪/* restore context from stack */‬‬
‫}‬

‫‪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‬باسترجاعها منه‪.‬‬

‫‪ -3 -1‬نظم األولوية الشفعية ‪preemptive-priority‬‬


‫شفع (اغتصاب‪ ،‬سرقة) المعالج من اإلجراء قيد التنفيذ‬ ‫نقول عن إجراء ذو أولوية أعلى أنه يقوم ب ُ‬
‫والذي أولويته أقل إذا قاطعه وجعل المعالج ينفذ تعليماته‪ .‬تُس َّمى النظم التي تستعمل أسلوب الجدولة‬
‫هذا بدالً من األساليب األخرى (الشريط الدوار ‪ round-robin‬أو القادم أوالً يُخدَّم أوالً ‪first‬‬
‫‪ )come first serviced‬بنظم األولوية الشفعية‪ .‬تعتمد أولويات المقاطعات على أهمية وإلحاح‬
‫المهمات المناطة بها‪ .‬على سبيل المثال‪ ،‬الطريقة األمثل لتحقيق نظام مراقبة بمحطة توليد كهرباء‬
‫نووية هي طريقة األولوية الشفعية‪ .‬صحيح أن التعامل مع دخيل على المحطة هو أمر مهم‪ ،‬لكن ال‬
‫شيء أهم من التعامل مع إنذار ارتفاع درجة حرارة نواة المفاعل‪ ،‬وله بالتالي األولوية األكبر‪.‬‬

‫يمكن أن تكون أولويات المقاطعات ساكنة أو ديناميكية (قابلة للتغيير)‪ .‬النظم ذات المقاطعات الساكنة‬
‫أقل مرونة ألنه ال يمكن تغيير أولويات المقاطعات أثناء عمل النظام بما يتناسب مع تغير احتياجاته‪،‬‬
‫بينما يمكن عمل ذلك في النظم ذات المقاطعات الديناميكية‪.‬‬

‫تعاني نظم األولوية الشفعية من مشكلة استئثار اإلجراءات ذات األولوية األعلى بالمصادر المتاحة‬
‫في النظام‪ ،‬مما يؤدي لحرمان اإلجراءات ذات األولوية األدنى منها‪ .‬نقول في هذه الحالة أن‬
‫اإلجراءات ذات األولوية األقل تعاني من مشكلة "المجاعة" ‪.starvation‬‬

‫هناك نوع خاص من نظم األولوية الشفعية المقادة بالمقاطعات تسمى النظم "رتيبة المعدّل" ‪Rate‬‬
‫طى فيها األولوية‬‫‪ ،Monotonic‬وهي تضم نظم الزمن الحقيقي ذات اإلجراءات الدورية التي يُع َ‬
‫األعلى لإلجراء الدوري الذي له أعلى معدل تنفيذ (أي يُنفَّذ عددا ً أكبر من المرات في الثانية)‪ .‬هذا‬
‫األسلوب شائع في النظم المض ّمنة وخصوصا ً نظم الطيران‪ ،‬وهناك الكثير من الدراسات حوله‪.‬‬
‫صل المعطيات من جهاز قياس‬ ‫لنأخذ على سبيل المثال نظام المالحة في الطائرة‪ .‬اإلجراء الذي يح ّ‬
‫صل معطيات‬ ‫التسارع كل ‪ 10‬ميلي ثانية له أعلى أولوية‪ .‬يأتي في الدرجة الثانية اإلجراء الذي يح ّ‬

‫‪26‬‬
‫التوازن كل ‪ 40‬ميلي ثانية‪ .‬أما اإلجراء الذي يُظهر المعطيات على شاشة الطيار كل ثانية فله‬
‫األولوية األدنى‪ .‬سندرس النظم الرتيبة المعدّل في الفقرات التالية بالتفصيل‪.‬‬

‫‪ -4 -1‬النظم الهجينة ‪hybrid systems‬‬


‫تحتوي هذه النظم على مقاطعات تحدث دوريا ً تعبّر عن اإلجراءات الدورية ‪ ،periodic‬باإلضافة‬
‫إلى مقاطعات غير دورية تعبّر عن اإلجراءات الغير دورية ‪ aperiodic‬أو المتباعدة ‪.sporadic‬‬
‫يمكن استعمال المقاطعات الغير دورية لمعالجة األخطاء الحرجة التي تحدث استثنائيا ً ويجب‬
‫معالجتها فوراً‪ ،‬وبالتالي يكون لها األولوية األعلى‪ .‬عادة ما نجد هذا الخليط من المقاطعات في النظم‬
‫المض ّمنة أيضاً‪.‬‬

‫شفعية مع‬‫هناك نوع آخر من النظم الهجينة موجود في نظم التشغيل التجارية وهو مزيج من النظم ال ُ‬
‫أسلوب الشريط الدوار ‪ .round-robin‬في هذه النظم‪ ،‬يمكن دائما ً لإلجراءات ذات األولوية‬
‫شفع ‪ preempt‬اإلجراءات ذات األولوية األدنى‪ .‬لكن إذا وجد المجدول عدة‬ ‫األعلى أن تقوم ب ُ‬
‫إجراءات لها نفس األولوية وجاهزة للتنفيذ‪ ،‬يقوم بجدولتها بطريقة الشريط الدوار التي سندرسها‬
‫الحقاً‪.‬‬

‫‪ -1 -4 -1‬نظم الواجهة األمامية‪/‬الواجهة الخلفية ‪foreground/background‬‬


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

‫مقاطعة‬
‫البرنامج الرئيسي‬ ‫اإلجراء ‪1‬‬

‫مقاطعة‬
‫اإلجراء ‪2‬‬

‫مقاطعة‬ ‫اإلجراء ‪3‬‬

‫‪27‬‬
‫شفعية أو النظم الهجينة‪ .‬أما‬‫تعمل إجراءات الواجهة األمامية بطريقة الشريط الدوار أو األولوية ال ُ‬
‫إجراء الواجهة الخلفية فهو قابل ألن يشفع من قبل أي إجراء من الواجهة األمامية‪ .‬لذلك فهو يمث ّل‬
‫اإلجراء ذو األولوية األدنى في النظام‪.‬‬

‫كل أنظمة الزمن الحقيقي هي حالة خاصة من هذا النوع من النظم‪ .‬على سبيل المثال‪ ،‬حلقة‬
‫االستقصاء هو نظام واجهة أمامية‪/‬واجهة خلفية دون واجهة أمامية (تمثّل حلقة االستقصاء الواجهة‬
‫الخلفية)‪ .‬وإذا أضفنا المقاطعات‪ ،‬نحصل على نظام واجهة أمامية‪/‬واجهة خلفية كامل‪ .‬النظم المقادة‬
‫بالحالة هي أيضا ً نظم واجهة أمامية‪/‬واجهة خلفية ليس لها واجهة أمامية وحلقتها المقادة بالحالة هي‬
‫واجهتها الخلفية‪ .‬الروتينات التعاونية هي أيضا ً حالة خاصة فيها إجراء خلفي معقّد فقط‪ .‬أخيراً‪،‬‬
‫النظم المقادة بالمقاطعة هي أيضا ً نظم واجهة أمامية‪/‬واجهة خلفية ليس لها واجهة خلفية‪.‬‬

‫‪ -2 -4 -1‬المعالجة في الواجهة الخلفية‬


‫بما أن الواجهة الخلفية هي إجراء غير مقاد بالمقاطعة‪ ،‬فهي تحتوي على المعالجة الغير حرجة‬
‫زمنيا ً في النظام‪ .‬صحيح أن إجراء الواجهة الخلفية له أدنى أولوية‪ ،‬لكنه يُنفَّذ دوما ً إذا كانت انشغالية‬
‫النظام أصغر تماما ً من ‪ %100‬واليحوي منعا ً متبادالً ‪ .deadlock‬على سبيل المثال‪ ،‬يمكن زيادة‬
‫عداد في الواجهة الخلفية إلعطاء قياس عن مدى انشغالية النظام أو الكتشاف حالة دخول أحد‬
‫إجراءات الواجهة األمامية بحلقة غير منتهية (عندها ال تحدث أية زيادة في العداد لفترة طويلة)‪.‬‬
‫يمكن أيضا ً أن تحتفظ الواجهة الخلفية بعداد لكل إجراء واجهة أمامية يُصفَّر في بداية تنفيذ اإلجراء‬
‫الموافق‪ .‬إذا وجد إجراء الواجهة الخلفية أن هناك عداد ال يُصفَّر بالمعدل الكافي‪ ،‬فهذا يدل على أن‬
‫اإلجراء الموافق له ال يُنفَّذ بالمعدل المطلوب وأن هناك خطأ ما في النظام‪ .‬يشبه هذا األمر "مؤقت‬
‫كلب الحراسة" ‪ watchdog timer‬المتاح ماديا ً في بعض األنظمة‪ ،‬ولكنه برمجي بالطريقة التي‬
‫عرضناه بها‪.‬‬

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

‫‪ -3 -4 -1‬التهيئة ‪initialization‬‬
‫التهيئة هي الجزء األول من إجراء الواجهة الخلفية‪ ،‬وتتضمن الخطوات التالية‪:‬‬

‫تحجيب المقاطعات‬ ‫‪‬‬


‫تهيئة شعاع المقاطعة والمكدس‬ ‫‪‬‬
‫إجراء اختبار ذاتي للنظام‬ ‫‪‬‬
‫عمليات تهيئة أخرى للنظام‬ ‫‪‬‬

‫‪28‬‬
‫‪ ‬تأهيل المقاطعة من جديد‬

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

‫‪ -4 -4 -1‬عمليات الزمن الحقيقي‬


‫إن عمليات الزمن الحقيقي في الواجهة األمامية في نظام واجهة أمامية‪/‬واجهة خلفية تقابل تماما ً‬
‫المقاطعات في النظم المقادة بالمقاطعة‪.‬‬

‫لنأخذ على سبيل المثال حالة نظام فيه مقاطعة وحيدة ويحتوي على إجراء واجهة أمامية واحد‬
‫وإجراء الواجهة الخلفية‪ .‬نفرض أن تعليمة ‪ EPI‬تفعّل المقاطعة وأن ‪ DPI‬تح ّجبها وأن المعالج‬
‫يح ّجب المقاطعة آليا ً عند حدوثها (ضمنيا ً دون استعمال ‪ )DPI‬إلى أن تُفعَّل صراحةً باستدعاء‬
‫‪.EPI‬‬

‫من أجل تحقيق عملية تبديل السياق‪ ،‬يجب حفظ قيم سجالت المعالج الثمانية ‪ R1-R8‬على المكدس‬
‫من قبل إجراء الواجهة األمامية وذلك ألن إجراء الواجهة الخلفية يستعملها وال نريد أن تضيع قيمها‬
‫عند حدوث المقاطعة‪ .‬سيعمل إجراء الواجهة األمامية حتى ينتهي‪ ،‬لذلك ال حاجة لحفظ سياقه ألنه‬
‫ّ‬
‫مخزن في العنوان ‪ 5‬من الذاكرة (وهو‬ ‫طع‪ .‬نفترض أخيرا ً أن عنوان روتين تخديم المقاطعة‬ ‫لن يُقا َ‬
‫شعاع المقاطعة)‪.‬‬

‫تؤدي تعليمات التجميع التالية مهمة تهيئة هذا النظام البسيط‪:‬‬

‫‪DPI‬‬ ‫‪; disable interrupts‬‬


‫‪STORE &handler,5 ; put interrupt handler address in location 5‬‬
‫‪; other initializations can be done here‬‬
‫‪EPI‬‬ ‫‪; enable interrupts‬‬

‫إذا فرضنا أن ‪ reg0‬وحتى ‪ reg7‬تمثّل عناوين في الذاكرة نستعملها لحفظ قيم سجالت المعالج‪،‬‬
‫عندها يمكن أن نكتب روتين تخديم المقاطعة كما يلي‪:‬‬

‫‪DPI‬‬ ‫‪; redundantly disable interrupts, not required‬‬


‫‪STORE R0,&reg0 ; save register 0‬‬
‫‪STORE R1,&reg1 ; save register 1‬‬
‫‪STORE R2,&reg2 ; save register 2‬‬
‫‪STORE R3,&reg3 ; save register 3‬‬
‫‪STORE R4,&reg4 ; save register 4‬‬
‫‪STORE R5,&reg5 ; save register 5‬‬

‫‪29‬‬
‫‪STORE R6,&reg6 ; save register 6‬‬
‫‪STORE R7,&reg7 ; save register 7‬‬

‫‪JU @APP‬‬ ‫‪; execute real-time application program‬‬

‫‪LOAD R7,&reg7‬‬ ‫‪; restore register 7‬‬


‫‪LOAD R6,&reg6‬‬ ‫‪; restore register 6‬‬
‫‪LOAD R5,&reg5‬‬ ‫‪; restore register 5‬‬
‫‪LOAD R4,&reg4‬‬ ‫‪; restore register 4‬‬
‫‪LOAD R3,&reg3‬‬ ‫‪; restore register 3‬‬
‫‪LOAD R2,&reg2‬‬ ‫‪; restore register 2‬‬
‫‪LOAD R1,&reg1‬‬ ‫‪; restore register 1‬‬
‫‪LOAD R0,&reg0‬‬ ‫‪; restore register 0‬‬

‫‪EPI‬‬ ‫‪; re-enable interrupts‬‬


‫‪RI‬‬ ‫‪; return from interrupt‬‬

‫توجد في العديد من المعالجات تعليمات خاصة مثل ‪ 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‬‬
‫للكثير من األجهزة المحيطية يدوياً‪.‬هذا األمر صعب ومليء باألخطاء والمشاكل‪ .‬باإلضافة إلى ذلك‪،‬‬
‫يناسب هذا النوع من النظم التطبيقات التي يكون فيها عدد إجراءات الواجهة األمامية ثابتا ً ومعروفا ً‬
‫مسبقاً‪ .‬لذلك يصعب استعمالها في التطبيقات التي يتغير فيها عدد إجراءات الواجهة األمامية‪ .‬وعلى‬
‫الرغم من أن اللغات التي تدعم الحجز الديناميكي للذاكرة يمكنها التعامل مع عدد متغير من‬
‫اإلجراءات‪ ،‬لكن يبقى األمر غير سهل‪.‬‬

‫‪ -5 -4 -1‬نظم تشغيل الزمن الحقيقي كاملة المواصفات‬


‫يمكن تمديد نموذج الواجهة األمامية‪/‬الواجهة الخلفية ليصبح نظام تشغيل حقيقي كامل المواصفات‬
‫بإضافة مهام أساسية في أي نظام تشغيل مثل واجهات شبكة وسواقات أجهزة وأدوات تنقيح‬
‫‪ debugging‬متقدمة وغيرها‪ .‬هناك العديد من النظم التجارية الجاهزة المبنية بهذا األسلوب‪.‬‬

‫‪ -5 -1‬نموذج كتلة تحكم اإلجراء )‪Task Control Block (TCB‬‬


‫هذا النموذج هو األكثر استعماالً في نظم تشغيل الزمن الحقيقي التجارية الكاملة المواصفات ألنه‬
‫يسمح بأن يكون عدد اإلجراءات متغيراً‪ .‬وهو يُستع َمل أيضا ً في النظم التفاعلية المتصلة ‪on-line‬‬
‫صص لكل زبون متصل إجراء‬ ‫حيث يزيد عدد الزبائن المتصلين بالنظام وينقص باستمرار‪ ،‬ويُخ َّ‬
‫مستقل‪ .‬يمكن استعمال عدة خوارزميات جدولة مع هذا النموذج‪ ،‬مثل الشريط الدوار واألولوية‬
‫شفعية أو أية تركيبة منهما‪ ،‬على الرغم من أنه عادة ً ما تُستع َمل خوارزمية الشريط الدوار معه‪.‬‬ ‫ال ُ‬
‫المشكلة الوحيدة في نموذج ‪ TCB‬هو التأخير الزمني الكبير الذي تتطلبه عملية الجدولة إذا كان‬
‫عدد اإلجراءات المنشأة كبيراً‪.‬‬

‫ينشئ النظام في هذا النموذج بنية معطيات خاصة (تسجيلة ‪ )record‬لكل إجراء يعمل في الذاكرة‪.‬‬
‫تسمى هذه التسجيلة "كتلة تحكم اإلجراء" ‪ ،Task Control Block‬وتحتوي على األقل على‬
‫المعلومات التالية‪:‬‬

‫قيمة سجل عداد البرنامج ‪PC‬‬ ‫‪‬‬


‫قيم سجالت المعالج في اللحظة التي قوطع فيها هذا اإلجراء (السياق)‬ ‫‪‬‬
‫رقم أو اسم تعريف لإلجراء‬ ‫‪‬‬
‫حالة اإلجراء (جاهز‪ ،‬متوقف‪ ،‬في حالة سبات‪)... ،‬‬ ‫‪‬‬
‫أولوية اإلجراء (في حال استعمال مفهوم األولوية)‬ ‫‪‬‬

‫يخزن النظام كتل التحكم هذه في بنية معطيات مناسبة (الئحة مترابطة ‪ linked-list‬على األغلب)‪.‬‬

‫‪ -1 -5 -1‬حاالت اإلجراء‬
‫يدير نظام التشغيل اإلجراءات بحفظ حالة كل منها في كتلة تحكمه‪ .‬عادة ما يكون اإلجراء في إحدى‬
‫الحاالت األربع التالية‪:‬‬

‫‪ ‬قيد التنفيذ ‪executing‬‬

‫‪31‬‬
‫‪ ‬جاهز للتنفيذ ‪ready‬‬
‫‪ ‬متوقف ‪( suspended‬أو مج ّمد ‪)blocked‬‬
‫‪ ‬في سبات ‪( dormant‬أو نائم ‪)sleeping‬‬

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

‫تُستع َمل حالة السبات في النظم التي يكون فيها عدد كتل التحكم محدوداً‪ .‬يمكن توصيف هذه الحالة‬
‫بأنها حالة إجراء موجود لكنه غير متاح لمجدول نظام التشغيل‪ ،‬المتالء جدول كتل التحكم‪ .‬عند‬
‫إنشاء إجراء جديد‪ ،‬يمكن أن يوضع في حالة سبات إلى أن يتوقف أحد اإلجراءات األخرى ويصبح‬
‫مكانه متاحا ً في جدول كتل التحكم‪ .‬عندها ينتقل من حالة سبات إلى حالة "جاهز للتنفيذ"‪.‬‬

‫‪ -2 -5 -1‬إدارة اإلجراءات‬
‫يمكن النظر إلى نظام التشغيل على أنه اإلجراء ذو األولوية األعلى في النظام‪ .‬إن أية مقاطعة أو‬
‫استدعاء لخدمة من خدمات النظام (مثل طلب مصدر ما) تستدعي نظام التشغيل‪ .‬يحتفظ نظام‬
‫التشغيل بالئحتين مترابطتين من كتل التحكم‪ .‬األولى لإلجراءات الجاهزة والثانية لإلجراءات‬
‫المتوقفة‪ .‬ويحتفظ كذلك بجدول للمصادر المتاحة وآخر لطلبات المصادر التي طلبتها اإلجراءات‪.‬‬
‫يحتوي كل كتلة إجراء نفس المعلومات التي يحتفظ بها روتين تخديم المقاطعة على المكدس‪ .‬يبين‬
‫الشكل التالي مثاالً لبنية كتلة تحكم اإلجراء‪.‬‬

‫رقم تعريف اإلجراء‬

‫األولوية‬

‫حالة اإلجراء‬

‫‪32‬‬
‫السجل ‪1‬‬

‫‪.......‬‬

‫السجل ‪n‬‬

‫سجل عداد البرنامج‬

‫سجالت حالة المعالج‬

‫مؤشر لكتلة التحكم التالية‬

‫يتميز نموذج ‪ TCB‬بأنه مناسب عندما ال يكون عدد إجراءات النظام محددا ً خالل مرحلة تصميمه‪،‬‬
‫أو يمكن أن يتغير عددها أثناء عمله‪ .‬أي أنه نموذج مرن جداً‪.‬‬

‫األسلوب األبسط لعمل المجدول في هذا النموذج هو على الشكل التالي‪ :‬عند استدعائه (دوريا ً أو‬
‫عند حدوث حدث)‪ ،‬يفحص المجدول الالئحة المترابطة لإلجراءات الجاهزة للتنفيذ‪ .‬إذا وجد إجراء‬
‫في هذه الالئحة‪ ،‬عندها تُنقَل كتلة تحكم اإلجراء الذي كان قيد التنفيذ إلى آخر الئحة اإلجراءات‬
‫الجاهزة‪ ،‬وينتقي المجدول أحد اإلجراءات الجاهزة للتنفيذ لنقله إلى حالة "قيد التنفيذ"‪.‬‬

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

‫‪ -3 -5 -1‬إدارة المصادر‬
‫باإلضافة إلى عملية الجدولة‪ ،‬يهتم نظام التشغيل بمعرفة حالة كل مصدر متاح في النظام (جهاز‬
‫دخل‪/‬خرج‪ ،‬ذاكرة‪ )... ،‬ويحتفظ بمعلومات عنها في جدول خاص اسمه "جدول المصادر"‪ .‬يفحص‬
‫النظام دوريا ً حالة اإلجراءات الموجودة في رتل اإلجراءات المتوقفة‪ .‬فإذا وجد إجراءا ً متوقفا ً ألنه‬
‫ينتظر توفر مصدر ما‪ ،‬ووجد أن هذا المصدر أصبح متوفراً‪ ،‬عندها يغير حالته إلى "جاهز للتنفيذ"‬
‫وينقل كتلة تحكمه إلى رتل اإلجراءات الجاهزة للتنفيذ‪.‬‬

‫‪33‬‬
‫‪ -2‬األسس النظرية لنظم تشغيل الزمن الحقيقي‬
‫نحتاج في البداية لصياغة بعض المفاهيم النظرية بشكل رياضي وواضح لكي نتمكن من فهم نظم‬
‫تشغيل الزمن الحقيقي فهما ً صحيحاً‪ .‬نستعرض بعد ذلك خوارزميات جدولة إجراءات الزمن‬
‫الحقيقي المختلفة ونناقش مزايا ومساوئ كل منها‪.‬‬

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

‫تجدر اإلشارة أن بعض نظم التشغيل تستعمل مصطلحات مختلفة عن المصطلحات المستعملة هنا‪،‬‬
‫لكن األفكار العامة تبقى نفسها‪.‬‬

‫‪ -1 -2‬جدولة اإلجراءات‬
‫تُعتبَر الجدولة من المهام األساسية لنظام التشغيل‪ .‬لكي نحقق االحتياجات الزمنية لبرنامج زمن‬
‫حقيقي‪ ،‬نحتاج الستعمال خوارزميات جدولة مختلفة عن تلك المستعملة في نظم التشغيل العادية‪.‬‬
‫نحتاج كذلك السراتيجيات خاصة لترتيب استعمال مصادر النظام من قبل إجراءات الزمن الحقيقي‬
‫حسب أولوياتهم وقيودهم الزمنية‪ .‬هناك نوعين أساسيين لخوارزميات الجدولة في الزمن الحقيقي‪:‬‬
‫خوارزميات ما قبل التنفيذ وخوارزميات زمن التنفيذ‪ .‬الهدف المشترك لهذه الخوارزميات هو تحقيق‬
‫الشروط الزمنية إلجراءات الزمن الحقيقي‪.‬‬

‫تقوم خوارزميات ما قبل التنفيذ بجدولة اإلجراءات مسبقا ً بحيث تكون الجدولة الناتجة محققة للقيود‬
‫الزمنية وال يوجد تضارب في استعمال المصادر (أي ال يستعمل أكثر من إجراء نفس المصدر في‬

‫‪34‬‬
‫نفس اللحظة)‪ ،‬وذلك قبل بدء التنفيذ الفعلي لإلجراءات‪ .‬تحاول هذه الخوارزميات أيضا ً تخفيف كلفة‬
‫تبديل السياق قدر اإلمكان‪ ،‬مما يزيد احتمال إيجاد جدولة محققة لجميع القيود الزمنية‪.‬‬

‫أما في خوارزميات زمن التنفيذ‪ ،‬فتعطى أولويات ساكنة لإلجراءات‪ ،‬وتخصص المصادر حسب‬
‫هذه األولويات‪ .‬تعتمد هذه الخوارزميات على تقنيات معقدة في زمن التنفيذ لتحقيق االتصال‬
‫والتزامن بين اإلجراءات‪.‬‬

‫‪ -1 -1 -2‬العبء على المعالج وصفات المهام‬


‫ُعرف العبء على المعالج بأنها مجموعة اإلجراءات التي يجب على المعالج تنفيذها في لحظة‬ ‫ي َّ‬
‫محددة‪ .‬يمكن لمعالج أن ينفّذ إجراءا ً واحدا ً على األكثر في لحظة ما‪ ،‬وكل إجراء يُنفَّذ على معالج‬
‫صف كل إجراء زمن حقيقي ‪ 𝜏i‬بالواصفات الزمنية التالية‪:‬‬ ‫واحد على األكثر في لحظة ما‪ .‬يو َّ‬

‫قيود األسبقية ‪ :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‬عندما يُنفَّذ لوحده وتكون جميع المصادر التي يحتاجها متاحة‪.‬‬

‫هناك بعض العالقات الرياضية التي تربط بين هذه الواصفات الزمنية‪:‬‬

‫)‪(3.1‬‬ ‫‪𝜑i = ri,1‬‬ ‫‪and‬‬ ‫‪ri,k = φi + (k − 1) ∗ pi‬‬

‫إذا فرضنا أن ‪ 𝑑i,j‬هو الحد الزمني المطلق للتكرار رقم ‪ j‬لإلجراء ‪ ،𝜏i‬يكون لدينا‪:‬‬

‫)‪(3.2‬‬ ‫‪𝑑i,j = φi + (j − 1) ∗ pi + Di‬‬

‫‪35‬‬
‫وإذا كان الحد الزمني النسبي إلجراء دوري ‪ 𝜏i‬يساوي دوره ‪ ،𝑝i‬يكون لدينا‪:‬‬
‫)‪(3.3‬‬ ‫‪𝑑i,k = ri,k + pi = φi + k ∗ pi‬‬

‫حيث ‪ k‬هو عدد صحيح موجب أكبر أو يساوي ‪ ،1‬وهو يعبّر عن التكرار رقم ‪ k‬لإلجراء ‪.𝜏i‬‬

‫‪ -2 -1 -2‬نموذج مبسط لإلجراء‬


‫سنعتمد نموذجا ً مبسطا ً لإلجراء لكي نتمكن من توصيف بعض خوارزميات الجدولة النظامية‬
‫المستعملة في نظم الزمن الحقيقي‪ .‬يفترض هذا النموذج الفرضيات التالية‪:‬‬

‫كل اإلجراءات الموجودة في النظام دورية‬ ‫‪‬‬


‫الحد الزمني النسبي لكل إجراء يساوي دوره‬ ‫‪‬‬
‫كل اإلجراءات مستقلة عن بعضها البعض‪ ،‬أي ال توجد قيود أسبقية بينها‬ ‫‪‬‬
‫شفعي (أي غير قابل للمقاطعة)‪ ،‬وكلفة تبديل السياق مهملة‬ ‫ال يحوي أي إجراء قسما ُ غير ُ‬ ‫‪‬‬
‫لكل إجراء احتياجات معالجة فقط (أي يحتاج فقط للمعالج) وتُه َمل االحتياجات األخرى‬ ‫‪‬‬
‫(ذاكرة‪ ،‬دخل‪/‬خرج‪)... ،‬‬

‫من المهم جدا ً في نظم الزمن الحقيقي أن تكون الجدولة الناتجة عن خوارزمية الجدولة قابلة للتنبؤ‬
‫‪ ،predictable‬أي أنه يمكننا معرفة اإلجراء الذي سيُنفَّذ الحقا ً في كل لحظة‪ .‬تستعمل العديد من‬
‫الدوار الذي يتميز بأنه بسيط وقابل للتنبؤ‪.‬‬
‫نظم تشغيل الزمن الحقيقي خوارزمية الشريط ّ‬

‫الدوار ‪round-robin‬‬ ‫‪ -2 -2‬خوارزمية جدولة الشريط ّ‬


‫في هذه الخوارزمية‪ ،‬يجري تنفيذ اإلجراءات تسلسليا ً حتى تنتهي وغالبا ً ما توجد في نظم التنفيذي‬
‫صص لكل إجراء شريحة (حصة) زمنية ثابتة ‪quantum or‬‬ ‫الدوري ‪ .cyclic executive‬يُخ َّ‬
‫‪ slice‬يُنفَّذ خاللها‪ .‬تُستع َمل ساعة ذات دور ثابت يساوي الحصة الزمنية لمقاطعة النظام دورياً‪.‬‬
‫يستمر تنفيذ اإلجراء حتى ينتهي تنفيذه أو تنتهي حصته الزمنية بحدوث مقاطعة الساعة‪ .‬إذا لم ينته‬
‫تنفيذ اإلجراء‪ ،‬يُحفَظ سياقه ويوضع في نهاية رتل اإلجراءات الجاهزة‪ .‬بعد ذلك‪ ،‬يسترجع النظام‬
‫سياق اإلجراء التالي الموجود في بداية الرتل ويتابع تنفيذه‪ .‬إذا‪ ،‬تعطي هذه الخوارزمية جدولة عادلة‬
‫غير ُ‬
‫شفعية لإلجراءات التي لها نفس األولوية بتوزيع زمن المعالج عليها بالتساوي‪.‬‬

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

‫‪36‬‬
‫انتهاء تنفيذ ‪ A‬وبدء تنفيذ ‪C‬‬

‫الزمن‬

‫حصة زمنية‬
‫شُفع اإلجراء ‪A‬‬ ‫متابعة تنفيذ ‪A‬‬

‫اإلجراءان ‪ A‬و ‪ C‬لهما نفس األولوية واإلجراء ‪ B‬له أولوية أعلى‪ .‬يبدأ ‪ A‬بالتنفيذ لبعض الوقت‪،‬‬
‫إلى أن يصل اإلجراء ‪ B‬ذو األولوية األعلى ويقوم ب ُ‬
‫شفع ‪ A‬ويستمر بالتنفيذ حتى انتهائه‪ .‬بعدها‬
‫يعود ‪ A‬للتنفيذ إلى أن تنتهي حصته الزمنية وينتقل التنفيذ لإلجراء ‪ C‬حتى انتهاء حصته الزمنية‬
‫وهكذا‪.‬‬

‫‪ -3 -2‬التنفيذي الدوري ‪cyclic executive‬‬


‫يُستع َمل هذا األسلوب أيضا ً بكثرة في العديد من نظم الزمن الحقيقي ألنه بسيط ويولّد جدولة قابلة‬
‫سلة ومرا َكبة تنفيذ إجراءات دورية حسب جدول محدد مسبقا ً قبل التنفيذ‪ .‬يمكن‬
‫سل َ‬
‫للتنبؤ‪ .‬وهو يقوم ب َ‬
‫التعبير عن هذا األسلوب ببساطة على أنه جدول استدعاءات لتوابع‪ ،‬ك ّل منها هو إجراء‪ ،‬في حلقة‬
‫غير منتهية‪.‬‬

‫يتخذ هذا األسلوب قرارات الجدولة دوريا ً ومسبقا ً‪ ،‬وليس في أية لحظة مثل الشريط الدوار‪ .‬تسمى‬
‫الفترات الزمنية (المتساوية) التي تفصل بين لحظات اتخاذ قرارات الجدولة باألطر ‪ frames‬أو‬
‫األدوار الصغيرة ‪ ،minor cycles‬ويُر َمز لطولها بالرمز ‪ ،f‬ويسمى "حجم اإلطار"‪ .‬الدور الكبير‬
‫‪ major cycle or hyper period‬هو المضاعف المشترك األصغر لجميع أدوار إجراءات‬
‫النظام‪.‬‬

‫شفع داخل اإلطار‪ .‬إن‬‫بما أن قرارات الجدولة تؤخذ فقط في بداية كل إطار‪ ،‬لذلك ال يحدث أي ُ‬
‫طور ‪ phase‬أي إجراء دوري هو مضاعف صحيح غير سالب من حجم اإلطار‪ .‬يبين الشكل‬
‫التالي بعض القيود المفروضة على حجم اإلطار ‪.f‬‬

‫‪37‬‬
‫يجب أن يكون اإلطار كبيرا ً كفاية بحيث يبدأ وينتهي أي إجراء ضمن إطار واحد‪ .‬هذا يقتضي أن‬
‫يكون حجم اإلطار ‪ f‬أكبر من كل أزمان التنفيذ ‪ 𝑒i‬لإلجراءات ‪ .𝑇i‬أي‪:‬‬
‫)‪(3.4‬‬ ‫) ‪𝐶1 ∶ f ≥ max (ei‬‬
‫‪1≤i≤n‬‬

‫ولكي يكون طول الجدول الدوري أصغر ما يمكن‪ ،‬يجب أن يحتوي الدور الكبير على عدد صحيح‬
‫من األطر‪:‬‬

‫)‪(3.5‬‬ ‫‪C2 ∶ ⌊pi /f⌋ − pi /f = 0‬‬

‫وللتأكد من أن كل إجراء ينتهي قبل حده الزمني‪ ،‬يجب أن يكون اإلطار صغيرا ً بحيث يكون هناك‬
‫إطارا ً واحدا ً على األقل بين كل تحرير إلجراء وبين حده الزمني‪ .‬العالقة التالية مشتقة من الحالة‬
‫األسوأ التي تحدث عندما يبدأ دور إجراء ما مباشرة بعد بدء اإلطار‪ ،‬وال يمكن بالتالي تحريره قبل‬
‫بدء اإلطار التالي‪:‬‬

‫)‪(3.6‬‬ ‫𝑖𝐷 ≤ )𝑓 ‪C3 ∶ 2𝑓 − gcd(𝑝𝑖 ,‬‬

‫حيث ‪ gcd‬هو القاسم المشترك األعظم و ‪ 𝐷i‬هو الحد الزمني النسبي لإلجراء ‪.i‬‬

‫سنوضح عملية حساب حجم اإلطار ‪ f‬باستعمال مثال عددي‪ .‬ليكن لدينا نظاما ً يحتوي على‬
‫اإلجراءات الدورية المبينة في الجدول التالي‪:‬‬

‫‪𝜏i‬‬ ‫‪𝑝i‬‬ ‫‪𝑒i‬‬ ‫‪𝐷i‬‬

‫‪𝜏1‬‬ ‫‪15‬‬ ‫‪1‬‬ ‫‪14‬‬

‫‪𝜏2‬‬ ‫‪20‬‬ ‫‪2‬‬ ‫‪26‬‬

‫‪𝜏3‬‬ ‫‪22‬‬ ‫‪3‬‬ ‫‪22‬‬

‫قيمة الدور الكبير لهذه اإلجراءات هي ‪( 660‬وهو المضاعف المشترك األصغر للقيم ‪ 15‬و ‪ 20‬و‬
‫‪ .)22‬نطبّق الشروط الثالثة السابقة ‪ 𝐶1‬و ‪ 𝐶2‬و ‪ 𝐶3‬فنحصل على العالقات التالية‪:‬‬

‫نستنتج مما سبق أن القيم الممكنة لحجم اإلطار ‪ f‬هي إما ‪ 3‬أو ‪ 4‬أو ‪.5‬‬

‫‪38‬‬
‫‪ -4 -2‬جدولة األولويات الثابتة – الخوازمية "الرتيبة المعدّل" )‪Rate Monotonic (RM‬‬

‫‪ -1 -4 -2‬فكرة الخوارزمية‬
‫طى لكل إجراء أولوية محددة نسبةً لباقي اإلجراءات‪ .‬تُعت َبر‬
‫في النظم ذات األولويات الثابتة‪ ،‬يُع َ‬
‫خوارزمية ‪ RM‬من أهم خوارزميات الجدولة في هذه النظم‪ ،‬وهي تعطي جدولة أمثلية في نموذج‬
‫اإلجراءات المبسط المذكور سابقا ً‪ .‬يُعطى لكل إجراء في هذه الخوارزمية أولوية تتناسب عكسا ً مع‬
‫دوره‪ :‬فأولوية اإلجراء الذي له دور كبير أصغر من أولوية اإلجراء الذي له دور قصير‪.‬‬

‫سنشرح طريقة عمل هذه الخوارزمية على المثال التالي‪ .‬ليكن لدينا مجموعة اإلجراءات التالية‪:‬‬

‫‪𝜏i‬‬ ‫‪𝑒i‬‬ ‫‪𝑝i‬‬ ‫‪𝑢i = ei /pi‬‬

‫‪𝜏1‬‬ ‫‪1‬‬ ‫‪4‬‬ ‫‪0.25‬‬

‫‪𝜏2‬‬ ‫‪2‬‬ ‫‪5‬‬ ‫‪0.4‬‬

‫‪𝜏3‬‬ ‫‪5‬‬ ‫‪20‬‬ ‫‪0.25‬‬

‫نفترض أن زمن تحرير كل اإلجراءات الثالثة هو ‪ .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‬‬

‫∞‬ ‫…‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪n‬‬

‫‪0.69‬‬ ‫‪0.73‬‬ ‫‪0.74‬‬ ‫‪0.76‬‬ ‫‪0.78‬‬ ‫‪0.83‬‬ ‫‪1.0‬‬ ‫الحد‬

‫يبين الشكل التالي مخططا ً يبين كيفية تغير حد االنشغالية بداللة عدد اإلجراءات‪:‬‬

‫تجدر اإلشارة إلى أن حد االنشغالية هو شرط كاف وغير الزم‪ ،‬أي أنه يمكن في بعض األحيان بناء‬
‫نظام له انشغالية أعلى من الحد ويكون قابالً للجدولة حسب ‪ 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‬‬

‫لنأخذ على سبيل المثال نظاما ً يحتوي على اإلجرائين التاليين‪:‬‬

‫‪𝜏i‬‬ ‫‪𝑝i‬‬ ‫‪𝑒i‬‬

‫‪𝜏1‬‬ ‫‪5‬‬ ‫‪2‬‬

‫‪𝜏2‬‬ ‫‪7‬‬ ‫‪4‬‬

‫يبين الشكل التالي طريقة جدولتها حسب خوارزمية ‪:EDF‬‬

‫رغم أن لحظة تحرير كال اإلجرائين هي اللحظة ‪ ،0‬يبدأ اإلجراء ‪ 𝜏1‬بالتنفيذ ألن له حد زمني‬
‫أقرب‪ .‬في اللحظة ‪ ،t=2‬ينتهي تنفيذ ‪ 𝜏1‬ويبدأ تنفيذ ‪ .𝜏2‬في اللحظة ‪ ،t=5‬يصل التكرار الثاني‬
‫شفع ‪ 𝜏2‬ألن حده الزمني أبعد من حد ‪ .𝜏2‬في اللحظة ‪ ،t=15‬يقوم ‪𝜏1‬‬ ‫لإلجراء ‪ ،𝜏1‬لكنه ال يقوم ب ُ‬

‫‪41‬‬
‫شفع ‪ 𝜏2‬ألن حده الزمني (وهو ‪ )20‬أقرب من الحد الزمني لإلجراء ‪( 𝜏2‬وهو ‪ .)21‬يتابع ‪𝜏2‬‬ ‫ب ُ‬
‫تنفيذه بعد انتهاء ‪ 𝜏2‬في اللحظة ‪.t=17‬‬

‫‪ -1 -5 -2‬خصائص الخوارزمية ‪EDF‬‬


‫شفعي ذي معالج وحيد‪ .‬أي أنه إذا وج َدت‬ ‫إن خوارزمية ‪ EDF‬هي خوارزمية أمثلية في نظام ُ‬
‫جدولة مقبولة للنظام‪ ،‬عندها ستعطي خوارزمية ‪ EDF‬جدولة مقبولة بالتاكيد‪.‬‬

‫‪ -2 -5 -2‬مقارنة الخوارزميتان ‪ RM‬و ‪EDF‬‬


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

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

‫تجدر اإلشارة أيضا ً إلى أن اإلجراء الذي يتعدى حده الزمني في ‪ EDF‬تبقى أولويته أعلى من‬
‫اإلجراءات التي لم تتعدى حدها الزمني بعد‪ .‬إذا استمر هذا اإلجراء بالتنفيذ‪ ،‬يمكن أن يؤدي ذلك إلى‬
‫تعدي اإلجراءات األخرى لحدودها الزمنية‪ .‬من األفضل في هذه الحالة أن يترك هذا اإلجراء‬
‫المعالج أمالً بتلبية الحدود الزمنية لإلجراءات األخرى‪.‬‬

‫على سبيل المثال‪ ،‬يبين الجدول التالي مجموعة إجراءات دورية في نظام زمن حقيقي‪ .‬عند جدولة‬
‫هذه اإلجراءات حسب خوارزمية ‪ ،EDF‬سيتعدى كل من اإلجرائين ‪ 𝜏1‬و ‪ 𝜏2‬حدودهما الزمنية إذا‬
‫سمحنا لإلجراء الذي تعدى حده الزمني باالستمرار بالتنفيذ‪ .‬بينما سيتعدى ‪ 𝜏2‬فقط حده الزمني إذا‬
‫استعملنا إجرائية ‪.RM‬‬

‫‪𝜏i‬‬ ‫‪𝑟i‬‬ ‫‪𝑒i‬‬ ‫‪pi‬‬

‫‪𝜏1‬‬ ‫‪0‬‬ ‫‪2‬‬ ‫‪5‬‬

‫‪𝜏2‬‬ ‫‪0‬‬ ‫‪4‬‬ ‫‪6‬‬

‫‪42‬‬
‫‪ -3‬مزامنة اإلجراءات ومشاركة المصادر‬
‫افترضنا حتى اآلن أن إجراءات النظام مستقلة ويمكن أن يجري ُ‬
‫شفعها في أية لحظة‪ .‬هذه‬
‫الفرضيات غير واقعية عمليا ً في معظم النظم‪ ،‬إذ تحتاج اإلجراءات أن تتصل وتتفاعل مع بعضها‬
‫البعض‪ .‬سنقدم في هذا القسم المشاكل الناتجة عن مشاركة المصادر وخوارزميات الجدولة‬
‫المستعملة في هذه الحالة‪.‬‬

‫‪ -1 -3‬المصادر ‪Resources‬‬
‫المصادر هي أية تسهيالت يقدمها النظام لإلجراءات لمساعدتها في تأدية عملها‪ .‬فيما يلي بعض‬
‫األمثلة على المصادر المشتركة في النظام‪:‬‬

‫‪ ‬الملفات‬
‫‪ ‬التجهيزات المختلفة (طابعات‪ ،‬شاشات‪)... ،‬‬
‫‪ ‬المتحوالت المشتركة في الذاكرة التي غالبا ً ما تُستع َمل لالتصال بين اإلجراءات‬

‫هناك الكثير من التقنيات البرمجية المستع َملة كمتحوالت مشتركة في الذاكرة لتسهيل االتصال بين‬
‫اإلجراءات نذكر منها‪:‬‬

‫‪ ‬الدارئ ‪ buffer‬بأنواعه المتعددة (الحلقي ‪ ،circular‬المضاعف ‪)... ،double‬‬


‫‪ ‬صندوق البريد ‪mail box‬‬
‫‪ ‬األرتال ‪queues‬‬

‫‪ -2 -3‬األقسام الحرجة ‪critical sections‬‬


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

‫‪𝜏1‬‬ ‫‪𝜏2‬‬

‫;‪(1) x = i‬‬ ‫;‪(4) y = i‬‬

‫;‪(2) x = x + 1‬‬ ‫;‪(5) y = y - 1‬‬

‫;‪(3) i = x‬‬ ‫;‪(6) i = y‬‬

‫المتحول ‪ x‬محلي في اإلجراء ‪ 𝜏1‬والمتحول ‪ y‬محلي في اإلجراء ‪ .𝜏2‬المتحول ‪ i‬هو متحول‬


‫مشترك بين اإلجرائين قيمته االبتدائية صفر وهو المصدر المشترك الذي نتحدث عنه‪ .‬إذا فرضنا أن‬

‫‪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‬تحرير)‪ .‬فيما يلي‬
‫ي َّ‬
‫خوارزمية عمل ك ّل منهما‪:‬‬

‫)‪void P(int S‬‬


‫{‬
‫;)‪While (S==0‬‬
‫;‪S=0‬‬
‫}‬

‫)‪void V(int S‬‬


‫{‬
‫;‪S=1‬‬
‫}‬

‫تفحص العملية )‪ 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‬السابق قد جرى ترجمته إلى لغة اآللة كما يلي‪:‬‬

‫‪@1‬‬ ‫‪LOAD R1,S‬‬


‫‪TEST R1,0‬‬
‫‪JEQ @1‬‬
‫‪STORE S,0‬‬

‫نفترض كذلك أنه يوجد إجراءان يريدان الدخول للقسم الحرج ويستدعيان بالتالي التابع ‪ 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‬يحجز المصدر الثاني‪ .‬بهذا يحجز كل إجراء مصدر وينتظر‬
‫المصدر الذي يحجزه اإلجراء اآلخر إلى ما ال نهاية‪.‬‬

‫يمكن التعبير عن هذه الحالة بالمخطط التالي‪:‬‬

‫يحجز‬ ‫المصدر ‪1‬‬ ‫مطلوب من‬

‫‪TASK_A‬‬ ‫‪TASK_B‬‬

‫يحجز‬
‫مطلوب من‬
‫المصدر ‪2‬‬

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

‫‪46‬‬
‫الشهيرة لتفادي حدوث المنع المتبادل والمسماة "بخوارزمية المصرفي" ‪.banker’s algorithm‬‬
‫يمكن االطالع على حلول المنع المتبادل األخرى في الكتب التي تدرس نظم التشغيل بشكل عام‪.‬‬

‫‪ -5 -3‬خوارزمية المصرفي ‪the banker’s algorithm‬‬


‫تُستع َمل هذه الخوارزمية لتفادي الحاالت الغير آمنة التي يمكن أن تؤدي لحدوث المنع المتبادل‪.‬‬
‫اقترحها ديجكسترا ‪ Dijkstra‬عام ‪ 1968‬وهي مشابهة لعمل المصارف في المدن الصغيرة من‬
‫حيث الحفاظ على مخزون من السيولة النقدية على سبيل االحتياط‪ .‬يودع الناس أموالهم في‬
‫المصرف ويمكنهم سحبها في أية لحظة‪ .‬ال يحتفظ المصرف بكل األموال السائلة في حوزته‪ ،‬بل‬
‫يستثمر ‪ 95%‬منها ويحتفظ بنسبة ‪ 5%‬كسيولة نقدية احتياط في حال أراد بعض المودعين سحب‬
‫جزءا ً من إيداعاتهم‪ .‬إذا طلب العديد من الزبائن سحب إيداعاتهم‪ ،‬عندها لن يتمكن المصرف من‬
‫تلبية جميع الطلبات‪ .‬تفترض خوارزمية المصرفي وجود عدة مصادر من نوع واحد فقط‪ ،‬لكن‬
‫يمكن تمديدها بحيث تعمل مع عدة أنواع من مصادر‪.‬‬

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

‫مكونا ً من ثالثة إجراءات ‪ A‬و ‪ B‬و ‪ C‬و ‪ 10‬مصادر من نوع واحد‬ ‫لنأخذ على سبيل المثال نظاما ً ّ‬
‫(كتل ذاكرة مثالً)‪ .‬إذا علمنا أن اإلجراء ‪ A‬لن يحتاج لحجز أكثر من ‪ 6‬مصادر في نفس الوقت ولن‬
‫يحتاج ‪ B‬ألكثر من ‪ 5‬ولن يحتاج ‪ A‬بأكثر من ‪ .7‬يحتاج النظام لبناء جدول مشابه للجدول التالي‬
‫في كل لحظة لتتبع المصادر المتاحة والمطلوبة في تلك اللحظة‪.‬‬
‫العدد الذي من الممكن أن‬ ‫عدد المصادر المحجوزة‬
‫العدد األعظمي المطلوب‬ ‫اإلجراء‬
‫يحتاج إليه‬ ‫حاليا ً‬

‫‪6‬‬ ‫‪0‬‬ ‫‪6‬‬ ‫‪A‬‬

‫‪5‬‬ ‫‪0‬‬ ‫‪5‬‬ ‫‪B‬‬

‫‪7‬‬ ‫‪0‬‬ ‫‪7‬‬ ‫‪C‬‬

‫‪10‬‬ ‫العدد الكلي المتاح حاليا ً‬

‫عند كل طلب حجز للمصادر‪ ،‬يح ّدث نظام التشغيل هذا الجدول للتأكد من أن النظام ما زال في‬
‫وضع آمن‪ .‬فيما يلي مثال على وضع آمن للنظام‪:‬‬

‫‪47‬‬
‫العدد الذي من الممكن أن‬ ‫عدد المصادر المحجوزة‬
‫العدد األعظمي المطلوب‬ ‫اإلجراء‬
‫يحتاج إليه‬ ‫حاليا ً‬

‫‪4‬‬ ‫‪2‬‬ ‫‪6‬‬ ‫‪A‬‬

‫‪2‬‬ ‫‪3‬‬ ‫‪5‬‬ ‫‪B‬‬

‫‪6‬‬ ‫‪1‬‬ ‫‪7‬‬ ‫‪C‬‬

‫‪4‬‬ ‫العدد الكلي المتاح حاليا ً‬

‫هذه الحالة آمنة ألن العدد الكلي المتاح حاليا ً (وهو ‪ )4‬أكبر أو يساوي العدد الذي من الممكن أن‬
‫يحتاج إليه أحد اإلجراءات إلتمام تنفيذه (مثل اإلجراء ‪ B‬على سبيل المثال‪ ،‬وكذلك اإلجراء ‪.)A‬‬
‫فيما يلي مثال على حالة غير آمنة ألن العدد الكلي المتاح ال يكفي أي إجراء‪ ،‬ومن الممكن إذا ً أن‬
‫يحدث منع متبادل‪:‬‬
‫العدد الذي من الممكن أن‬ ‫عدد المصادر المحجوزة‬
‫العدد األعظمي المطلوب‬ ‫اإلجراء‬
‫يحتاج إليه‬ ‫حاليا ً‬

‫‪2‬‬ ‫‪4‬‬ ‫‪6‬‬ ‫‪A‬‬

‫‪2‬‬ ‫‪3‬‬ ‫‪5‬‬ ‫‪B‬‬

‫‪5‬‬ ‫‪2‬‬ ‫‪7‬‬ ‫‪C‬‬

‫‪1‬‬ ‫العدد الكلي المتاح حاليا ً‬

‫‪ -6 -3‬انعكاس األولوية ‪priority inversion‬‬


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

‫لدينا نظام يحتوي على ثالثة إجراءات ‪ 𝜏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‬من ُ‬
‫المخطط الزمني الناتج عن تطبيق فكرة وراثة األولوية على المثال السابق‪.‬‬
‫تنفيذ طبيعي‬
‫مج ّمد‬

‫تأجل‬

‫وراثة أولوية ‪τ1‬‬


‫الرجوع لألولوية األساسية‬

‫الزمن‬
‫القسم الحرج‬

‫تجدر اإلشارة أخيرا ً إلى أن خوارزمية وراثة األولوية ال تمنع حدوث المنع المتبادل على عكس‬
‫خوارزمية "سقف األولوية" التي سنناقشها في الفقرة التالية‪.‬‬

‫‪50‬‬
‫‪ -2 -6 -3‬خوارزمية سقف األولوية ‪priority ceiling‬‬
‫هذه الخوارزمية هي تحسين لخوارزمية وراثة األولوية‪ ،‬بحيث يُمنَع أي إجراء من الدخول إلى‬
‫القسم الحرج إذا كان هذا سيؤدي إلى تجميده‪ .‬يُعطى لكل مصدر أولوية (تسمى سقف األولوية)‬
‫تساوي أعلى أولوية إلجراء سيستعمل هذا المصدر‪.‬‬

‫خطوات خوارزمية سقف األولوية هي نفسها خطوات خوارزمية وراثة األولوية‪ ،‬مع فرق واحد هو‬
‫أنه يمكن إلجراء ‪ 𝜏i‬أن يُمنَع من دخول القسم الحرج إذا وجد عالّم محجوز من ق َبل إجراء آخر وله‬
‫سقف أولوية أكبر أو يساوي أولوية ‪ .𝜏i‬سنبين هذا الفرق في المثال التالي‪ .‬ليكن لدينا نظام مؤلف‬
‫من ثالثة إجراءات ‪ 𝜏1‬و ‪ 𝜏2‬و ‪ 𝜏3‬ويوجد فيه المصادر التالية‪:‬‬
‫سقف األولوية‬ ‫اإلجراءات التي تصل إليه‬ ‫القسم الحرج‬

‫) ‪𝑃(𝜏1‬‬ ‫‪𝜏1 , 𝜏2‬‬ ‫‪𝑆1‬‬

‫) ‪𝑃(𝜏1‬‬ ‫‪𝜏1 , 𝜏2 , 𝜏3‬‬ ‫‪𝑆2‬‬

‫) ‪𝑃(𝜏3‬‬ ‫‪𝜏3‬‬ ‫‪𝑆3‬‬

‫) ‪𝑃(𝜏2‬‬ ‫‪𝜏2 , 𝜏3‬‬ ‫‪𝑆4‬‬

‫إذا فرضنا أن ‪ 𝜏2‬يحجز حاليا ً المصدر ‪ ،𝑆2‬وبدأ اإلجراء ‪ 𝜏1‬بالعمل وطلب حجز المصدر ‪،𝑆1‬‬
‫عندها سيج َّمد ‪ 𝜏1‬ولن يحجز المصدر ‪ 𝑆1‬رغم أنه حر وذلك ألن أولويته ليست أكبر تماما ً من سقف‬
‫أولوية المصدر المحجوز ‪.𝑆2‬‬

‫لنأخذ مثاالُ آخر نظاما ً فيه ثالثة إجراءات أيضا ً هي ‪ 𝜏1‬و ‪ 𝜏2‬و ‪ .𝜏3‬أولوية ‪ 𝜏1‬أكبر من أولوية ‪𝜏2‬‬
‫وأولوية ‪ 𝜏2‬أكبر من أولوية ‪ .𝜏3‬تقوم هذه اإلجراءات بالعمليات التالية‪:‬‬

‫‪ :𝜏1 ‬حجز ‪ ،𝑆1‬تحرير ‪𝑆1‬‬


‫‪ :𝜏2 ‬حجز ‪ ،𝑆1‬حجز ‪ ،𝑆2‬تحرير ‪ ،𝑆2‬تحرير ‪𝑆1‬‬
‫‪ :𝜏3 ‬حجز ‪ ،𝑆2‬تحرير ‪𝑆2‬‬

‫حسب قاعدة تحديد قيمة سقف األولوية‪ ،‬تكون قيمة سقف أولوية ‪ 𝑆1‬تساوي ) ‪ 𝑃(𝜏1‬و قيمة سقف‬
‫أولوية ‪ 𝑆2‬تساوي ) ‪ .𝑃(𝜏2‬يبين الشكل التالي جدولة هذه اإلجراءات حسب خوارزمية سقف‬
‫األولوية‪.‬‬
‫الحصول على ‪𝑆1‬‬

‫‪51‬‬
‫محاولة الحصول‬
‫على ‪𝑆1‬‬ ‫الحصول على ‪𝑆2‬‬
‫الحصول على ‪𝑆1‬‬

‫الحصول على ‪𝑆2‬‬

‫نفترض أن ‪ 𝜏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‬‬

‫‪ -3 -6 -3‬نتائج خوارزميات التحكم بالوصول للمصادر‬


‫يمكن إلجراء أن يُج َّمد من قبَل إجراء ذي أولوية أقل لمرة واحدة فقط ولفترة ال تزيد عن طول قسم‬
‫حرج واحد‪ .‬الشرط التالي كاف الختبار إمكانية جدولة ‪ n‬إجراء دوري حسب خوارزمية ‪:RM‬‬
‫‪n‬‬
‫‪ei‬‬ ‫‪B1‬‬ ‫‪Bn−1‬‬ ‫‪1‬‬
‫‪∑ ( ) + max( , … ,‬‬ ‫)‪) ≤ n(2n − 1‬‬
‫‪pi‬‬ ‫‪p1‬‬ ‫‪pn−1‬‬
‫‪𝑖=1‬‬

‫يتعرض له من ق َبل إجراء ذي‬


‫ّ‬ ‫حيث 𝑖𝐵 هو زمن التجميد األعظمي الذي يمكن لإلجراء ‪ 𝜏i‬أن‬
‫أولوية منخفضة‪ ،‬و ‪ 𝑝i‬هو دور اإلجراء ‪.𝜏i‬‬

‫‪52‬‬
‫الفصل الثالث‪ :‬تصميم برمجيات نظم الزمن الحقيقي‬
‫‪ -1‬هندسة االحتياجات‬
‫إن هندسة االحتياجات هي جزء من علم هندسة البرمجيات‪ .‬وهو يهتم بتحديد أهداف ومهام والقيود‬
‫المفروضة على النظم البرمجية‪ ،‬وتمثيل هذه المعلومات بأشكال مناسبة للنمذجة والتحليل‪ .‬هدفها‬
‫األساسي إذا ً هو إنشاء توصيف كامل وصحيح ومفهوم لكل من الزبون والمطور الحتياجات النظام‬
‫البرمجي‪ .‬هذا األمر يحتوي على تناقض بشكل من األشكال‪ ،‬إذ يجب على هندسة االحتياجات تقديم‬
‫توصيف سهل الفهم للزبون لكي يتأكد من أن النظام قيد التطوير يالئم تماما ً احتياجاته وتوقعاته‪،‬‬
‫وي جب كذلك أن تحتوي على توصيف كامل للمهام والقيود المفروضة على النظام لتكون أساسا ً‬
‫يعتمد عليه المطورون‪ .‬وفي حالة نظم الزمن الحقيقي‪ ،‬يضاف إلى كل ما سبق التعقيدات الناتجة عن‬
‫الحاجة لتمثيل قيود األداء والزمن‪.‬‬

‫يبين الشكل التالي المخطط العام لتدفق العمل في مرحلة هندسة االحتياجات من مراحل بناء نظام‬
‫الزمن الحقيقي‪ .‬تُمثَّل الفعاليات على شكل مستطيالت ذات حواف ناعمة‪ ،‬بينما تُمث َّل الوثائق الناتجة‬
‫عن هذه الفعالياتعلى شكل مستطيالت ذات رمادية‪.‬‬

‫الدراسة األولية‬ ‫استخالص‬


‫االحتياجات‬

‫تعريف االحتياجات‬

‫تقرير جدوى‬
‫نموذج النطاق‬ ‫التحقق من صالحية‬
‫االحتياجات‬

‫تعاريف االحتياجات‬

‫وثيقة االحتياجات‬ ‫مواصفات‬


‫االحتياجات‬

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

‫‪53‬‬
‫ينتقل اإلجراء بعدها لمرحلة استخالص االحتياجات‪ ،‬وهي تتضمن عمليات جمع االحتياجات‬
‫والمتطلبات باستعمال أساليب متعددة مثل مقابلة الزبون وطرح األسئلة المفصلة عليه وإجراء‬
‫صة من هذه‬ ‫النماذج األولية للمشروع ‪ .prototypes‬يمكن التعبير عن االحتياجات المستخل َ‬
‫المرحلة بأساليب متعددة تتراوح بين النص العادي المكتوب بلغة إنسانية والتوصيف الصوري‬
‫الرياضي المجرد‪ .‬لكن‪ ،‬عادة ً ما يُعبَّر عنها باستعمال نموذج النطاق‪ ،‬وهو نموذج يتضمن مخططات‬
‫عديدة مثل مخطط حاالت االستعمال ‪ ،use-case‬والمخططات العالقاتية ومخططات السياق‬
‫‪.context‬‬

‫صة‬
‫المرحلة التالية هي مرحلة تعريف االحتياجات‪ .‬فمن الضروري تعريف كل االحتياجات المستخل َ‬
‫تعريفا ً دقيقا ً بحيث يمكن تحليلها الحقا ً للتحقق من صالحيتها وكفايتها وعدم تناقضها‪ .‬خرج هذه‬
‫المرحلة هي وثيقة متطلبات تحتوي على مواصفات الحاجات البرمجية ‪Software‬‬
‫)‪ Requirement Specification (SRS‬التي تصف مزايا وتصرف النظام النهائي‪،‬‬
‫باإلضافة إلى القيود المفروضة عليه‪.‬‬

‫‪ -2‬أنواع االحتياجات‬
‫على الرغم من وجود العديد من التصنيفات لالحتياجات‪ ،‬فإن التصنيف المتبع عادة في نظم الزمن‬
‫يعرف هذا التصنيف األنواع‬
‫المعرف من قبل المنظمة ‪ّ .IEEE‬‬‫َّ‬ ‫الحقيقي هو التصنيف ‪IEEE830‬‬
‫التالية من االحتياجات‪:‬‬

‫احتياجات وظيفية ‪functional‬‬ ‫‪.1‬‬


‫الواجهات الخارجية‬ ‫‪.2‬‬
‫األداء‬ ‫‪.3‬‬
‫قاعدة المعطيات المنطقية‬ ‫‪.4‬‬
‫قيود التصميم‬ ‫‪.5‬‬
‫‪ ‬مدى التوافق مع المعايير‬
‫‪ ‬واصفات النظم البرمجية‬
‫واصفات النظم البرمجية‬ ‫‪.6‬‬
‫‪ ‬الوثوقية ‪Reliability‬‬
‫‪ ‬اإلتاحية ‪Availability‬‬
‫‪ ‬األمن ‪Security‬‬
‫‪ ‬قابلية الصيانة ‪Maintainability‬‬
‫‪ ‬الناقلية ‪Portability‬‬

‫تسمى االحتياجات من ‪ 2‬إلى ‪ 6‬باالحتياجات الغير وظيفية‪.‬‬

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

‫صف جميع مداخل ومخارج النظام وتشمل‪:‬‬


‫أما احتياجات الواجهات الخارجية‪ ،‬فهي تو ّ‬

‫االسم‬ ‫‪‬‬
‫الهدف‬ ‫‪‬‬
‫مصدر الدخل أو وجهة الخرج‬ ‫‪‬‬
‫المجاالت المقبولة والدقة والسماحية‬ ‫‪‬‬
‫وحدة القياس‬ ‫‪‬‬
‫التوقيت‬ ‫‪‬‬
‫العالقات مع المداخل والمخارج األخرى‬ ‫‪‬‬
‫أنماط المعطيات‬ ‫‪‬‬
‫أنماط األوامر‬ ‫‪‬‬

‫تشمل احتياجات األداء االحتياجات الديناميكية والساكنة المفروضة على النظام البرمجي أو تفاعل‬
‫المستخدم مع النظام البرمجي ككل‪ .‬يمكن أن تشمل االحتياجات الساكنة في نظم الزمن الحقيقي عدد‬
‫المستخدمين الذين يمكنهم استخدام النظام في نفس الوقت‪ ،‬بينما يمكن أن تشمل االحتياجات‬
‫الديناميكية عدد المناقالت ‪ transactions‬وحجم المعطيات التي يمكن معالجتها في فترة زمنية‬
‫محددة في الحاالت العادية وحاالت العبء الزائد المح َّمل على النظام‪.‬‬

‫أما احتياجات قواعد المعطيات المنطقية فهي تتضمن تعريف أنماط المعطيات المستعملة في‬
‫الوظائف المختلفة للنظام ومعدل استعمالها وسماحيات الوصول وكائنات المعطيات ‪entity‬‬
‫والعالقات بينها وشروط تكامل المعطيات‪.‬‬

‫أخيراً‪ ،‬تتعلق احتياجات قيود التصميم بمدى المطابقة مع المعايير وبحدود البينان المادي المستع َمل‪.‬‬
‫بينما تتعلق احتياجات واصفات النظم البرمجية بالوثوقية واإلتاحية واألمن وقابلية الصيانة والناقلية‪.‬‬

‫‪ -3‬توصيف احتياجات نظم الزمن الحقيقي‬


‫يبدو أنه ال يوجد أسلوب مو ّحد لتوصيف احتياجات نظم الزمن الحقيقي‪ .‬يستعمل مهندسو نظم الزمن‬
‫الحقيقي عادة أحد الطرق التالية أو خليط منها‪:‬‬

‫‪ ‬التحليل من األعلى لألسفل ‪ top-down‬أو ما يسمى بالتحليل المهيكل ‪structured‬‬


‫‪.analysis‬‬

‫‪55‬‬
‫األساليب الغرضية التوجه‪.‬‬ ‫‪‬‬
‫لغات توصيف البرامج أو شبه البرنامج ‪pseudo-code‬‬ ‫‪‬‬
‫التوصيفات الوظيفية عالية المستوى‬ ‫‪‬‬
‫أساليب أخرى عملية مثل اللغات المحكية والتوصيف الرياضي‬ ‫‪‬‬

‫يمكن تصنيف هذه األساليب بشكل عام إلى ثالثة أصناف‪ :‬أساليب صورية ‪ formal‬وغير صورية‬
‫وشبه صورية‪ .‬تعتمد األساليب الصورية مثل مخطط الحاالت المنتهية ‪Finite State‬‬
‫‪ Diagram‬ولغة ‪ Z‬على أساس رياضي متين ودقيق‪ ،‬بينما ال يمكن توصيف األساليب الغير‬
‫صورية مثل مخططات التدفق بشكل رياضي متين وال يمكن بالتالي دراستها تحليلياً‪ .‬كل ما يمكن‬
‫عمله باستعمال األساليب الغير صورية هو إيجاد مثال معاكس يبين أين فشل النظام في تحقيق‬
‫احتياجاته أو أين حدث تعارض في النظام‪ .‬هذه الطريقة ليست مناسبة في نظم الزمن الحقيقي حيث‬
‫نحتاج لتوصيف دقيق وواضح الحتياجات أداء النظام‪.‬‬

‫تسمى األساليب التي ال يمكن تصنيفها على أنها صورية تماما ً أو غير صورية تماما ً باألساليب شبه‬
‫الصورية‪ .‬يمكن أن تعتمد بعض هذه األساليب على توصيف رياضي‪ ،‬رغم أنها تبدو كأنها ليست‬
‫كذلك‪ .‬على سبيل المثال‪ ،‬يعتبر البعض أن لغة النمذجة الموحدة ‪Unified Modeling‬‬
‫)‪ Language (UML‬هي شبه صورية ألن مخطط الحالة ‪ Statechart‬فيها هو صوري لكنه‬
‫يستعمل تقانات نمذجة لها أساس شبه رياضي‪ ،‬بينما يعتبر البعض اآلخر أن ‪ UML‬هي ليست حتى‬
‫شبه صورية ألن توصيفها فيه ثغرات خطيرة وعدم تجانس‪ .‬لذلك جرى اقتراح تعديل على ‪UML‬‬
‫اسمه ‪ UML2.0‬يحوي مكونات لها توصيف صوري نظامي‪ .‬وهناك محاوالت أخرى لجعلها أكثر‬
‫صورية‪.‬‬

‫‪ -4‬الطرق الصورية لتوصيف االحتياجات البرمجية‬


‫تحاول الطرق الصورية تحسين القدرة التعبيرية لالحتياجات بتمديد وتعديل طرق رياضية معروفة‬
‫مثل منطق الفرضيات ‪ propositional logic‬وحساب اإلسناديات ‪predicate calculus‬‬
‫ونظرية المجموعات ‪ .set theory‬وهي جذابة ومفيدة ألنها تقدم طريقة علمية ممنهجة لتوصيف‬
‫االحتياجات‪ ،‬ويؤدي عادة ً استعمالها لتوصيف االحتياجات إلى اكتشاف األخطاء التصميمية منذ‬
‫المراحل األولى لدورة تطوير البرمجيات‪ ،‬حيث يمكن تصحيحها بسرعة وبأقل كلفة ممكنة‪.‬‬

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

‫هناك العديد من الطرق الصورية لتوصيف االحتياجات منها‪:‬‬

‫‪ ‬منطق الفرضيات ‪propositional logic‬‬


‫‪ ‬حساب اإلسناديات ‪predicate calculus‬‬

‫‪56‬‬
‫لغة ‪Z‬‬ ‫‪‬‬
‫آلة الحاالت المنتهية ‪Finite State Machine‬‬ ‫‪‬‬
‫مخططات الحالة ‪Statecharts‬‬ ‫‪‬‬
‫شبكات بتري ‪Petri nets‬‬ ‫‪‬‬

‫سنستعرض فيما يلي نموذجا "آلة الحاالت المنتهية" و "شبكات بتري" األكثر استعماالً في تصميم‬
‫نظم الزمن الحقيقي‪.‬‬

‫‪ -1 -4‬آلة الحاالت المنتهية )‪Finite State Machine (FSM‬‬


‫وتسمى أيضا ً "أوتومات الحاالت المنتهية" )‪ Finite State Automaton (FSA‬و "مخطط‬
‫انتقال الحالة" )‪ ،State Transition Diagram (STD‬وهو نموذج رياضي صوري يستع َمل‬
‫لتوصيف وتصميم مجال واسع من النظم‪ .‬يمكن التعبير ببساطة عن هذه اآللة بأنها تعتمد على حقيقة‬
‫أنه يمكن تمثيل معظم النظم باستعمال عدد محدد من الحاالت المتمايزة‪ .‬يمكن للنظام أن ينتقل من‬
‫حالة ألخرى بمرور الزمن أو بحدوث حدث معين‪.‬‬

‫يمكن التعبير عن ‪ 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‬‬
‫لكل لغة برمجة نقاط قوة وضعف عندما يُراد استعمالها لبرمجة نظم الزمن الحقيقي‪ ،‬ويمكن‬
‫استعمال المعايير السابقة لمقارنتها مع بعضها البعض واختيار األنسب منها حسب التطبيق المطلوب‬
‫والمهارات البرمجية المتاحة لدى فريق التطوير‪.‬‬

‫سنقدّم في هذا الفصل عرضا ً للغات البرمجة التي يمكن استعمالها لبرمجة نظم الزمن الحقيقي‪،‬‬
‫باإلضافة إلى األساليب الواجب اتباعها لتحسين البرنامج الناتج قدر اإلمكان بحيث يصبح أمثليا ً‬
‫وقابالً للتنبؤ من ناحية األداء والتصرف‪.‬‬

‫‪ -2‬لغة التجميع ‪Assembly‬‬


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

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

‫كحل وسط‪ ،‬يمكن كتابة األجزاء الحساسة فقط من النظام بلغة التجميع وكتابة الباقي بلغة عالية‬
‫المستوى‪ .‬تسمح بعض اللغات عالية المستوى مثل ‪ ADA95‬و باسكال بحشر أجزاء مكتوبة بلغة‬
‫التجميع ضمن البرنامج‪.‬‬

‫إذا أردنا تقييم لغة التجميع حسب معايير كارديللي‪ ،‬يمكن القول أنها أقتصادية جدا ً في زمن التنفيذ‬
‫والترجمة (ألنها غير مترجمة أصالً!)‪ ،‬لكنها غير اقتصادية في التطوير على نطاق ضيق أو واسع‪،‬‬
‫وفقيرة من ناحية ميزات اللغة‪.‬‬

‫‪ -3‬اللغات اإلجرائية ‪procedural languages‬‬


‫عرف فيها عمليات البرنامج على شكل الئحة من التعليمات التسلسلية تُنفَّذ على‬
‫وهي اللغات التي ت ُ َّ‬
‫التتابع‪ .‬من األمثلة عليها نذكر‪ ،C :‬باسكال‪ ،‬فورتران‪ .Modula-2 ،ADA95 ،BASIC ،‬يمكن‬
‫في جميع هذه اللغات تجميع التعليمات في وحدات منطقية لها مهام محددة تسمى التوابع‬

‫‪64‬‬
‫‪ functions‬أو البرامج الجزئية ‪ .sub-programs‬هناك العديد من الميزات التي من المهم‬
‫توفرها في هذا النوع من اللغات لجعلها مناسبة أكثر لبرمجة نظم الزمن الحقيقي نذكر منها‪:‬‬

‫تنوع أساليب تمرير المعامالت ‪parameters passing‬‬ ‫‪‬‬


‫تسهيالت الحجز الديناميكي للذاكرة ‪dynamic memory allocation‬‬ ‫‪‬‬
‫التنميط القوي للمتحوالت ‪strong variae typing‬‬ ‫‪‬‬
‫أنماط المعطيات المجردة ‪abstract data typing‬‬ ‫‪‬‬
‫معالجة االستثناءات (أخطاء زمن التنفيذ) ‪exceptions handling‬‬ ‫‪‬‬
‫توفر الوحدات البرمجية ‪modularity‬‬ ‫‪‬‬

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

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

‫أخيراً‪ ،‬تتصف اللغات اإلجرائية باالقتصاد من ناحية ميزات اللغة‪ ،‬حيث ال تتصف بالتعقيد ويسهل‬
‫عادة تعلمها واإللمام بميزاتها المختلفة‪.‬‬

‫‪ -4‬اللغات غرضية التوجه ‪object-oriented languages‬‬


‫لهذه اللغات مزايا عديدة معروفة ومفيدة جدا ً مثل الوثوقية ‪ reliability‬وزيادة فعالية المبرمج‬
‫وإمكانية إعادة االستعمال ‪ .reusability‬يمكن تعريف هذه اللغات بأنها لغات البرمجة عالية‬
‫المستوى التي تدعم تجريد المعطيات ‪ data abstraction‬والوراثة ‪ inheritance‬وتعددية‬
‫األشكال ‪ polymorphism‬وإرسال الرسائل ‪ .messaging‬من األمثلة على هذه اللغات نذكر‬
‫‪ C++‬و ‪ Java‬و ‪ C#‬و ‪ ADA95‬و ‪.Eiffel‬‬

‫إن األغراض ‪ objects‬هي وسيلة فعّالة لتخفيف تعقيد النظام ألنها تؤ ّمن بيئة طبيعية إلخفاء‬
‫سلتها ‪ ،encapsulation‬حيث تُج َمع معطيات الغرض والعمليات التي تتم عليه‬ ‫المعطيات وك ْب َ‬
‫(تسمى الطرائق ‪ methods‬وهي تقابل التوابع في اللغات اإلجرائية) في كتلة واحدة سهلة‬

‫‪65‬‬
‫االستعمال‪ .‬عادة ً ما يكون استعمال األسلوب الغرضي التوجه لتوصيف نظام ما سهل وطبيعي أكثر‬
‫من األساليب األخرى‪.‬‬

‫تدعم لغات البرمجة غرضية التوجه الحديثة العديد من التقنيات المهمة في نظم الزمن الحقيقي وذلك‬
‫سلة‬
‫سل َ‬
‫من أساس اللغة‪ ،‬مثل النياسب ‪ threads‬والمزامنة ‪ synchronization‬وال َ‬
‫‪.serialization‬‬

‫لنناقش اآلن معايير كارديللي للغات الغرضية التوجه‪ .‬فيما يتعلق باالقتصاد في زمن التنفيذ‪ ،‬تتصف‬
‫هذه اللغات بأنها أسوأ من اللغات اإلجرائية بطبيعتها وذلك لعدة أسباب أهمها بطء استدعاء الطرائق‬
‫بسبب مستوى الوصول الغير مباشر اإلضافي ‪( indirection‬يحوي كل غرض على جدول‬
‫بعناوين طرائقه يجب الرجوع إليه عند كل استدعاء ألحدها)‪.‬‬

‫فيما يتعلق باالقتصاد في زمن الترجمة‪ ،‬فإن اللغات غرضية التوجه أسوأ من اللغات اإلجرائية من‬
‫هذه الناحية أيضاً‪ .‬إذ أن مترجماتها معقدة وعادة ما يكون من الصعب تقسيم النظم الكبيرة إلى‬
‫وحدات مستقلة تماما ً عن بعضها البعض‪ .‬على سبيل المثال‪ ،‬إذا أدخل المبرمج تعديالً على صف‬
‫‪ class‬ما‪ ،‬يجب عندها إعادة ترجمة كل الصفوف الموروثة منه‪ .‬لذلك فإنه من الممكن أن يزيد‬
‫الزمن الالزم لترجمة النظام بمعدل كبير عندما يصبح حجمه كبيراً‪.‬‬

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

‫أما من ناحية االقتصاد في التطوير على نطاق واسع‪ ،‬فتتفوق فيها اللغات اإلجرائية على اللغات‬
‫غرضية التوجه على الرغم تميّز األخيرة بصفة "إعادة االستعمال" ‪ .reusability‬يعود السبب في‬
‫ذلك إلى افتقارها لإلجتزائية ‪ modularity‬بسبب صعوبة تعديل الصفوف باستعمال الوراثة‬
‫‪ .inheritance‬على سبيل المثال‪ ،‬يمكن أن يقوم المبرمج عن طريق الخطأ بإعادة تعريف‬
‫‪ override‬بعد التوابع الموروثة التي يجب عدم إعادة تعريفها لكي يعمل الصف جيداً‪ .‬لذلك‬
‫يضطر المبرمج في كثير من األحيان إلى الدخول في تفاصيل الصف األصلي لكي ينمكن من تعديله‬
‫باستعمال الوراثة‪.‬‬

‫أخيراً‪ ،‬تتصف اللغات غرضية التوجه بضعف االقتصاد في ميزات اللغة‪ .‬على سبيل المثال‪ ،‬اعتمد‬
‫تصميم لغة ‪ C++‬على نموذج بسيط نسبيا ً مبني على لغة ‪ ،Simula‬لكنها مليئة بالميزات التي‬
‫يصعب تعلمها واستعمالها بالشكل الصحيح‪ .‬حتى اللغات الحديثة مثل جافا هي أعقد بكثير مما يظنه‬
‫الكثير من الناس‪ .‬لسوء الحظ‪ ،‬تبين أن مبدأ "كل شيء هو غرض ‪ "object‬الذي بدا اقتصاديا ً‬

‫‪66‬‬
‫ومنتظما ً في البداية‪ ،‬انتهى به األمر ليصبح مجموعة هائلة من الصفوف المتعلقة ببعضها البعض‬
‫والتي يصعب استعمالها ما لم تُف َهم بمجملها‪.‬‬

‫‪ -5‬لمحة عامة عن لغات برمجة الزمن الحقيقي‬


‫سنستعرض فيما يلي عددا ً من اللغات المستعملة عادة ً لبرمجة نظم الزمن الحقيقي بالترتيب األبجدي‬
‫ألسمائها‪ .‬حذفنا من هذا العرض اللغات التابعية ‪ functional‬مثل ‪ Lisp‬و ‪ ML‬وذلك لندرة‬
‫استعمالها في نظم الزمن الحقيقي‪ ،‬وليس لقلة أهميتها‪ .‬حذفنا كذلك بعض اللغات الخطاطية ‪script‬‬
‫‪ languages‬مثل ‪ Python‬و ‪ Ruby‬وذلك ألن غير مالئمة عادة للنظم المض ّمنة‪.‬‬

‫‪ -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‬‬
‫وتفتقر لمعالجة أخطاء زمن التنفيذ وأنماط المعطيات المجردة‪ .‬لكنها ما زالت تُست َع َمل حتى اآلن في‬
‫العديد من نظم الزمن الحقيقي الحديثة‪.‬‬

‫‪ -6 -5‬لغة جافا ‪Java‬‬


‫يحول مترجم جافا البرنامج المصدر إلى لغة آلة وسيطة مستقلة عن أي معالج‬
‫سرة‪ّ .‬‬ ‫جافا هي لغة مف َّ‬
‫سر خاص هو آلة جافا االفتراضية ‪Java Virtual Machine‬‬ ‫اسمها ‪ ،byte code‬ويقوم مف ّ‬
‫دارة ‪ managed‬كما هو مبين في الشكل التالي‪:‬‬ ‫‪ JVM‬بتنفيذ هذه التعليمات في بيئة ُم َ‬
‫التعليمات الناتجة عن الترجمة‬
‫مفسر‬
‫آلة افتراضية‬

‫حاسوب‬

‫ميزة هذا األسلوب هو الناقلية ‪ ،portability‬حيث يمكن لبرنامج جافا المتر َجم أن يعمل على أية‬
‫آلة يتوفر عليها آلة جافا االفتراضية‪ .‬هناك العديد من التطبيقات الهامة لهذا األسلوب في النظم‬
‫المض ّمنة والمحمولة‪ ،‬مثل الهواتف الخلوية والبطاقات الذكية والويب‪.‬‬

‫يتوفر أيضا ً مترجمات حقيقية للغة جافا ينتج عنها ترميز ثنائي يعمل على نوع خاص من المعالجات‬
‫كغيرها من اللغات المتر َج َمة األخرى مثل ‪ .C++‬يتوفر كذلك معالجات قادرة على تنفيذ تعليمات‬
‫‪ byte code‬مباشرة‪.‬‬

‫‪69‬‬
‫جافا هي لغة غرضية التوجه تشبه كثيرا ً لغة ‪ ،C++‬لكنها ال تعتمد مفهوم المعالجة األولية للبرنامج‬
‫‪ .preprocessor‬وهي كذلك ال تدعم التمرير بالمرجع ‪ call by reference‬وليس فيها‬
‫مؤشرات صريحة‪ .‬جميع األغراض والمصفوفات فيها هي مؤشرات ضمنية ويجب حجزها‬
‫ديناميكياً‪ ،‬وتقع مسؤولية تحريرها على كاهل جزء خاص من المفسر هو جامع النفايات‬
‫‪ .Garbage Collector‬كذلك فإن المفسر يختبر معظم الحاالت التي يمكن أن تولّد أخطاءا ً في‬
‫زمن التنفيذ مثل خروج دليل مصفوفة خارج المجال الصحيح أو التقسيم على صفر‪ .‬كل هذا يجعل‬
‫أداء لغة جافا أسوأ من أداء اللغات المتر َجمة األخرى مثل ‪.C++‬‬

‫‪ -1 -6 -5‬لغة ‪real-time java‬‬


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

‫للتغلب على هذه المشاكل‪ُ ،‬كلّف المعهد الوطني للمقاييس والتكنولوجيا ‪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‬نموذج ذاكرة مو ّ‬ ‫فيما يتعلق بجمع النفايات‪ّ ،‬‬
‫إمكانية نياسب الزمن الحقيقي بتحقيق التنفيذ الحتمي ‪ .deterministic‬يسمح هذا النموذج لكل من‬
‫األغراض ذات األعمار القصيرة والطويلة بالتواجد خارج منطقة الكومة التي يتحكم بها جامع‬
‫النفايات‪ .‬وهو مرن كفاية بحيث يسمح بحلول معروفة إلدارة الذاكرة بفعالية مثل حوض األغراض‬
‫المحجوزة مسبقا ً ‪.pre-allocated object pool‬‬

‫تستعمل ‪ RTSJ‬مفهوم أولويات أكثر "رخاوة" مما هو مقبول عادة في نظم الزمن الحقيقي‪ .‬تدل‬
‫األولوية العالية إلجراء ما على أنه المؤهل األكبر لينتقيه المجدول من بين اإلجراءات الجاهزة‬
‫للتنفيذ‪ ،‬وال تدل أبدا ً على أن عملية التوزيع ‪ dispatching‬تجري بأسلوب يعتمد على األولويات‪.‬‬

‫يقوم النظام بتخزين جميع النياسب التي تنتظر امتالك مصدر ما في رتل أولوية (أي مرتبة في‬
‫الرتل حسب أولوياتها)‪ .‬تشمل هذه المصادر المعالج ومناطق الذاكرة المشتركة‪ .‬يقدّم ‪RTSJ‬‬
‫للمبرمج صفان يمكنانه من الوصول المباشر للذاكرة الفيزيائية‪ .‬األول هو‬
‫يعرف توابع تسمح ببناء أغراض تمثّل مجاالت في الذاكرة‬ ‫‪ RawMemoryAccess‬الذي ّ‬
‫الفيزيائية ‪ ،‬والوصول إليها على مستوى ‪ byte‬و ‪ word‬و ‪ .long‬الصف الثاني هو‬
‫‪ PhysicalMemory‬الذي يسمح بالحصول على أغراض من ‪PhysicalMemoryArea‬‬
‫الذي يعبّر عن مجال من عناوين الذاكرة الفيزيائية التي يمكن للنظام أن يحجز األغراض فيها‪.‬‬

‫‪ -7 -5‬لغة ‪Occam 2‬‬


‫تعتمد لغة ‪ Occam 2‬على نموذج "اإلجراءات التسلسلية المتخاطبة" ‪Communicating‬‬
‫)‪ .Sequential Processes (CSP‬الوحدة األساسية فيها هي "اإلجراء" الذي يوجد منه‬
‫أربعة أنواع أساسية‪ :‬اإلسناد‪ ،‬الدخل‪ ،‬الخرج واالنتظار‪ .‬تُبنَى اإلجراءات األعقد بتركيب تسلسلي أو‬
‫تفرعي من هذه اإلجراءات‪ .‬البنية الشرطية األساسية هي ‪ IF‬التي تحوي قائمة من شروط‬
‫وإجراءات موافقة لها‪.‬‬

‫ص ّم َمت لغة ‪ Occam 2‬أصالً لدعم المعالجة التفرعية على األجهزة التفرعية من نوع‬ ‫ُ‬
‫‪ ،transputers‬لكن يوجد لها أيضا ً مترجمات للبنى األخرى‪ .‬أخيراً‪ ،‬استُعملت هذه اللغة في‬
‫العديد من التطبيقات في بريطانيا خصوصاً‪.‬‬

‫‪ -8 -5‬لغات الزمن الحقيقي المخصصة‬


‫ظهرت واختفت العديد من لغات الزمن الحقيقي المتخصصة على مدى الثالثين سنة الماضية‪ .‬نقدم‬
‫فيما يلي بعضا ً منها‪:‬‬

‫‪71‬‬
‫ط ّورت هذه اللغة من قبل مجموعة من الباحثين األلمان في بدايات‬ ‫اللغة ‪ُ :PEARL‬‬ ‫‪‬‬
‫السبعينيات‪ ،‬ولها تطبيقات واسعة خصوصا ً في مجال األتمتة الصناعية في ألمانيا‪.‬‬
‫لغة ‪ :Real-Time Euclid‬وهي لغة تجريبية تتمتع بكونها من اللغات القليلة المناسبة‬ ‫‪‬‬
‫تماما ً لتحليل قابلية الجدولة ‪ .scheduability analysis‬لألسف‪ ،‬لم تجد هذه اللغة‬
‫طريقا ً لتحقيق تطبيقات عملية في مجال نظم الزمن الحقيقي‪.‬‬
‫لغة ‪ :Real-Time C‬وهو اسم عام للعديد من التمديدات الماكروية للغة ‪ C‬التي تقدم بنى‬ ‫‪‬‬
‫خاصة للتوقيت والتحكم الغير متوفرة في لغة ‪ C‬األصلية‪.‬‬
‫المطورة خصيصا ً‬ ‫َّ‬ ‫لغة ‪ :Real-Time C++‬وهو اسم عام للعديد من المكتبات الغرضية‬ ‫‪‬‬
‫للغة ‪ ،C++‬وهي تقدم امكانات متقدمة للتوقيت والحكم‪.‬‬

‫‪72‬‬

You might also like