📚 استنادًا إلى الفصل التاسع من كتاب: Operating Systems: Internals and Design Principles – William Stallings – الإصدار التاسع
تُعد جدولة المعالج (CPU Scheduling) أحد أهم وظائف نظام التشغيل، حيث تحدد العملية التي ستحصل على المعالج التاليًا عندما يكون هناك عدة عمليات جاهزة للتنفيذ. في أنظمة أحادية المعالج (Uniprocessor)، لا يمكن تنفيذ أكثر من عملية واحدة في وقت معين، لذا فإن كفاءة اختيار العملية التالية تؤثر بشكل مباشر على أداء النظام، استجابة البرامج، استغلال الموارد، ورضا المستخدم النهائي.
تنقسم جدولة المعالج إلى ثلاثة أنواع رئيسية، تختلف في نطاقها الزمني ومسؤولياتها:
| نوع الجدولة | التوقيت | الاستخدام والمسؤولية |
|---|---|---|
| الجدولة طويلة المدى (Long-Term Scheduling / Job Scheduler) | عند دخول عمليات جديدة للنظام (مثل برامج المستخدمين). |
تُعرف أيضًا بجدولة المهام. تحدد أي العمليات الجديدة (المهام) ستُسمح بالدخول إلى قائمة العمليات الجاهزة للتنفيذ في الذاكرة الرئيسية. الهدف هو التحكم في درجة تعدد المهام (Degree of Multiprogramming) للحفاظ على توازن جيد بين العمليات التي تحتاج إلى CPU والعمليات التي تحتاج إلى I/O. مثال: نظام إدارة الدفعات (Batch System) الذي يقرر أي المهام الكبيرة سيتم تحميلها في الذاكرة. |
| الجدولة متوسطة المدى (Medium-Term Scheduling / Swapper) | أحيانًا أثناء الضغط على الذاكرة، أو عند حدوث Page Faults. |
تُستخدم هذه الجدولة بشكل أساسي في أنظمة الذاكرة الافتراضية. تقوم بإيقاف العمليات مؤقتًا ونقلها من الذاكرة الرئيسية إلى القرص الصلب (Swapping Out) لتخفيف العبء على الذاكرة. ثم تعيدها إلى الذاكرة (Swapping In) عندما تصبح الموارد متاحة أو عند الحاجة إليها. الهدف هو تحسين استخدام الذاكرة والتحكم في عدد العمليات في الذاكرة الرئيسية. مثال: عندما تكون الذاكرة ممتلئة، يقوم النظام بترحيل عملية غير نشطة إلى القرص. |
| الجدولة قصيرة المدى (Short-Term Scheduling / CPU Scheduler) | بشكل متكرر جدًا (في كل مرة تصبح فيها CPU خالية أو تحدث مقاطعة). |
هذه هي الجدولة الأكثر أهمية والأكثر تكرارًا. تُعرف أيضًا بجدولة CPU. وظيفتها هي اختيار العملية التالية من قائمة العمليات الجاهزة (Ready Queue) وتخصيص المعالج لها. تحدث هذه الجدولة في جزء من الثانية وتؤثر بشكل مباشر على وقت استجابة النظام وإنتاجيته. مثال: تحديد أي من برنامج تصفح الويب أو محرر النصوص سيحصل على المعالج في اللحظة التالية. |
🎯 تركيز الوحدة: نحن نركز في هذه الوحدة بشكل أساسي على **الجدولة قصيرة المدى (CPU Scheduling)**، وهي التي يتحكم بها ما يسمى بـ Scheduler (الجادول) داخل نواة نظام التشغيل.
توجد العديد من خوارزميات الجدولة التي تستخدمها أنظمة التشغيل لتحديد ترتيب تنفيذ العمليات. تختلف هذه الخوارزميات في أهدافها وكيفية تحقيقها. يمكن تقسيمها بشكل عام إلى خوارزميات غير استباقية (Non-Preemptive)، حيث تُنفذ العملية حتى تنتهي أو تنتقل إلى حالة انتظار، واستباقية (Preemptive)، حيث يمكن لنظام التشغيل مقاطعة العملية الجارية وتخصيص المعالج لعملية أخرى.
📌 مثال توضيحي لـ FCFS:
لنفترض العمليات التالية:
العملية وقت الوصول وقت التنفيذ (Burst Time) P1 0 8 P2 1 4 P3 2 2 مخطط جانت (Gantt Chart):
| P1 (8) | P2 (4) | P3 (2) | 0 8 12 14
- وقت انتظار P1 = 0
- وقت انتظار P2 = 8 (P1 انتهت عند 8)
- وقت انتظار P3 = 12 (P2 انتهت عند 12)
متوسط وقت الانتظار = $(0 + 8 + 12) / 3 = 20 / 3 \approx 6.67$
لاحظ أن P3، وهي عملية قصيرة جدًا، اضطرت للانتظار 12 وحدة زمنية بسبب P1 و P2.
🧠 نسخة استباقية: Shortest Remaining Time First (SRTF) - أقصر وقت متبقي أولاً
هي النسخة الاستباقية من SJF. في كل مرة تصل فيها عملية جديدة أو تنتهي عملية، يقوم Scheduler بفحص جميع العمليات الجاهزة (بما في ذلك العملية الجارية) ويختار العملية التي لديها أقصر وقت تنفيذ متبقي.
مثال لـ SRTF بنفس العمليات السابقة:
العملية وقت الوصول وقت التنفيذ P1 0 8 P2 1 4 P3 2 2 مخطط جانت (Gantt Chart):
| P1 (1) | P2 (4) | P3 (2) | P1 (7) | 0 1 5 7 14
- عند t=0: P1 تبدأ.
- عند t=1: P2 تصل (وقت P1 المتبقي = 7، وقت P2 = 4). P2 أقصر، لذا P1 تُقاطع وP2 تبدأ.
- عند t=2: P3 تصل (وقت P1 المتبقي = 7، وقت P2 المتبقي = 3، وقت P3 = 2). P3 أقصر، لذا P2 تُقاطع وP3 تبدأ.
- عند t=4: P3 تنتهي. (وقت P1 المتبقي = 7، وقت P2 المتبقي = 3). P2 أقصر، لذا P2 تستأنف.
- عند t=7: P2 تنتهي. (وقت P1 المتبقي = 7). P1 تستأنف.
- عند t=14: P1 تنتهي.
متوسط وقت الانتظار هنا سيكون أقل بكثير.
🎯 حل مشكلة المجاعة: Aging (التقادم)
لحل مشكلة المجاعة، يتم استخدام تقنية "التقادم" (Aging)، حيث يتم رفع أولوية العملية تدريجيًا كلما انتظرت في قائمة الانتظار. هذا يضمن أن العمليات ذات الأولوية المنخفضة ستحصل في النهاية على فرصة للتنفيذ.
📘 مثال لـ Round Robin:
إذا كان لدينا 3 عمليات P1 (وقت تنفيذ 10)، P2 (وقت تنفيذ 4)، P3 (وقت تنفيذ 2)، و Quantum = 4.
| P1(4) | P2(4) | P3(2) | P1(4) | P1(2) | 0 4 8 10 14 16
- P1 تُنفذ 4 وحدات زمنية.
- P2 تُنفذ 4 وحدات زمنية.
- P3 تُنفذ 2 وحدات زمنية (وتنتهي).
- P1 تُنفذ 4 وحدات زمنية أخرى.
- P1 تُنفذ آخر 2 وحدات زمنية (وتنتهي).
لاحظ كيف يتم التناوب بين العمليات لضمان حصول الجميع على وقت معالج.
لتقييم مدى فعالية خوارزمية جدولة معينة، يستخدم مهندسو أنظمة التشغيل مجموعة من المعايير التي تساعد في تحديد الأداء العام للنظام وتجربة المستخدم.
| المعيار | الوصف | الأهمية |
|---|---|---|
| وقت الانتظار (Waiting Time) | الوقت الإجمالي الذي تقضيه العملية في قائمة الانتظار الجاهزة (Ready Queue) في انتظار الحصول على المعالج. | يجب أن يكون منخفضًا قدر الإمكان لضمان استجابة سريعة للعمليات. |
| وقت الاستجابة (Response Time) | الوقت من لحظة وصول العملية إلى النظام حتى اللحظة التي تبدأ فيها العملية بإنتاج أول استجابة (أول جزء من الإخراج). هذا مهم جدًا في الأنظمة التفاعلية. | مؤشر مباشر لمدى سرعة استجابة النظام للمستخدم. |
| وقت الإنهاء (Turnaround Time) | الوقت الكلي الذي تستغرقه العملية من لحظة وصولها إلى النظام حتى لحظة انتهائها بالكامل. يشمل ذلك وقت التنفيذ، وقت الانتظار في قائمة الجاهزية، ووقت انتظار I/O. | مؤشر على كفاءة النظام في إنجاز المهام من البداية للنهاية. |
| استخدام المعالج (CPU Utilization) | نسبة الوقت الذي يكون فيه المعالج مشغولًا بتنفيذ المهام المفيدة، بدلاً من أن يكون خاملًا. | يجب أن تكون عالية (مثلاً 40% - 90%) لضمان الاستفادة القصوى من موارد المعالج. |
| الإنتاجية (Throughput) | عدد العمليات المنجزة في وحدة زمنية معينة (مثلاً، عدد العمليات المكتملة في الساعة). | مؤشر على كفاءة النظام في معالجة حجم كبير من العمل. |
غالبًا ما تكون هناك مفاضلات بين هذه المعايير؛ فمثلاً، خوارزمية تُقلل وقت الاستجابة قد تزيد من وقت الإنهاء، والعكس صحيح. يعتمد اختيار الخوارزمية الأفضل على أهداف النظام المحددة.
تُعد أنظمة Unix (وأنظمتها المشتقة مثل Linux) مثالًا ممتازًا على كيفية تطبيق خوارزميات الجدولة في نظام تشغيل حقيقي. تاريخيًا، استخدم Unix خوارزمية جدولة معقدة ومُحسّنة تعتمد على الأولوية الديناميكية.
بدلاً من الأولوية الثابتة، يتم تعديل أولوية العملية أثناء التشغيل. هذا يسمح للنظام بالتكيف مع سلوك العمليات وتجنب المجاعة.
كل عملية تملك قيمة "niceness" (عادةً تتراوح من -20 إلى +19). هذه القيمة يحددها المستخدم أو العملية نفسها. قيمة "niceness" الأعلى (أكثر إيجابية) تعني أولوية أقل (أي أن العملية "لطيفة" وتسمح للآخرين بالتشغيل). قيمة "niceness" الأقل (أكثر سلبية) تعني أولوية أعلى.
يقوم نظام Unix بتخفيض أولوية العملية تدريجيًا كلما استخدمت وقتًا أطول من المعالج (CPU). هذا يشجع العمليات التي تحتاج إلى I/O (I/O-bound processes) على الحصول على المعالج بشكل أسرع، ويمنع العمليات التي تستهلك المعالج بكثرة (CPU-bound processes) من احتكاره.
يحدث التبديل بين العمليات بشكل منتظم (عادةً كل 100 ميلي ثانية) لضمان الاستجابة الجيدة للأنظمة التفاعلية.
📘 قراءة موسعة: Unix Process Scheduling – Operating Systems: Principles and Practice (PDF)
لتعزيز فهمك لخوارزميات الجدولة وتأثيرها على أداء النظام، يُنصح بالقيام بالأنشطة والتطبيقات العملية التالية:
اختر مجموعة من العمليات بأوقات وصول وأوقات تنفيذ مختلفة. قم برسم مخطط جانت (Gantt Chart) لكل من خوارزميات FCFS, SJF (غير استباقية واستباقية - SRTF), Priority (مع وبدون Aging), و Round Robin (بأحجام Quantum مختلفة). بعد الرسم، قم بحساب متوسط وقت الانتظار، وقت الاستجابة، ووقت الإنهاء لكل خوارزمية وقارن النتائج.
هناك العديد من الأدوات التفاعلية المتاحة عبر الإنترنت التي تسمح لك بتجربة خوارزميات الجدولة المختلفة وتصور كيفية عملها. جرب الروابط التالية:
استخدم هذه المحاكيات لتغيير أوقات وصول العمليات، أوقات التنفيذ، الأولويات، وأحجام Quantum، ولاحظ كيف تتغير مقاييس الأداء.
قم بتحليل متعمق للمفاضلة بين خوارزميتي SJF و Round Robin. متى تكون SJF أفضل؟ ومتى يكون Round Robin هو الخيار الأفضل؟ فكر في سيناريوهات مختلفة (مثل الأنظمة الدفعية مقابل الأنظمة التفاعلية) وحدد الخوارزمية الأكثر ملاءمة لكل سيناريو بناءً على معايير الأداء.
في هذه الوحدة، تعمقنا في مفهوم **جدولة أحادية المعالج (Uniprocessor Scheduling)**، وهو حجر الزاوية في تصميم أنظمة التشغيل الفعالة. استكشفنا **أنواع الجدولة** المختلفة (طويلة، متوسطة، وقصيرة المدى) ودور كل منها. ثم تناولنا بالتفصيل **خوارزميات الجدولة الشائعة** مثل FCFS، SJF (و SRTF)، Priority Scheduling (مع حل مشكلة المجاعة عبر Aging)، و Round Robin (مع أهمية اختيار Quantum). تعلمنا أيضًا عن الخوارزميات الأكثر تعقيدًا مثل Multilevel Queue و Multilevel Feedback Queue. قمنا بمراجعة **معايير تقييم الأداء** الرئيسية (وقت الانتظار، وقت الاستجابة، وقت الإنهاء، استخدام المعالج، الإنتاجية) وكيفية استخدامها لمقارنة الخوارزميات. وأخيرًا، ألقينا نظرة على كيفية تطبيق الجدولة في **نظام Unix التقليدي**. فهم هذه المفاهيم ضروري لأي شخص يهدف إلى تصميم أو تحليل أداء أنظمة التشغيل والبرمجيات المتزامنة.