Round Robin
Analysis
- 输入:arrival time array, execution time array, quantum time
- 输出:每个process的平均等待时间
- Keep a queue to store processes (a process is characterized by its arrival time and execution time)
- curTime: 记录当前时间
- waitTime: 累计所有等待时间
- cur: 当前进行的process
- index:指向下一个还没有处理到的process
Pseudo Code
create a new queue
curTime, waitTime, index set to 0
while(queue里面还有process,或者还有process没有处理过) {
如果(queue里面还有process){
1. poll queue得到当前process cur
2. 更新wait time(开始处理的时间-到达时间就是waitTime)
3. 更新curTime到下一个节点。下一节点或者过了q时间,或者当前process run完。通过比较q和cur.exetime取小的那个。
4. 把这个过程中有可能arrive的新的process加入(判断条件,arrive time小于新的时间点并且index在范围内,同时更新index)
5. 如果cur还没有run完,更新剩下的时间加入到queue末尾
}
//出现以下情况有两种可能:
//1. 初始情况
//2. 之前的process都已经run完,新的process的arrival time还没有到。所以只需要更新arrival time,不需要更新waitTime。
如果(queue里面没有process){
1. 把index process放入queue
2. curTime设为index arrival time
3. index++ (因为index指向下一个还没有处理的process)
}
return waitTime/length
}
Code
package amazon;
import java.util.LinkedList;
import java.util.Queue;
class process {
int arrTime;
int exeTime;
process(int arr, int exe) {
arrTime = arr;
exeTime = exe;
}
}
public class RoundRobinScheduling {
public float Solution(int[] Atime, int[] Etime, int q) {
if (Atime == null || Etime == null || Atime.length != Etime.length) return 0;
int length = Atime.length;
Queue<process> queue = new LinkedList<process>();
int curTime = 0, waitTime = 0;
int index = 0;
while (!queue.isEmpty() || index < length) {
if (!queue.isEmpty()) {
process cur = queue.poll();
waitTime += curTime - cur.arrTime;
curTime += Math.min(cur.exeTime, q);
for (; index < length && Atime[index] <= curTime; index++)
queue.offer(new process(Atime[index], Etime[index]));
if (cur.exeTime > q)
queue.offer(new process(curTime, cur.exeTime - q));
}
else {
queue.offer(new process(Atime[index], Etime[index]));
curTime = Atime[index++];
}
}
return (float) waitTime / length;
}
}
Refenrence