鉴于此表:
这些是时间线(时间片 = 4):
|p1|p1|p2|p3|p4|p5|p1|p2|p3|p4|p5|p2|p3|p4|p5|p2|p3|p4|p5|p2|p3|p3|
0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 69 72 75 79 80
有没有简单的方法来计算平均等待时间?
谢谢
注意:每个过程有几个完成时间!
注2:本题还涉及优先级算法作为辅助练习,请忽略轮询算法的优先级列
鉴于此表:
这些是时间线(时间片 = 4):
|p1|p1|p2|p3|p4|p5|p1|p2|p3|p4|p5|p2|p3|p4|p5|p2|p3|p4|p5|p2|p3|p3|
0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 69 72 75 79 80
有没有简单的方法来计算平均等待时间?
谢谢
注意:每个过程有几个完成时间!
注2:本题还涉及优先级算法作为辅助练习,请忽略轮询算法的优先级列
You can calculate Waiting time by drawing Gantt chart
so waiting time of ith process is equal to Completion time - (Arrival time + Burst time )
.
对于RR,等待时间=上次开始时间-到达时间-(抢占*量子)
P1的最后开始时间是24(当P1在甘特图中第三次运行时)P1在其生命周期内抢占了2次Quantum = 4,Arrival = 0。
P1 的等待时间 = 24 - 0 - (2 * 4) = 16 :)
|H |I |J |K |L | H| J| K|L |J |K|L |J |L |L | 它太长了,简而言之,您的答案是:0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 平均等待时间 = ((H - 到达时间) + (I - 到达时间) + (J - 到达时间)+(K-到达时间)+(L-到达时间))/5=(24-0)+(8-5)+(52-8)+(44-11)+(60-15)/ 5= 29.8 m sec 太长了,简而言之,你的答案是这样的:这里是 RR 调度算法的甘特图 Process[burst time, timequantum,arrival time] H[8, 4, 0] I[4, 4, 5] J[16, 4, 8] k[12, 4, 11] L[20, 常数 = 4, 15]
让我们首先尝试解决这个问题的简单版本,其中所有进程都在时间 0 到达。假设我们有n
每个进程的执行时间为ei
。让时间片成为s
。设每个进程所需的时间片数为NSPi
。现在我们有了NSPi = ceiling(ei/s)
. 一个过程所需的时间 i = NSPi * s
. 时间表的长度 = sum over i from 1 to n (NSPi)
。进程 i = 的等待时间finish time of i - execution time of i
。但是计算每个进程的完成时间很复杂,因为每个进程都有不同的执行时间。但是由于您只需要特定实例的 RR 算法的平均等待时间,您可以将其计算为(Length of the schedule - sum of execution time of all processes)/num of processes
:
我想现在你应该已经知道这个公式是如何演变的了。理想情况下,希望调度的长度等于所有进程的执行时间的总和。但并非所有执行时间都是时间片的一个因素。因此,在某个时间片中,我们会发现没有安排任何进程的漏洞。所以在实践中,调度的长度大于执行时间的总和。现在我们将它们的差异作为总等待时间。
我尝试在java中实现它:
public static float waitingTimieRobin(int[] arrival, int[] run, int q) {
Queue<Integer> orderQueue = new LinkedList<>();
orderQueue.add(0);
Set<Integer> orderSet = new HashSet<>();
orderSet.add(0);
float sumTime = 0.0f;
int curTime = 0;
while (!isOver(run)) {
int order = orderQueue.poll();
orderSet.remove(order);
int arrTime = arrival[order];
int runtime = run[order];
sumTime += (curTime - arrTime);
if (runtime <= q) {
curTime += runtime;
run[order] = 0;
} else {
curTime += q;
arrival[order] = curTime;
run[order] = runtime - q;
}
for (int i = 0; i < run.length; i++) {
if (arrival[i] > curTime) {
break;
} else if (i != order && run[i] != 0 && !orderSet.contains(i)) {
orderQueue.add(i);
orderSet.add(i);
}
}
if(arrival[order] == curTime && run[order] != 0 && !orderSet.contains(order)) {
orderQueue.add(order);
orderSet.add(order);
}
}
return sumTime / arrival.length;
}
public static boolean isOver(int[] run) {
for (int runtime : run) {
if (runtime > 0) {
return false;
}
}
return true;
}
我的回答是等待时间和周转时间是
等待时间:(16+51+51+45+42)/5=41 周转时间:(28+70+72+58+57)/5=57