Computer >> Máy Tính >  >> Lập trình >> lập trình C

C Chương trình lập lịch Vòng quay

Chúng tôi được cung cấp n quy trình với thời gian bùng nổ và lượng tử thời gian tương ứng của chúng và nhiệm vụ là tìm thời gian chờ trung bình và thời gian quay vòng trung bình và hiển thị kết quả.

Lập lịch Round Robin là gì?

Round robin là một thuật toán lập lịch CPU được thiết kế đặc biệt cho các hệ thống chia sẻ thời gian. Nó giống như một thuật toán lập lịch FCFS với một thay đổi là trong các quy trình Round Robin được giới hạn với kích thước thời gian lượng tử. Một đơn vị thời gian nhỏ được gọi là Lượng tử thời gian hoặc Lát thời gian. Lượng tử thời gian có thể nằm trong khoảng từ 10 đến 100 mili giây. CPU coi hàng đợi sẵn sàng như một hàng đợi tròn để thực hiện các quy trình với thời gian nhất định. Nó tuân theo cách tiếp cận phủ đầu vì thời gian cố định được phân bổ cho các quy trình. Nhược điểm duy nhất của nó là chi phí chuyển đổi ngữ cảnh.

Chúng tôi cần tính toán những gì?

Thời gian hoàn thành là thời gian cần thiết của quá trình để hoàn thành quá trình thực thi

Thời gian xoay vòng là khoảng thời gian giữa quá trình gửi đến khi hoàn thành.

Thời gian quay vòng =hoàn thành quy trình - gửi quy trình

Thời gian chờ là sự khác biệt giữa thời gian quay vòng và thời gian liên tục

Thời gian chờ =thời gian quay vòng - thời gian liên tục

Ví dụ

Chúng tôi đưa ra 3 quy trình P1, P2 và P3 với thời gian bùng nổ tương ứng của chúng là 24, 3 và 3

Quy trình Thời gian nổ
P1 24
P2 3
P3 3

Vì lượng tử thời gian là 4 mili giây, nên quy trình P1 nhận 4 mili giây đầu tiên nhưng nó cần 20 mili giây nữa để hoàn thành quá trình thực thi nhưng CPU sẽ xử lý nó sau lần lượng tử đầu tiên và CPU sẽ được phân bổ cho quy trình tiếp theo P2. Như được hiển thị trong bảng, Quy trình P2 chỉ cần 3 mili giây để hoàn thành quá trình thực thi của nó, do đó CPU sẽ được phân bổ cho lượng tử thời gian chỉ là 3 mili giây thay vì 4 mili giây.

C Chương trình lập lịch Vòng quay

Sử dụng biểu đồ Gantt, thời gian chờ trung bình được tính như dưới đây -

Thời gian chờ trung bình =17/3 =5,66 mili giây

Thuật toán

Start
Step 1-> In function int turnarroundtime(int processes[], int n, int bt[], int wt[], int tat[])
   Loop For i = 0 and i < n and i++
      Set tat[i] = bt[i] + wt[i]
   return 1
Step 2-> In function int waitingtime(int processes[], int n, int bt[], int wt[], int quantum)
Declare rem_bt[n]
   Loop For i = 0 and i < n and i++
      Set rem_bt[i] = bt[i]
      Set t = 0
   Loop While (1)
      Set done = true
   Loop For i = 0 and i < n and i++
      If rem_bt[i] > 0 then,
         Set done = false
      If rem_bt[i] > quantum then,
         Set t = t + quantum
         Set rem_bt[i] = rem_bt[i] - quantum
      Else
         Set t = t + rem_bt[i]
         Set wt[i] = t - bt[i]
         Set rem_bt[i] = 0
      If done == true then,
   Break
