前序
《操作系统》课程最近布置了一个大作业,要求我们每人实现一个非抢占式多级反馈队列调度算法的模拟程序,作为期末考核的一部分。(u1s1,真的是爽到,老师开心,我们也写的开心!)
实现代码
//Powered By 7gugu
//每一级队列的可运行时间
let timeSlice = [1, 2, 3];
//准备运行的队列
let preRunQueue = [];
//3级运行队列
let runQueue = [
[],
[],
[]
];
//准备运行的程序[开始时间, 运行时间]
let progs = [
[0, 8],
[1, 4],
[5, 1],
[3, 7],
[4, 2]
];
for (let i = 0; i < progs.length; i++) {
let prog = {};
prog.id = "P" + i;
prog.startTime = progs[i][0];
prog.runTime = progs[i][1];
prog.priority = 0; //设置最高优先级
preRunQueue.push(prog); //把待运行的程序导入运行序列
}
//总运行时间
let totalTime = 0;
while (true) {
//如果待运行队列中仍然有程序 & 程序已到达开始时间
if (preRunQueue.length > 0) {
let prog = preRunQueue[0];
if (prog.startTime <= totalTime) {
preRunQueue.shift(); //直接弹出队头的元素
runQueue[0].push(prog); //把程序加入0级运行队列中
console.log(prog.id + "开始运行,开始时间为:" + totalTime);
}
}
for (let i = 0; i < runQueue.length; i++) {
//如果各级队列还有程序的话,就继续运行
if (runQueue[i].length > 0) {
let prog = runQueue[i].shift(); //获取各级队列中第一个程序
if (prog.runTime > timeSlice[i]) {
//程序运行时间比时间片大
totalTime = totalTime + timeSlice[i]; //总运行时间累加
prog.runTime = prog.runTime - timeSlice[i]; //减去每一次运行的时间
if (i != runQueue.length - 1) {
//如果未处于最低优先级,则把程序放在下一个优先级队列中
runQueue[i + 1].push(prog);
} else {
//如果处于最低优先级,则把程序放回最低优先级中运行
runQueue[i].push(prog);
}
} else {
//程序运行时间比时间片小
totalTime = totalTime + prog.runTime;
console.log(prog.id + "运行完成,目前时间为:" + totalTime);
}
break;
}
}
}
运行结果

仓库地址
参考资料
计算机操作系统(第四版) 西安电子科技出版社