操作系统模拟实验—高优先权优先调度算法JS实现

高优先权优先调度算法

优先级调度的含义
  1. 当该算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行。
  2. 当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。
调度算法的两种方式

优先级调度算法细分成如下两种方式:

  • 非抢占式优先级算法
    在这种调度方式下,系统一旦把处理机分配给就绪队列中优先级最高的进程后,该进程就能一直执行下去,直至完成;或因等待某事件的发生使该进程不得不放弃处理机时,系统才能将处理机分配给另一个优先级高的就绪进程。

  • 抢占式优先级调度算法
    在这种调度方式下,进程调度程序把处理机分配给当时优先级最高的就绪进程,使之执行。一旦出现了另一个优先级更高的就绪进程时,进程调度程序就停止正在执行的进程,将处理机分配给新出现的优先级最高的就绪进程。

优先级的类型
  • 进程的优先级可采用静态优先级和动态优先级两种,优先级可由用户自定或由系统确定。

下面是高优先权优先调度算法实验界面:

操作系统模拟实验—高优先权优先调度算法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);
};