Step 3->In function int findavgTime(int processes[], int n, int bt[], int quantum)
   Declare and initialize wt[n], tat[n], total_wt = 0, total_tat = 0
   Call function waitingtime(processes, n, bt, wt, quantum)
   Call function turnarroundtime(processes, n, bt, wt, tat)
   Print "Processes Burst Time Waiting Time turnaround time "
   Loop For i=0 and i<n and i++
   Set total_wt = total_wt + wt[i]
   Set total_tat = total_tat + tat[i]
   Print the value i+1, bt[i], wt[i], tat[i]
   Print "Average waiting time = total_wt / n
   Print "Average turnaround time =total_tat / n
Step 4-> In function int main()
   Delcare and initialize processes[] = { 1, 2, 3}
   Declare and initialize n = sizeof processes / sizeof processes[0]
   Declare and initialize burst_time[] = {8, 6, 12}
   Set quantum = 2
   Call function findavgTime(processes, n, burst_time, quantum)

Ví dụ

#include <stdio.h>
// Function to calculate turn around time
int turnarroundtime(int processes[], int n,
int bt[], int wt[], int tat[]) {
   // calculating turnaround time by adding
   // bt[i] + wt[i]
   for (int i = 0; i < n ; i++)
   tat[i] = bt[i] + wt[i];
   return 1;
}
// Function to find the waiting time for all
// processes
int waitingtime(int processes[], int n,
int bt[], int wt[], int quantum) {
   // Make a copy of burst times bt[] to store remaining
   // burst times.
   int rem_bt[n];
   for (int i = 0 ; i < n ; i++)
   rem_bt[i] = bt[i];
   int t = 0; // Current time
   // Keep traversing processes in round robin manner
   // until all of them are not done.
   while (1) {
      bool done = true;
      // Traverse all processes one by one repeatedly
      for (int i = 0 ; i < n; i++) {
         // If burst time of a process is greater than 0
         // then only need to process further
         if (rem_bt[i] > 0) {
            done = false; // There is a pending process
            if (rem_bt[i] > quantum) {
               // Increase the value of t i.e. shows
               // how much time a process has been processed
               t += quantum;
               // Decrease the burst_time of current process
               // by quantum
               rem_bt[i] -= quantum;
            }
            // If burst time is smaller than or equal to
            // quantum. Last cycle for this process
            else {
               // Increase the value of t i.e. shows
               // how much time a process has been processed
               t = t + rem_bt[i];
               // Waiting time is current time minus time
               // used by this process
               wt[i] = t - bt[i];
               // As the process gets fully executed
               // make its remaining burst time = 0
               rem_bt[i] = 0;
            }
         }
      }
      // If all processes are done
      if (done == true)
         break;
   }
   return 1;
}
// Function to calculate average time
int findavgTime(int processes[], int n, int bt[],
int quantum) {
   int wt[n], tat[n], total_wt = 0, total_tat = 0;
   // Function to find waiting time of all processes
   waitingtime(processes, n, bt, wt, quantum);
   // Function to find turn around time for all processes
   turnarroundtime(processes, n, bt, wt, tat);
   // Display processes along with all details
   printf("Processes Burst Time Waiting Time turnaround time\n");
   // Calculate total waiting time and total turn
   // around time
   for (int i=0; i<n; i++) {
      total_wt = total_wt + wt[i];
      total_tat = total_tat + tat[i];
      printf("\t%d\t\t\t%d\t\t\t%d\t\t\t%d\n",i+1, bt[i], wt[i], tat[i]);
   }
   printf("Average waiting time = %f", (float)total_wt / (float)n);
   printf("\nAverage turnaround time = %f\n", (float)total_tat / (float)n);
   return 1;
}
// main function
int main() {
   // process id's
   int processes[] = { 1, 2, 3};
   int n = sizeof processes / sizeof processes[0];
   // Burst time of all processes
   int burst_time[] = {8, 6, 12};
   // Time quantum
   int quantum = 2;
   findavgTime(processes, n, burst_time, quantum);
   return 0;
}

Đầu ra

C Chương trình lập lịch Vòng quay