• 进程调度-多级反馈队列调度模拟


    js模拟实现进程多级反馈队列调度,UI框架需要网络加载,有本地使用需要请确认网络连接

      1 <!DOCTYPE html>
      2 <html lang="en">
      3 
      4 <head>
      5     <meta charset="UTF-8">
      6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
      7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
      8     <title>进程调度:多级反馈队列调度算法</title>
      9     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
     10         integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
     11     <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
     12     <style>
     13         * {
     14             margin: 0;
     15             padding: 0;
     16         }
     17 
     18         #app {}
     19 
     20         .addTaskBtn {
     21             border: 1px solid white;
     22             border-radius: 5px;
     23             float: right;
     24             margin-top: 20px;
     25         }
     26 
     27         .taskContainer {
     28             margin-top: 50px;
     29             background-color: white;
     30             height: 200px;
     31             margin-left: 50px;
     32             margin-right: 50px;
     33             border: 1px solid white;
     34             border-radius: 10px;
     35             overflow: scroll;
     36         }
     37 
     38         .middleContainer {
     39             margin: 50px auto;
     40             padding-top: 50px;
     41             background: gray;
     42             height: 600px;
     43             width: 800px;
     44             border: 5px solid white;
     45             border-radius: 50px;
     46             overflow: hidden;
     47         }
     48     </style>
     49     <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
     50     <script src="https://unpkg.com/element-ui/lib/index.js"></script>
     51 </head>
     52 
     53 <body>
     54     <div id="app">
     55         <div class="middleContainer">
     56             <div class="title">
     57                 <p style="text-align: center;">{{title}}</p>
     58             </div>
     59             <div class="addTaskContainer" style="padding: 10px 100px 10px;">
     60 
     61                 <div class="input-group">
     62                     <span class="input-group-addon">进程id</span>
     63                     <input type="number" class=" form-control" v-model="taskId">
     64                 </div>
     65                 <br>
     66                 <div class="input-group">
     67                     <span class="input-group-addon">进程优先级</span>
     68                     <select v-model="taskOp" class="form-control">
     69                         <option v-for="op in opNum" :key="op" :value="op-1">{{op-1}}</option>
     70                     </select>
     71                 </div>
     72                 <br>
     73                 <div class="input-group">
     74                     <span class="input-group-addon">进程所需时间片</span>
     75                     <input type="number" class="form-control" v-model="taskTime">
     76                 </div>
     77                 <input type="button" class="btn btn-default addTaskBtn" @click="addTask" value="添加">
     78             </div>
     79             <div class="taskContainer">
     80                 <ol v-infinite-scroll="load" style="overflow:auto" infinite-scroll-disabled="disabled">
     81                     <li v-for="(item, index) in taskDoing" :key="index" style="display: flex;">
     82                         <p style="margin: 10px;">process id: {{item.getId()}}</p>
     83                         <p style="margin: 10px;">process allTime:{{item.getAllTime()}}</p>
     84                         <p style="margin: 10px;">process progressTime:{{item.getProgressTime()}}</p>
     85                         <p style="margin: 10px;">process leftTime:{{item.getLeftTime()}}</p>
     86                     </li>
     87                 </ol>
     88             </div>
     89         </div>
     90     </div>
     91 
     92 
     93     <script>
     94 
     95         class Task {
     96             constructor(id, time) {
     97                 this.id = id;
     98                 this.allTime = time;
     99                 this.progressTime = 0;
    100                 this.leftTime = time;
    101                 this.isDone = false;
    102             }
    103             progress(time) {
    104                 this.progressTime += time;
    105                 this.progressTime = Math.min(this.allTime, this.progressTime);
    106                 this.leftTime = this.allTime - this.progressTime;
    107                 if (this.leftTime == 0)
    108                     this.isDone = true;
    109                 console.log("id:" + this.id + ", progressTime: " + this.progressTime + ", leftTime: " + this.leftTime);
    110             }
    111             getIsDone() {
    112                 return this.isDone;
    113             }
    114             getId() {
    115                 return this.id;
    116             }
    117             getProgressTime() {
    118                 return this.progressTime;
    119             }
    120             getAllTime() {
    121                 return this.allTime;
    122             }
    123             getLeftTime() {
    124                 return this.leftTime;
    125             }
    126         }
    127 
    128         class Queue {
    129             constructor(time) {
    130                 this.data = new Array();
    131                 this.time = time;
    132             }
    133             front() {
    134                 if (this.data.length == 0)
    135                     throw new Error("the queue is empty");
    136                 return this.data[0];
    137             }
    138             remove(idx) {
    139                 if (idx < 0 || idx > this.data.length)
    140                     throw new Error("index out of bound");
    141                 this.data.splice(idx, 1);
    142             }
    143             popFront() {
    144                 this.remove(0);
    145             }
    146 
    147             push(task) {
    148                 this.data.push(task);
    149             }
    150             isEmpty() {
    151                 return this.data.length == 0;
    152             }
    153             progress(next) {
    154                 let task = this.front();
    155                 task.progress(this.time);
    156                 this.popFront();
    157                 if (!task.getIsDone()) {
    158                     next.push(task);
    159                 }
    160                 return task;
    161             }
    162 
    163         }
    164 
    165         window.onload = () => {
    166             if (!window.navigator.onLine)
    167                 alert("此系统需联网,请检查网络连接");
    168         }
    169 
    170 
    171         let app = new Vue({
    172             el: "#app",
    173             data: {
    174                 opNum: 7,
    175                 timeSlice: [1, 2, 5, 10, 20, 50, 100],
    176                 taskId: Math.round(Math.random() * 100),
    177                 taskOp: 1,
    178                 taskTime: Math.round(Math.random() * 1000),
    179                 taskDoing: [],
    180                 taskDoingLength: 0,
    181                 que: [],
    182                 set: new Set(),
    183                 timeId: 0,
    184                 disabled: false,
    185                 title: "进程调度-多级反馈队列调度算法实现",
    186 
    187             },
    188             mounted() {
    189                 for (let i = 0; i < this.opNum; i++)
    190                     this.que.push(new Queue(this.timeSlice[i]));
    191             },
    192             methods: {
    193                 addTask() {
    194                     if (this.set.has(this.taskId)) {
    195                         this.openWarning("请确保进程id唯一");
    196                         return;
    197                     }
    198                     this.que[this.taskOp].push(new Task(this.taskId, this.taskTime))
    199                     this.set.add(this.taskId);
    200                     this.openSuccess("添加成功");
    201                     this.run();
    202 
    203                 },
    204                 run() {
    205                     if (!this.timeId) {
    206                         this.timeId = setInterval(() => {
    207                             let flag = false;
    208                             for (let i = 0; i < this.opNum; i++)
    209                                 if (!this.que[i].isEmpty()) {
    210                                     let task = null;
    211                                     if (i == this.opNum - 1)
    212                                         task = this.que[i].progress(this.que[i]);
    213                                     else
    214                                         task = this.que[i].progress(this.que[i + 1]);
    215                                     let list = new Array();
    216                                     let f = false;
    217                                     this.taskDoing.forEach((x, i) => {
    218 
    219                                         if (x.getId() == task.getId()) {
    220                                             list.unshift(task);
    221                                             f = true;
    222                                         }
    223                                         else {
    224                                             list.push(x);
    225                                         }
    226                                     });
    227                                     if (!f)
    228                                         list.unshift(task);
    229                                     this.taskDoing = list;
    230                                     flag = true;
    231                                     break;
    232                                 }
    233                             if (!flag) {
    234                                 this.openSuccess("所有等待进程已经执行完毕")
    235                                 clearInterval(this.timeId);
    236                                 this.timeId = 0;
    237                             }
    238                         }, 1000);
    239                     }
    240                 },
    241                 openTips(str) {
    242                     this.$message(str);
    243                 },
    244                 openSuccess(str) {
    245                     this.$message({
    246                         message: str,
    247                         type: 'success'
    248                     });
    249                 },
    250 
    251                 openWarning(str) {
    252                     this.$message({
    253                         message: str,
    254                         type: 'warning'
    255                     });
    256                 },
    257 
    258                 openError(str) {
    259                     this.$message.error(str);
    260                 },
    261                 load() {
    262 
    263                 }
    264             },
    265             computed: {
    266             },
    267         });
    268     </script>
    269 </body>
    270 
    271 </html>
    View Code
  • 相关阅读:
    Android 之 Intent(意图)
    初识 Android
    SSM + VUE 实现简单的 CRUD
    VueUI -- iView4.0简单使用
    axios解决跨域问题(vue-cli3.0)
    Mybatis 逆向工程
    获取input type=file 的文件内容(纯文本)
    vue常见问题处理 -- 页面刷新时,如何保持原有vuex中的state信息
    mysql安装、使用 -- windows
    vue关于mock的简单使用
  • 原文地址:https://www.cnblogs.com/mooleetzi/p/12129409.html
Copyright © 2020-2023  润新知