我正在尝试解决操作系统类的以下作业问题:
使用抢占式循环调度算法正在调度以下过程。为每个进程分配一个数字优先级,数字越大表示相对优先级越高。
除了下面列出的进程外,系统还有一个空闲任务(它不占用CPU资源并被识别为Pidle)。此任务的优先级为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 |
+--+--------+----------+-------+---------+
一个。使用甘特图显示流程的计划顺序。 湾每个流程的周转时间是多少? C。每个流程的等待时间是多少? d。什么是CPU利用率?
我的问题是---当我们考虑使用循环算法时,优先级会发挥什么作用?我一直在考虑的问题是,只有当它的到来时优先级很重要才能决定它是否应该抢占另一个进程才有意义。我之所以得出结论的原因是因为如果每次有上下文切换时检查它,那么具有最高优先级的进程将始终无限期地运行而其他进程将会饿死。这违反了循环法的思想,确保没有进程执行的时间长于一个时间量,并且在进程执行后进入队列末尾的想法。
使用这个逻辑我已经解决了这个问题:
如果我在这种情况下优先考虑角色并且我正在以正确的方式接近它,你能否告诉我?
我认为你走错了路。循环法控制优先级内的运行顺序。就好像每个优先级都有自己的队列和相应的循环调度程序。当给定优先级的队列为空时,将考虑后续的较低优先级队列。最终,它将无所事事。
如果您没有以这种方式处理它,尽管实际工作准备就绪,您如何防止最终被安排空闲?
大多数高优先级进程都是被动的,即它们响应事件而执行短脉冲串,因此大部分时间不在运行/就绪队列上。
在代码中:
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);
}
}