در این قسمت ما را با آموزش الگوریتم زمانبندی Round robin در سی شارپ همراهی…
الگوریتم زمانبندی LJF در سی شارپ (Longest Job First)
این جلسه ما را با ادامه آموزش الگوریتمهای زمانبندی همراهی کنید. در این قسمت به آموزش الگوریتم زمانبندی LJF در سی شارپ میپردازیم. ابتدا این الگوریتم را معرفی و سپس به پیادهسازی آن خواهیم پرداخت. پیشنهاد میکنیم قبل از مطالعه این جلسه، آموزشهای زیر را مطالعه کنید:
- الگوریتم Round Robin در سی شارپ
- الگوریتم FCFS در سی شارپ
- متد در سی شارپ
- شی گرایی در سی شارپ
- Constructor در سی شارپ
- حلقه for در سی شارپ
- حلقه while در سی شارپ
- If در سی شارپ
الگوریتم زمانبندی LJF
Longest Job First یا به اختصار LJF یک الگوریتم زمانبندی در سیستم عامل است. در این الگوریتم، همه فرآیندها بررسی و از بین فرایندهای منتظر در صف اجرا، فرایندی انتخاب میشود که به طولانیترین زمان برای اجرا شدن(burst Time) نیاز داشته باشد. به این جا به چند ویژگی LJF اشاره میکنیم:
- در این الگوریتم میتواند Starvation رخ دهد.
- زمان اتمام فرآیندها نزدیک به یکدیگر است.
- این روش مقدار Average time بالا است.
پیادهسازی الگوریتم زمانبندی LJF در سی شارپ
برای پیاده سازی الگوریتم زمانبندی LJF در سی شارپ مراحل زیر را انجام میدهیم:
- فرآیندهای خود را تعریف میکنیم.
- بر اساس arrival Time ، فرآیندها را وارد صف انتظار میکنیم.
- فرآیندهای درون صف انتظار را بر اساس Burst Time مرتب میکنیم(به صورت نزولی).
- به طولانیترین فرآیند CPU اختصاص مییابد.
- مراحل 2 تا 5 را تا زمان اتمام فرآیندها ادامه میدهیم.
کد الگوریتم LJF در سی شارپ به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
class MainClass { public static void Main (string[] args) { ArrayList p = new ArrayList(); p.Add(new MyProcess(1, 6, 1)); p.Add(new MyProcess(2, 8, 1)); p.Add(new MyProcess(3, 7, 2)); p.Add(new MyProcess(4, 3, 3)); LJF(p); CalWaitingTime(p); CalTurnAroundTime(p); display(p); Console.WriteLine("Press any key to finish program"); Console.ReadKey (); } private static void CalTurnAroundTime(ArrayList p) { for (int i = ; i < p.Count; i++) { MyProcess temp = (MyProcess)p[i]; temp.tat = temp.waiting_time + temp.bt; } } public static void display(ArrayList p) { Console.WriteLine("Processes " + " Burst time " + " Waiting time " + " Turn around time" + " Completion Time " + " Arrival Time"); for (int i = ; i < p.Count; i++) { MyProcess temp = (MyProcess)p [i]; Console.WriteLine(" " + temp.pid + "\t\t" + temp.bt + "\t\t " + temp.waiting_time + "\t\t " + temp.tat + "\t\t" + temp.completion_time + "\t\t" +temp.art); } } public static void LJF(ArrayList AllProcess) { ArrayList waitingProcess = new ArrayList(); int time = ; int complete_process = ; while (AllProcess.Count != complete_process) { CheckArrivalTime(AllProcess, waitingProcess, time); if (waitingProcess.Count <= ) { time++; continue; } Sort(waitingProcess); MyProcess LongestProcess = (MyProcess)waitingProcess[]; time += LongestProcess.bt; LongestProcess.completion_time = time; LongestProcess.is_finished = true; waitingProcess.RemoveAt(); complete_process++; } } public static void CalWaitingTime(ArrayList p) { for (int i = ; i < p.Count; i++) { MyProcess p1 = (MyProcess)p[i]; p1.waiting_time = p1.completion_time - p1.bt - p1.art; if (p1.waiting_time < ) { p1.waiting_time = ; } } } public static void Sort(ArrayList waitingProcess) { for (int i = ; i < waitingProcess.Count; i++) { for (int j = ; j < waitingProcess.Count - 1; j++) { MyProcess p1 = (MyProcess) waitingProcess[j]; MyProcess p2 = (MyProcess) waitingProcess[j + 1]; if (p2.bt > p1.bt) { waitingProcess [j] = waitingProcess [j + 1]; waitingProcess [j + 1] = p1; } } } } public static void CheckArrivalTime(ArrayList Process, ArrayList waitingProcess, int time) { for (int i = ; i < Process.Count; i++) { MyProcess p = (MyProcess) Process[i]; if (p.art <= time && !p.addTowaiting) { p.addTowaiting = true; waitingProcess.Add(p); } } } } public class MyProcess { public int pid; // Process ID public int bt; // Burst Time public int art; // Arrival Time public int completion_time; public int waiting_time; public int tat;//turn around time public bool is_finished = false; public bool addTowaiting = false; public MyProcess(int pid, int bt, int art) { this.pid = pid; this.bt = bt; this.art = art; } } |
ما برای پیادهسازی الگوریتم LJF از دو کلاس زیر استفاده کردیم:
- MyProcess: این کلاس برای تعریف یک فرآیند استفاده میشود و مواردی همچون Burst Time، arrival Time و waiting time و …. در آن تعریف شده است.
- LJF: در این کلاس الگوریتم LJF پیاده سازی شده است.
متدهای کد فوق شامل موارد زیر است:
- CheckArrivalTime: این متد زمان ورود فرآیندها را به صف انتظار بررسی میکند.
- Sort: این متد صف انتظار ما را با روش مرتب سازی حبابی، مرتب میکند(به صورت نزولی).
- CalWaitingTime: محاسبه waiting time فرآیندها در این متد انجام میشود.
- LJF: با کمک متدهای موارد بالا، الگوریتم LJF در این متد به اجرا در میآید.
- Display: جهت نمایش فرآیند ها در خروجی از display استفاده میشود.
متغیرهای کد فوق:
- AllProcess یا p یا process: تمامی فرآیندها در Arraylist به نام AllProcess (p یا process) ذخیره میشوند.
- waitingProcess: منظور صف انتظار ما است.
- Bt: منظور burst time فرآیند است.
- Art: منظور arrival Time است.
- Tat: منظور turn around time است.
خروجی کد فوق به صورت زیر است:

پسورد: www.codegate.ir