高优先权优先调度算法
优先级调度的含义
- 当该算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行。
- 当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。
调度算法的两种方式
优先级调度算法细分成如下两种方式:
-
非抢占式优先级算法
在这种调度方式下,系统一旦把处理机分配给就绪队列中优先级最高的进程后,该进程就能一直执行下去,直至完成;或因等待某事件的发生使该进程不得不放弃处理机时,系统才能将处理机分配给另一个优先级高的就绪进程。 -
抢占式优先级调度算法
在这种调度方式下,进程调度程序把处理机分配给当时优先级最高的就绪进程,使之执行。一旦出现了另一个优先级更高的就绪进程时,进程调度程序就停止正在执行的进程,将处理机分配给新出现的优先级最高的就绪进程。
优先级的类型
- 进程的优先级可采用静态优先级和动态优先级两种,优先级可由用户自定或由系统确定。
下面是高优先权优先调度算法实验界面:
代码:
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); };