المقدمة
الـ Scheduler في أنظمة التشغيل هو عبارة عن العنصر اللي بيحدد إزاي وإمتى المعالجات (CPUs) تستغل وقتها في تنفيذ البرامج المختلفة. يعني لو عندنا أكتر من برنامج شغال في نفس الوقت، الـ Scheduler هو اللي بيتحكم في توزيع وقت الـ CPU على البرامج دي.
خلينا نتخيل إننا قاعدين بنذاكر وفي نفس الوقت بنحاول نرد على رسايل مابعوتالنا في السوشيال ميديا وعاوزين نشغل حاجة نسمعها. عقلنا هنا بيقوم بدور الـ Scheduler فهو اللي بيحدد إزاي هيقسم وقتنا بين التلات حاجات دول. ممكن نذاكر شوية وبعدين نرد على الرسايل وبعدين نرجع تذاكر تاني ونشغل معاها حاجة. فنفس الموضوع بالظبط بالنسبة للـ CPU والبرامج اللي شغالة.
Process
قبل ما نتكلم باه عن الـ Process Scheduling ونعرف ازاي الـ OS بيـ Schedule الـ Process ويخليها تستغل الـ CPU وازاي يبقى مخصص لكل Process ؟ محتاجين نعرف ايه هي الـ Process , وكنا اتكلمنا عنها في ورقة قبل كده نقدر نشوفها من هنا:

Program vs Process vs Thread
وكنا اتكلمنا قبل كده برضو عن الـ Process Management:

Process Management
Process Scheduling
فيه عندنا 3 أنواع من الـ Process Schedulers اللي أنظمة التشغيل بتستخدمهم:
- الـ Long-Term Scheduler (Job Scheduler): وده المسؤول عن إنه يقرر انهي برنامج يدخل الـ Ready Queue، اللي هو Queue البرامج بتستنى فيه لحد ما الـ CPU يبقى فاضي ويبدأ يشتغل عليها. ده زي ما بنكون كده بنقرر إيه المواد اللي هنذاكرها في يومنا قبل ما نبدأ فعليا في مذاكرتها.
- الـ Short-Term Scheduler (CPU Scheduler): ده بيكون المسؤول عن إنه يقرر انهي البرامج الموجودة في الـ Ready Queue هياخد الـ CPU ويبدأ يشتغل عليه فعليًا. او بمعنى اصح يعني مين اللي عليه الدور دلوقتي ياخد وقت من دماغك.
- الـ Medium-Term Scheduler: وده بيشتغل في بعض الأنظمة اللي بتستخدم تقنية الـ Swapping. فبيقرر إمتى يوقف برنامج من الشغل ويطلعه برا الذاكرة (RAM) عشان يدي امكانية لباقي البرامج انها تشتغل على الـ CPU. وبعدين لما يبقى فيه مكان فاضي يرجعه تاني.

مصطلحات خاصة بالـ CPU Scheduling
- الـ Arrival Time: هو الوقت اللي الـ Process بتدخل فيه الـ Ready Queue وتكون مستنية يكون ليها وقت الـ CPU وتشتغل عليه.
- الـ Completion Time: ده الوقت اللي فيه الـ Process بتخلص الـ Execution بتاعها أو بتكون خلاص اتنفذت.
- الـ Burst Time: وده الوقت اللي بتحتاجه الـ Process عشان تتنفذ على الـ CPU.
- الـ Turn-Around Time: وده فرق الوقت بين الـ Completion Time والـ Arrival Time
- الـ Waiting Time: وده فرق الوقت بين الـ Turn-Around Time والـ Burst Time
Scheduling Algorithms
فيه أكتر من خوارزمية ممكن الـ Scheduler يستخدمها، وكل واحدة ليها طريقة مختلفة في توزيع وقت الـ CPU على البرامج:
- الـ First-Come, First-Served (FCFS): الخوارزمية دي بتدي وقت الـ CPU للبرنامج اللي وصل الأول فهي شبه الـ Queue بالظبط يعني FIFO. اكننا بنرد على الرسايل اللي جاتلنا الأول حسب الترتيب , أو اكننا عاملين Form والحضور بالأسبقية.
- الـ Shortest Job Next (SJN): هنا الـ Scheduler بيدي الأولوية للبرنامج اللي هيخلص أسرع وده بيتم من خلال الـ Burst Time اللي بيكون محدده وبعض الـ Estimation واللي بتتعدل مع تنفيذ البرنامج فعليا ومعرفة الـ Burst Time اللي بيحتاجه البرنامج.
- الـ Round Robin (RR): وده بقى زي نظام اننا نمشي بالدور، كل برنامج بياخد وقت محدد وبعدها الـ CPU ينتقل للبرنامج اللي بعده وهكذا. اكنك بترد على اكتر من واحد بيكلمك في نفس الوقت ، وانت بتبدل بينهم كل واحد شوية فبترد على الاول ثم التاني ثم التالت وهكذا.
- الـ Priority Scheduling: في النوع ده من الـ Scheduling البرامج اللي ليها أولوية أعلى هي اللي بتاخد وقت الـ CPU الأول. زي لما تسيب كل حاجة وترد على رسالة من حد مهم بالنسبة لك وده لان ليها اولوية عن باقي الرسايل.
التحديات والمشاكل
الـ Scheduler بيواجه تحديات كتيرة، زي:
- الـ Starvation: لما يكون فيه برنامج ليه أولوية منخفضة ومش قادر ياخد اصلا اي وقت من الـ CPU عشان فيه برامج أولويتها أعلى شغالة على طول (بيموت من الجوع).
- الـ Deadlock: ده بيحصل لما يكون فيه مجموعة من البرامج كل واحد مستني حاجة من التاني، وساعتها مفيش حاجة بتتحرك خالص.
وكنا برضو اتكلمنا عن الفرق بين الاتنين بالتفصيل وبعض الآليات اللي ممكن نعملها عشان نحاول نحل المشكلة:

Deadlock vs Starvation
في النهاية، الـ Scheduler هو جزء أساسي ومهم جداً في أي نظام تشغيل. دوره إنه ينظم ويوزع وقت الـ CPU بشكل فعال عشان كل البرامج تشتغل بسلاسة من غير ما تحس إن فيه تأخير أو تهنيج.

Discussion