Shorest Job First
Analysis
- Very similar to round robin scheduling (easier)
- Keep a priority queue to store processes so that they can be extracted according to priority
- Need to overide priority
- 输入:int[] req: request time; int[] dur: duration time
- 输出:average wait time
Pseudo code
Create a new priority queue(Define compare function)
curTime, waitTime, index all set to 0
while (queue里面还有process,或者index没有reach最后一个process){
如果queue里面还有process{
cur = queue.poll()
waitTime累计
curTime更新到加上cur.dur
把该过程中arrive的新process加入queue
index更新
}
如果(queue里面没有process){
1. 把index process放入queue
2. curTime设为index arrival time
3. index++ (因为index指向下一个还没有处理的process)
}
return waitTime/length
}
Code
class process {
int reqTime;
int durTime;
process(int req, int dur) {
reqTime = req;
durTime = dur;
}
}
public class ShortestJobFirst{
public floate Solution(int[] req, int[] dur){
if (req.length==0 || dur.length==0 || req.length!=dur.length) {return 0;}
int curTime = 0, waitTime = 0, index = 0, len = req.length;
PriorityQueue<process> queue = new priorityQueue<process>(new Comparator<process>(){
@Override
public int compare(process p1, process p2){
if(p1.durTime==p2.durTime) {return p1.reqTime-p2.reqTime;}
return p1.durTime-p2.durTime;
}
});
while(!queue.isEmpty() || index<len){
if(!queue.isEmpty()){
process cur = queue.poll();
waitTime += curTime - cur.reqTime;
curTime +=cur.durTime;
for(;index < length && req[index]<=curTime;index++){
queue.offer(new process(req[index],dur[index]));
}
}
else{
queue.offer(new process(req[index],dur[index]));
curTime = req[index++];
}
}
return (float)waitTime/length;
}
}
Reference
Youtube