ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2020-01-01 18:01:09  阅读:254  来源: 互联网

标签:progressTime task return 队列 多级 调度 time new id


 

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

标签:progressTime,task,return,队列,多级,调度,time,new,id
来源: https://www.cnblogs.com/mooleetzi/p/12129409.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有