เราได้รับกับกระบวนการ n ที่มีเวลาระเบิดและควอนตัมเวลาที่สอดคล้องกัน และภารกิจคือการค้นหาเวลารอโดยเฉลี่ยและเวลาตอบสนองโดยเฉลี่ยและแสดงผล
การจัดกำหนดการ Round Robin คืออะไร
Round robin เป็นอัลกอริธึมการตั้งเวลา CPU ที่ออกแบบมาโดยเฉพาะสำหรับระบบการแบ่งปันเวลา มันเหมือนกับอัลกอริธึมการตั้งเวลา FCFS ที่มีการเปลี่ยนแปลงหนึ่งครั้งซึ่งในกระบวนการ Round Robin นั้นถูกจำกัดด้วยขนาดเวลาควอนตัม หน่วยเวลาเล็ก ๆ เรียกว่า Time Quantum หรือ Time Slice ควอนตัมเวลาสามารถอยู่ในช่วงตั้งแต่ 10 ถึง 100 มิลลิวินาที CPU ปฏิบัติต่อคิวที่พร้อมเป็นคิวแบบวงกลมสำหรับดำเนินการกระบวนการด้วยการแบ่งเวลาที่กำหนด เป็นไปตามแนวทางยึดเอาเสียก่อนเนื่องจากมีการจัดสรรเวลาคงที่ให้กับกระบวนการ ข้อเสียเพียงอย่างเดียวของมันคือค่าใช้จ่ายในการเปลี่ยนบริบท
เราต้องคำนวณอะไร
เวลาเสร็จสิ้น เป็นเวลาที่กระบวนการต้องใช้เพื่อให้การดำเนินการเสร็จสิ้น
เวลาตอบสนอง คือช่วงเวลาระหว่างการส่งกระบวนการและเสร็จสิ้น
เวลาดำเนินการ =เสร็จสิ้นกระบวนการ – การส่งกระบวนการ
เวลารอคือความแตกต่างระหว่างเวลาตอบสนองกับเวลาที่ระเบิด
เวลารอ =เวลาตอบสนอง – เวลาที่ระเบิด
ตัวอย่าง
เราได้รับ 3 กระบวนการ P1, P2 และ P3 โดยมีเวลาระเบิดที่สอดคล้องกันเป็น 24, 3 และ 3
| กระบวนการ | เวลาระเบิด |
|---|---|
| P1 | 24 |
| P2 | 3 |
| P3 | 3 |
เนื่องจากเวลาควอนตัมคือ 4 มิลลิวินาที กระบวนการ P1 จะได้รับ 4 มิลลิวินาทีแรก แต่ต้องใช้เวลาอีก 20 มิลลิวินาทีในการดำเนินการให้เสร็จสิ้น แต่ CPU จะยึดไว้ก่อนหลังจากควอนตัมครั้งแรก และ CPU จะถูกจัดสรรให้กับกระบวนการ P2 ถัดไป ตามที่แสดงในตาราง กระบวนการ P2 ใช้เวลาเพียง 3 มิลลิวินาทีในการดำเนินการให้เสร็จสิ้น ดังนั้น CPU จะถูกจัดสรรสำหรับควอนตัมเวลา 3 มิลลิวินาทีเท่านั้นแทนที่จะเป็น 4 มิลลิวินาที

ใช้แผนภูมิแกนต์ เวลารอเฉลี่ยคำนวณตามที่ระบุด้านล่าง -
เวลารอเฉลี่ย =17/3 =5.66 มิลลิวินาที
อัลกอริทึม
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) ตัวอย่าง
#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;
} ผลลัพธ์
