📅  最后修改于: 2023-12-03 15:39:54.188000             🧑  作者: Mango
这是一道UGC NET CS 2015年12月-II的问题,涉及到操作系统中的CPU和调度算法。 在操作系统中,CPU调度算法是一种将CPU分配给进程的方法。针对这个问题,我们需要了解一些不同的调度算法类型。 以下是我所了解的不同类型的CPU调度算法:
这是一种非常简单的算法,其中进程按照其到达时间的顺序排队,执行完的进程将被移除队列。
这是一种基于进程执行时间的调度算法。在这种算法中,执行时间最短的进程首先获得CPU时间。
这种算法基于进程优先级(在Unix系统中,可以分配1-127之间的优先级)进行调度。具有最高优先级的进程首先获得CPU时间。
该算法按照固定的时间量(称为时间片)将CPU时间分配给进程。当时间片耗尽时,进程将被移出队列,并将其状态更改为就绪状态。
根据题目要求,我们需要确定列出的调度算法之一可以提高进程的平均周转时间。通过比较上述算法,我们可以得出以下结果:
在保证公平的情况下,时间片轮转调度算法可以最大化利用CPU,并降低进程的平均周转时间。因此,我们可以选择这种算法来提高进程的平均周转时间。
实现时间片轮转调度算法的简单示例代码:
function roundRobin(processes, quantum) {
let time = 0;
let processesCopy = processes.slice(0);
let queue = [];
let match = false;
let nowReading = null;
let waitingTime = 0;
while(processesCopy.length || queue.length) {
//把已经到达的被从等待队列中提出,并放入队列
if (processesCopy.length !== 0 && processesCopy[0].arrivalTime <= time) {
queue.push(processesCopy.shift());
continue;
}
if(nowReading === null) { //没有进程被执行
nowReading = queue[0]; //从队列中取出当前执行进程
queue.shift();
nowReading.start = time;
}
nowReading.execTime--; //因为时间片轮转算法分为固定的时间片,所以每执行一次减少1
time++; //时间+1
//当前进程执行完毕,从执行队列中取出下一个
if(nowReading.execTime === 0){
waitingTime += time - nowReading.start - nowReading.runTime;
nowReading = null;
continue;
}
//改进程需要等待
if(nowReading.execTime !== 0 && ((queue.length && !match) || (queue.length && nowReading.execTime <= quantum))) {
queue.push(nowReading);
nowReading = null;
match = true;
}
//队列中所有存在的进程都不需要执行,进程也没有被执行,则终止循环
if(!match){
time--;
}
match = false;
}
return waitingTime / processes.length;
}