前序
《操作系统》课程最近布置了一个大作业,要求我们每人实现一个非抢占式多级反馈队列调度算法的模拟程序,作为期末考核的一部分。(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; } } }
运行结果

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