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

Chương trình C ++ để lập lịch ưu tiên

Chúng tôi được cung cấp với số lượng n quá trình, tức là P1, P2, P3, ......., Pn với thời gian bùng nổ tương ứng và mức độ ưu tiên của chúng được liên kết với mỗi quá trình. Nhiệm vụ là tìm thời gian chờ trung bình, thời gian quay vòng trung bình và trình tự thực hiện quy trình bằng cách sử dụng thuật toán lập lịch CPU ưu tiên.

Thời gian chờ và Thời gian quay vòng là gì?

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

Lập lịch ưu tiên là gì?

Trong lập lịch ưu tiên, mọi quy trình được liên kết với mức độ ưu tiên từ 0-10 trong đó, số nguyên 0 đại diện cho mức độ ưu tiên thấp nhất và 10 đại diện cho mức độ ưu tiên cao nhất. Các ưu tiên có thể được xác định theo hai cách, tức là bên trong và bên ngoài. Ngoài ra, lập lịch ưu tiên có thể là ưu tiên hoặc không ưu tiên.

Trong lập lịch ưu tiên trước, bộ lập lịch sẽ nhắc CPU nếu mức độ ưu tiên của quá trình mới đến cao hơn mức độ ưu tiên của quá trình đang được thực thi.

Trong lập lịch ưu tiên không có trước, bộ lập lịch sẽ xếp hàng quy trình mới ở đầu hàng đợi sẵn sàng.

Bất lợi khi sử dụng thuật toán lập lịch ưu tiên là ngăn chặn hoặc bỏ đói vô thời hạn. Sẽ có một quy trình có mức độ ưu tiên thấp, những người có thể phải chờ đợi tài nguyên vô thời hạn vì quy trình có mức độ ưu tiên cao sẽ dẫn đến vấn đề chết đói.

Ví dụ

Giả sử có 4 quy trình P1, P2, P3 và P4 với thời gian liên tục và mức độ ưu tiên tương ứng của chúng được liên kết với mỗi quy trình trong đó 0 đại diện cho mức độ ưu tiên thấp nhất và 10 đại diện cho mức độ ưu tiên cao nhất.

Quy trình Thời gian hoạt động Mức độ ưu tiên
P1 15 2
P2 13 0
P3 10 4
P4 11 1

Trình tự thực hiện nhiều quy trình sẽ được biểu diễn bằng biểu đồ gantt được cung cấp bên dưới

Chương trình C ++ để lập lịch ưu tiên

Thuật toán

Start
Step 1-> Make a structure Process with variables pid, bt, priority
Step 2-> In function bool compare(Process a, Process b)
   Return (a.priority > b.priority)
Step 3-> In function waitingtime(Process pro[], int n, int wt[])
   Set wt[0] = 0
   Loop For i = 1 and i < n and i++
      Set wt[i] = pro[i-1].bt + wt[i-1]
   End
Step 4-> In function turnarround( Process pro[], int n, int wt[], int tat[])
   Loop For i = 0 and i < n and i++
      Set tat[i] = pro[i].bt + wt[i]
   End Loop
Step 5-> In function avgtime(Process pro[], int n)
   Declare and initialize wt[n], tat[n], total_wt = 0, total_tat = 0
   Call function waitingtime(pro, n, wt)
   Call function turnarround(pro, n, wt, tat)
   Print “Processes, Burst time, Waiting time, Turn around time"
   Loop For i=0 and i<n and i++
      Set total_wt = total_wt + wt[i]
      total_tat = total_tat + tat[i]
   End Loop
   Print values of “Processes, Burst time, Waiting time, Turn around time"
   Print Average waiting time, Average turn around time
Step 6-> In function scheduling(Process pro[], int n)
   Call function sort(pro, pro + n, compare)
   Loop For i = 0 and i < n and i++
      Print the order.
   End Loop
   Call function avgtime(pro, n)
Step 7-> In function int main()
   Declare and initialize Process pro[] = {{1, 10, 2}, {2, 5, 0}, {3, 8, 1}}
   Declare and initialize n = sizeof pro / sizeof pro[0]
   Call function scheduling(pro, n)
Stop

Ví dụ

#include<bits/stdc++.h>
using namespace std;
struct Process {
   int pid; // Process ID
   int bt; // CPU Burst time required
   int priority; // Priority of this process
};
// sorting the Process acc. to the priority
bool compare(Process a, Process b) {
   return (a.priority > b.priority);
}
void waitingtime(Process pro[], int n, int wt[]) {
   // Initial waiting time for a process is 0
   wt[0] = 0;
   // calculating waiting time
   for (int i = 1; i < n ; i++ )
      wt[i] = pro[i-1].bt + wt[i-1] ;
}
 // Function to calculate turn around time
void turnarround( Process pro[], int n, int wt[], int tat[]) {
   // calculating turnaround time by adding
   // bt[i] + wt[i]
   for (int i = 0; i < n ; i++)
      tat[i] = pro[i].bt + wt[i];
}
//Function to calculate average time
void avgtime(Process pro[], int n) {
   int wt[n], tat[n], total_wt = 0, total_tat = 0;
   //Function to find waiting time of all processes
   waitingtime(pro, n, wt);
   //Function to find turn around time for all processes
   turnarround(pro, n, wt, tat);
   //Display processes along with all details
   cout << "\nProcesses "<< " Burst time " << " Waiting time " << " Turn around 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];
      cout << " " << pro[i].pid << "\t\t" << pro[i].bt << "\t " << wt[i] << "\t\t " << tat[i] <<endl;
   }
   cout << "\nAverage waiting time = " << (float)total_wt / (float)n;
   cout << "\nAverage turn around time = " << (float)total_tat / (float)n;
}
void scheduling(Process pro[], int n) {
   // Sort processes by priority
   sort(pro, pro + n, compare);
   cout<< "Order in which processes gets executed \n";
   for (int i = 0 ; i < n; i++)
      cout << pro[i].pid <<" " ;
   avgtime(pro, n);
}
// main function
int main() {
   Process pro[] = {{1, 10, 2}, {2, 5, 0}, {3, 8, 1}};
   int n = sizeof pro / sizeof pro[0];
   scheduling(pro, n);
   return 0;
}

Đầu ra

Order in which processes gets executed
1 3 2
Processes  Burst time  Waiting time  Turn around time
 1              10         0              10
 3              8          10             18
 2              5          18             23
 
Average waiting time = 9.33333
Average turn around time = 17