我正在尝试为操作系统类解决以下家庭作业问题:
正在使用抢占式循环调度算法来调度以下进程。每个进程都分配有一个数字优先级,数字越大表示相对优先级越高。
除了下面列出的进程外,系统还具有一个空闲任务(该任务不占用CPU资源,并且被标识为P idle )。该任务的优先级为0,并且在系统没有其他可用进程要运行时进行调度。
时间量子的长度为10个单位。
如果某个进程被更高优先级的进程抢占,则该抢占进程将放置在队列的末尾。
+--+--------+----------+-------+---------+
| | Thread | Priority | Burst | Arrival |
+--+--------+----------+-------+---------+
| | P1 | 40 | 15 | 0 |
| | P2 | 30 | 25 | 25 |
| | P3 | 30 | 20 | 30 |
| | P4 | 35 | 15 | 50 |
| | P5 | 5 | 15 | 100 |
| | P6 | 10 | 10 | 105 |
+--+--------+----------+-------+---------+
a。使用甘特图显示流程的调度顺序。
b。每个流程的周转时间是多少?
C。每个过程的等待时间是多少?
d。 CPU利用率是多少?
我的问题是---当我们考虑使用轮询算法时,优先级起什么作用?我一直在想很多,我想的是,只有优先级在到达时才重要,才可以决定是否应该抢占其他进程才有意义。我之所以得出这样的结论,是因为如果每次都进行上下文切换时都进行了检查,则优先级最高的进程将始终无限期运行,而其他进程将饿死。这与循环确保每个进程的执行时间都不会超过一个时间段的想法背道而驰,而在一个进程执行之后,它就到达了队列的末尾。
使用这种逻辑,我解决了这样的问题:
在这种情况下,如果我对角色优先级的正确定位以及对方法的正确选择,请告诉我吗?
答案 0 :(得分:1)
我认为您走错了路。循环控制优先级内的运行顺序。好像每个优先级都有其自己的队列,以及相应的循环调度程序。当给定优先级的队列为空时,将考虑随后的较低优先级的队列。最终,它将空转。
如果您未采用这种方式进行处理,那么尽管实际工作已经准备就绪,您将如何防止最终安排空闲时间?
大多数高优先级进程是反应性的,也就是说,它们是响应事件而执行的短暂突发,因此大部分情况下不在运行/就绪队列中。
在代码中:
void Next() {
for (int i = PRIO_HI; i >= PRIO_LO; i--) {
Proc *p;
if ((p = prioq[i].head) != NULL) {
Resume(p);
/*NOTREACHED*/
}
}
panic(“Idle not on runq!”);
}
void Stop() {
unlink(prioq + curp->prio, curp);
Next();
}
void Start(Proc *p) {
p->countdown = p->reload;
append(prioq + p->prio, p);
Next();
}
void Tick() {
if (--(curp->countdown) == 0) {
unlink(prioq + curp->prio, curp);
Start(curp);
}
}