در این قسمت ما را با آموزش الگوریتم زمانبندی FCFS در سی شارپ همراهی کنید. الگوریتمهای زمانبندی برای تخصیص CPU به یک فرآیند استفاده میشوند. در این آموزش به نحوه پیادهسازی الگوریتم زمانبندی FCFS خواهیم پرداخت. همچنین با توجه به نحوه پیاده سازی کد این الگوریتم، پیشنهاد میکنیم پیشنیازهای زیر را مطالعه کنید:
الگوریتم زمانبندی FCFS
الگوریتم First Come First Served یا به اختصار FCFS یکی از سادهترین الگوریتمهای زمانبندی است. این الگوریتم به فرآیندهای ورودی، به ترتیب، CPU اختصاص میدهد. هر فرآیندی زودتر وارد شود زودتر به آن CPU اختصاص داده خواهد شد. در این الگوریتم برای هر فرآیند پارامترهای زیر تعریف میشود:
- Completion Time : زمانی که یک فرآیند به اتمام میرسد.
- Arrival Time : زمانی که یک فرآیند وارد صف نوبت دهی CPU میشود.
- Burst Time : مدت زمان مورد نیاز یک فرآیند برای اجرا در CPU .
- Turn Around Time : اختلاف زمانی بین Completion Time و Arrival Time .
- Waiting Time : اختلاف زمانی بین Turn Around Time و Burst Time .
فرمولهای زیر برای هر فرآیند میتوان تعریف کرد:
Turn Around Time = Completion Time – Arrival Time;
Waiting Time = Turn Around Time – Burst Time;
الگوریتم زمانبندی FCFS در سی شارپ
برای پیاده سازی FCFS ابتدا دو پارامتر Arrival Time و Burst Time را باید به عنوان ورودی به برنامه بدهیم در خروچی Completion Time و Turn Around Time و Waiting Time را چاپ میکنیم. پیاده سازی این برنامه به صورت Non-Preemptive میباشد. کد الگوریتم زمانبندی FCFS در سیشارپ به صورت زیر میباشد:
class MainClass
{
public static void Main (string[] args)
{
int[] processes = { 1, 2, 3 };
int n = processes.Length;
int[] burst_time = { 5, 9, 6 };
int[] arrival_time = { 0, 3, 6 };
int[] wt = new int[n];
int[] tat = new int[n];
findWaitingTime(processes, n, burst_time, wt, arrival_time);
findTurnAroundTime(processes, n, burst_time, wt, tat);
Display(n, burst_time, arrival_time, wt, tat);
findavgTime(n, wt, tat);
Console.WriteLine ("Press any key to Finish ...");
Console.ReadKey ();
}
static void findWaitingTime(int[] processes, int n, int[] bt, int[] wt
, int[] at) {
int[] service_time = new int[n];
service_time[0] = 0;
wt[0] = 0;
for (int i = 1; i < n; i++) {
service_time[i] = service_time[i - 1] + bt[i - 1];
wt[i] = service_time[i] - at[i];
if (wt[i] < 0)
wt[i] = 0;
}
}
static void findTurnAroundTime
(int[] processes, int n, int[] bt,
int[] wt, int[] tat) {
for (int i = 0; i < n; i++)
tat[i] = bt[i] + wt[i];
}
static void findavgTime(int n, int[] wt, int[] tat) {
int total_wt = 0, total_tat = 0;
for (int i = 0; i < n; i++) {
total_wt = total_wt + wt[i];
total_tat = total_tat + tat[i];
}
Console.Write("Average waiting time =
" + (float) total_wt / (float) n);
Console.WriteLine("\nAverage turn around time =
" + (float) total_tat / (float) n);
}
public static void
Display(int n, int[] burst_time, int[] arrival_time,
int[] wt, int[] tat) {
Console.Write
("Processes " + " Burst Time " + " Arrival Time " +
" Waiting Time " + " Turn-Around Time "
+ " Completion Time \n");
for (int i = 0; i < n; i++) {
int compl_time = tat[i] + arrival_time[i];
Console.WriteLine
(i + 1 + "\t\t" + burst_time[i] + "\t\t" + arrival_time[i]
+ "\t\t" + wt[i] + "\t\t "
+ tat[i] + "\t\t " + compl_time);
}
}
}
متدهای مورد استفاده در کد بالا به صورت زیر میباشد:
- findWaitingTime : این متد جهت محاسبه Wating Time هر فرآیند میباشد.
- findTurnAroundTime: برای محاسبه Turn Around Time فرآیندها از این متد استفاده میشود.
- Display : جهت چاپ فرآیندها در خروجی استفاده میشود.
- FindavgTime : نحوه کار این متد و دلیل پیاده سازی آن را به شما واگذار میکنیم….
متغیرهای مورد استفاده در کد فوق:
- Process: یک کد برای هر فرآیند در این آرایه ذخیره میگردد.
- N: تعداد فرآیندها
- Arrival_time یا at : زمان ورود هر فرآیند به صف.
- Burst_Time یا bt: مدت زمان مورد نیاز فرآیند برای اجرا در CPU
- Wt: منظور همان Watining Time است.
- Tat: منظور همان Turn around time برای هر فرآیند است.
- service_time : زمان تخصیص CPU به یک فرآیند. برای محاسبه این متغیر برای یک فرآیند، Burst time و Service Time فرآیند قلبی را با هم جمع میکنیم.
خروجی برنامه فوق به صورت زیر میباشد:
مثال الگوریتم زمانبندی FCFS
فرض کنید فرآیندهای زیر وارد صف برای تخصیص CPU میشوند.
گانت چارت تخصیص CPU برای فرآیندهای فوق به صورت زیر میباشد: