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
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