في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
نظم التشغيل 1، الدرس العملي 7
مجموعة واحدة من العمليات وست خوارزميات جدولة: ابن كل مخطط جانت يدويا، ثم دع برنامجا بلغة C# يتحقق من حلك.
الجزء 1
مخطط واحد، وثلاث صيغ، وبضع قواعد
مثال FCFS من المحاضرة: تصل P3 عند 0، وP1 عند 4، وP5 عند 5، وP2 وP4 عند 6
| P3 | idle | P1 | P5 | P2 | P4 |
0 3 4 9 13 17 193 إلى 4)| الرمز | المعنى |
|---|---|
S | بداية آخر خانة للعملية في المخطط |
R | الزمن الذي عملته العملية قبل تلك الخانة |
Σ | مجموع عمود، فيكون ΣTAT / n متوسط TAT لعدد n من العمليات |
| العملية | AT | BT | الأولوية |
|---|---|---|---|
| P1 | 0 | 8 | 4 |
| P2 | 2 | 3 | 5 |
| P3 | 3 | 4 | 2 |
| P4 | 4 | 2 | 1 |
| P5 | 6 | 7 | 3 |
الجزء 2
غير استباقية (non-preemptive): متى حصلت العملية على المعالج احتفظت به حتى تنتهي
ثلاث عمليات تصل عند 0 بأزمنة تنفيذ 18، 3، 3. توقع متوسط زمن الانتظار لكل ترتيب.
| الترتيب | أزمنة الانتظار | متوسط WT |
|---|---|---|
| P1, P2, P3 | 0, 18, 21 | 13 |
| P2, P3, P1 | 0, 3, 6 | 3 |
نخدم بحسب الوصول تماما: P1 عند 0، وP2 عند 2، وP3 عند 3، وP4 عند 4، وP5 عند 6
| P1 | P2 | P3 | P4 | P5 |
0 8 11 15 17 24| العملية | CT | TAT = CT - AT | WT = TAT - BT |
|---|---|---|---|
| P1 | 8 | 8 - 0 = 8 | 8 - 8 = 0 |
| P2 | 11 | 11 - 2 = 9 | 9 - 3 = 6 |
| P3 | 15 | 15 - 3 = 12 | 12 - 4 = 8 |
| P4 | 17 | 17 - 4 = 13 | 13 - 2 = 11 |
| P5 | 24 | 24 - 6 = 18 | 18 - 7 = 11 |
ترتيب FCFS نفسه، لكن كل إسناد للمعالج يكلف أولا وحدة زمنية مقدارها 1 (del)
| del | P1 | del | P2 | del | P3 | del | P4 | del | P5 |
0 1 9 10 13 14 18 19 21 22 29تعمل P1 من 0 إلى 8 دون توقف. من ينتظر عند 8، وبأي ترتيب؟
| العملية | BT | ترتيب التنفيذ |
|---|---|---|
| P4 | 2 | 1 |
| P2 | 3 | 2 |
| P3 | 4 | 3 |
| P5 | 7 | 4 |
| P1 | P4 | P2 | P3 | P5 |
0 8 10 13 17 24| العملية | CT | TAT = CT - AT | WT = TAT - BT |
|---|---|---|---|
| P1 | 8 | 8 - 0 = 8 | 8 - 8 = 0 |
| P2 | 13 | 13 - 2 = 11 | 11 - 3 = 8 |
| P3 | 17 | 17 - 3 = 14 | 14 - 4 = 10 |
| P4 | 10 | 10 - 4 = 6 | 6 - 2 = 4 |
| P5 | 24 | 24 - 6 = 18 | 18 - 7 = 11 |
SJF الاستباقية: عند كل وصول، قارن بين زمن تنفيذ العملية الجديدة والزمن المتبقي (remaining time) للعملية الجارية
| الزمن | الحدث | القرار |
|---|---|---|
| 0 | تصل P1 (8) | تعمل P1 |
| 2 | تصل P2 (3)؛ والمتبقي من P1 هو 6 | 3 < 6: تنتزع P2 المعالج من P1 |
| 3 | تصل P3 (4)؛ والمتبقي من P2 هو 2 | تحتفظ P2 بالمعالج |
| 4 | تصل P4 (2)؛ والمتبقي من P2 هو 1 | 2 ليس أقل من 1: تحتفظ P2 به |
| 5 | تنتهي P2 | المتبقي: P1 6، P3 4، P4 2: تعمل P4 |
| الزمن | الحدث | القرار |
|---|---|---|
| 6 | تصل P5 (7)؛ والمتبقي من P4 هو 1 | تحتفظ P4 بالمعالج |
| 7 | تنتهي P4 | P1 6، P3 4، P5 7: تعمل P3 |
| 11 | تنتهي P3 | P1 6، P5 7: تعمل P1 |
| 17 | تنتهي P1 | تعمل P5 حتى 24 |
| P1 | P2 | P4 | P3 | P1 | P5 |
0 2 5 7 11 17 24اقرأ كل زمن انتظار من المخطط مباشرة: آخر بداية - الزمن المنفذ قبلها - AT
| العملية | آخر بداية - المنفذ قبلها - AT | WT |
|---|---|---|
| P1 | 11 - 2 - 0 | 9 |
| P2 | 2 - 0 - 2 | 0 |
| P3 | 7 - 0 - 3 | 4 |
| P4 | 5 - 0 - 4 | 1 |
| P5 | 17 - 0 - 6 | 11 |
الجزء 3
من الأهم، ومن انتظر بما يكفي
تعمل P1 (الأولوية 4) من 0 إلى 8؛ وتصل P3 (2) وP4 (1) في أثناء ذلك وعليهما الانتظار
| P1 | P4 | P3 | P5 | P2 |
0 8 10 14 21 24| الزمن | الحدث | القرار |
|---|---|---|
| 2 | تصل P2 (الأولوية 5) | أسوأ من P1 (4): تستمر P1 |
| 3 | تصل P3 (2) | أفضل من P1 (4): تنتزع P3 المعالج من P1 |
| 4 | تصل P4 (1) | أفضل من P3 (2): تنتزع P4 المعالج من P3 |
| 6 | تنتهي P4؛ وتصل P5 (3) | أفضل عملية منتظرة: P3 (2) |
| 9 | تنتهي P3 | ثم P5 (3)، ثم P1 (4)، ثم P2 (5) |
توقع المخطط من القرارات، ثم زمن انتظار كل عملية
| P1 | P3 | P4 | P3 | P5 | P1 | P2 |
0 3 4 6 9 16 21 24P2 أسوأ أولوية: تنتظر 19 وحدة من أصل 24 في مخططي الأولوية كليهماq (time quantum) على الأكثرالطابور مكتوب بدءا من رأسه، بعد القرار
| الزمن | الحدث | المعالج والطابور |
|---|---|---|
| 0 | تصل P1 | تعمل P1؛ والطابور فارغ |
| 2 | تصل P2 | تعمل P1؛ والطابور P2 |
| 3 | تصل P3 وتنتهي شريحة P1 | تعمل P2؛ والطابور P3, P1 |
| 4 | تصل P4 | تعمل P2؛ والطابور P3, P1, P4 |
| 6 | تصل P5؛ وتنتهي P2 (احتاجت إلى 3) | تعمل P3؛ والطابور P1, P4, P5 |
| الزمن | الحدث | المعالج والطابور |
|---|---|---|
| 9 | تنتهي شريحة P3 (المتبقي 1) | تعمل P1؛ والطابور P4, P5, P3 |
| 12 | تنتهي شريحة P1 (المتبقي 2) | تعمل P4؛ والطابور P5, P3, P1 |
| 14 | تنتهي P4 (احتاجت إلى 2) | تعمل P5؛ والطابور P3, P1 |
| 17 | تنتهي شريحة P5 (المتبقي 4) | تعمل P3؛ والطابور P1, P5 |
| 18 | تنتهي P3 | تعمل P1 من 18 إلى 20، ثم P5 وحدها حتى 24 |
خانتان لـP5 في النهاية: تنتهي شريحتها عند 23، والطابور فارغ، فيعود إليها المعالج فورا
| P1 | P2 | P3 | P1 | P4 | P5 | P3 | P1 | P5 | P5 |
0 3 6 9 12 14 17 18 20 23 24المجموعة A مرة أخرى، ولا يتغير إلا q
| الشريحة الزمنية | متوسط WT | مرات تبديل العملية |
|---|---|---|
| 1 | 9.2 | 20 |
| 3 | 8.6 | 8 |
| 4 | 6.6 | 5 |
| 8 | 7.2 | 4 |
الجزء 4
ست خوارزميات جدولة على مدخل واحد، وجدولة مبنية من الطوابير
عمليات النظام
الأولوية الأعلى
العمليات التفاعلية
عمليات التحرير التفاعلي
العمليات الدفعية (batch)
عمليات الطلاب
الأولوية الأدنى
Q0
شريحة زمنية 8
Q1
شريحة زمنية 16
Q2
FCFS
30 ms: 8 في Q0، و16 في Q1، وآخر 6 في Q2أربعة أسئلة بأسلوب الامتحان من مسائل المحاضرة
n مهمة ذات أزمنة تشغيل معروفة على معالج واحد: أي خوارزمية تعطي أقصى إنتاجية (throughput): التناوب الدائري، أم SJF، أم أعلى نسبة استجابة أولا (highest response ratio next)، أم FCFS؟T وحدة؛ وتصل العمليات كلها عند 0 دون إدخال وإخراج (I/O). ما الخوارزمية المكافئة لهذه؟الجزء 5
دع برنامجا يرسم المخططات نفسها
public class Process
{
public string Id { get; }
public int Arrival { get; }
public int Burst { get; }
public int Priority { get; }
public int Remaining { get; set; }
public int Completion { get; set; }
// constructor: Remaining = burst
}
public record Slice(string Id, int Start, int End);Remaining تنقص بمقدار 1 مع كل وحدة زمنية تعمل فيها العمليةCompletion (CT) تضبط عندما تصل Remaining إلى 0Slice هي خانة واحدة في مخطط جانتwhile (done < ps.Count)
{
var ready = ps.Where(p => p.Arrival <= time && p.Remaining > 0 && p != running)
.OrderBy(rank).ThenBy(p => p.Arrival).ThenBy(p => p.Id).ToList();
if (running == null)
running = ready.FirstOrDefault();
else if (preemptive && ready.Count > 0 && rank(ready[0]) < rank(running))
running = ready[0];
AddTick(gantt, running?.Id ?? "idle", time, false);
if (running != null && --running.Remaining == 0)
{
running.Completion = time + 1; running = null; done++;
}
time++;
}foreach (var p in ps.Where(p => p.Arrival == time).OrderBy(p => p.Id))
queue.Enqueue(p); // 1. new arrivals join first
if (running != null && used == quantum)
{
queue.Enqueue(running); // 2. then the preempted process
running = null;
}bool dispatched = false;
if (running == null && queue.Count > 0)
{
running = queue.Dequeue(); // 3. the head gets the CPU
used = 0;
dispatched = true;
}var ps = SetA();
Report.Print("FCFS", ps, Scheduler.Run(ps, p => p.Arrival, false));
ps = SetA();
Report.Print("SJF (non-preemptive)", ps, Scheduler.Run(ps, p => p.Burst, false));
ps = SetA();
Report.Print("SRTF (preemptive SJF)", ps, Scheduler.Run(ps, p => p.Remaining, true));كتلة SRTF من مخرجات البرنامج. توقعها من مخططنا أولا.
=== SRTF (preemptive SJF)
P1 0-2 | P2 2-5 | P4 5-7 | P3 7-11 | P1 11-17 | P5 17-24
P1 AT= 0 BT= 8 CT=17 TAT=17 WT= 9
P2 AT= 2 BT= 3 CT= 5 TAT= 3 WT= 0
P3 AT= 3 BT= 4 CT=11 TAT= 8 WT= 4
P4 AT= 4 BT= 2 CT= 7 TAT= 3 WT= 1
P5 AT= 6 BT= 7 CT=24 TAT=18 WT=11
Average WT = 5.00 Average TAT = 9.80الجزء 6
نحو 30 دقيقة: حل على الورق، ثم تحقق بالأداة التفاعلية أو ببرنامج C#
نحو 6 دقائق
| العملية | AT | BT |
|---|---|---|
| P1 | 1 | 4 |
| P2 | 0 | 2 |
| P3 | 3 | 3 |
| P4 | 3 | 1 |
| P5 | 13 | 2 |
| P2 | P1 | P3 | P4 | idle | P5 |
0 2 6 9 10 13 15نحو 8 دقائق
| العملية | AT | BT |
|---|---|---|
| P1 | 0 | 8 |
| P2 | 2 | 2 |
| P3 | 6 | 5 |
| P4 | 7 | 1 |
| P1 | P2 | P1 | P4 | P1 | P3 |
0 2 4 7 8 11 16نحو 8 دقائق
| العملية | AT | BT | الأولوية |
|---|---|---|---|
| P1 | 0 | 6 | 3 |
| P2 | 2 | 2 | 5 |
| P3 | 3 | 3 | 2 |
| P4 | 4 | 4 | 1 |
| P5 | 7 | 3 | 4 |
| P1 | P2 | P1 | P5 | P1 | P3 | P4 |
0 2 4 7 10 11 14 18نحو 8 دقائق
| العملية | AT | BT |
|---|---|---|
| P1 | 0 | 3 |
| P2 | 1 | 2 |
| P3 | 4 | 5 |
| العملية | AT | BT |
|---|---|---|
| P4 | 6 | 3 |
| P5 | 7 | 4 |
| P6 | 8 | 2 |
| P1 | P2 | P1 | P3 | P4 | P5 | P3 | P6 | P4 | P5 | P3 |
0 2 4 5 7 9 11 13 15 16 18 19TAT = CT - AT وWT = TAT - BT؛ وفي المخططات الاستباقية WT = S - R - ATMahmoud Abas|جدولة المعالج: تمارين ومحاكاة بلغة C#