操作系统模拟实验—高优先权优先调度算法JS实现
高优先权优先调度算法
优先级调度的含义
- 当该算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行。
- 当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。
调度算法的两种方式
优先级调度算法细分成如下两种方式:
-
非抢占式优先级算法
在这种调度方式下,系统一旦把处理机分配给就绪队列中优先级最高的进程后,该进程就能一直执行下去,直至完成;或因等待某事件的发生使该进程不得不放弃处理机时,系统才能将处理机分配给另一个优先级高的就绪进程。 -
抢占式优先级调度算法
在这种调度方式下,进程调度程序把处理机分配给当时优先级最高的就绪进程,使之执行。一旦出现了另一个优先级更高的就绪进程时,进程调度程序就停止正在执行的进程,将处理机分配给新出现的优先级最高的就绪进程。
优先级的类型
- 进程的优先级可采用静态优先级和动态优先级两种,优先级可由用户自定或由系统确定。
下面是高优先权优先调度算法实验界面:
代码:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>动态高优先权优先调度算法</title>
<script type="text/javascript" src="js/Pg.js"></script>
<style type="text/css">
progress{
width: 800px;
height: 60px;
}
#ps{
text-align: center;
margin-top: 60px;
}
</style>
</head>
<body>
<h1 style="background-color: aqua; text-align: center">动态高优先权优先调度算法</h1>
<div id="ps"></div>
</body>
<script>
// 开始时间
var start = new Date().getTime();
//作业列表
var objList = [new PgObj('A',1,6,1), new PgObj('B',4,5,2),new PgObj('C',2,3,3), new PgObj('D',8,2,4)]
// 到达作业列表
var ARRIVED_JOB = [];
// 运行及运行过的作业列表
var runList = [];
// 保证一个作业运行时其他作业不可运行
var flag = 1;
// 定时器监控到达的作业放入到达作业列表
setInterval(function () {
var delta = (new Date().getTime() - start)/1000;
// 由于遍历的同时删除作业会导致无法遍历完整 采用倒序遍历
for(var i=objList.length-1; i>=0; i--){
if (objList[i].arrivedtime < delta){
ARRIVED_JOB.push(objList[i]);
objList.splice(i, 1);
}
}
},100);
// 排序 对到达作业有运行时间 按短作业优先的方式排序
function sortruntime() {
ARRIVED_JOB.sort(function sortNumber(obj1,obj2) {
return obj1.runtime - obj2.runtime;
});
}
// 从运行列表把刚添加进来的作业运行
function SchedulerJob() {
runList[runList.length-1].createPro();
}
// 主函数控制整个运行
setInterval(function () {
sortruntime();
if (ARRIVED_JOB.length != 0 && flag==1){
flag = 0;
runList.push(ARRIVED_JOB[0]);
SchedulerJob();
ARRIVED_JOB.splice(0,1);
}
},10);
</script>
</html>
Pg.js
var PgObj = function (name, arrivedtime, runtime, priority) {
this.name = name;
this.arrivedtime = arrivedtime;
this.runtime = runtime;
this.priority = priority;
};
PgObj.prototype.createPro = function () {
var element=document.getElementById("ps");
var newdiv = document.createElement("div");
var newPg = document.createElement("progress");
var newHN = document.createElement("h3");
newPg.max = 100;
newPg.value = 0;
newPg.id = this.name;
newHN.innerText = "作业" + this.name + "在第" + this.arrivedtime + "S到达" +
"运行时间" + this.runtime + "S " + "优先级为" + this.priority + ".";
newdiv.appendChild(newHN);
newdiv.appendChild(newPg);
element.appendChild(newdiv);
var pg = document.getElementById(this.name);
var f = 0;
setInterval(function () {
if (pg.value!=100) pg.value++;
else {
pg.value=100;
if(f == 0){
f = 1;
flag = 1;
}
}
}, this.runtime*10);
};