优先级在循环调度中起什么作用?

What part does priority play in round robin scheduling?

我正在尝试解决操作系统 class 的以下作业问题:


以下进程正在使用抢占式循环调度算法进行调度。每个进程都分配了一个数字优先级,数字越大表示相对优先级越高。

除了下面列出的进程外,系统还有一个空闲任务(不消耗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 |
+--+--------+----------+-------+---------+

一个。使用甘特图显示进程的调度顺序。
b.每个流程的周转时间是多少?
C。每个进程的等待时间是多少?
d. CPU 利用率是多少?


我的问题是 --- 当我们考虑使用循环算法时,优先级扮演什么角色?我一直在思考它,我想到的是,只有当优先级到达时它很重要才能决定它是否应该抢占另一个进程时才有意义。我得出这个结论的原因是,如果每次上下文切换时都检查它,那么具有最高优先级的进程将永远 运行 无限期地运行,而其他进程就会饿死。这违背了循环法确保没有进程执行超过一个时间片的想法以及进程执行后它进入队列末尾的想法。

使用这个逻辑我已经解决了这个问题:

你能否告诉我在这种情况下我是否在正确的角色优先级轨道上,以及我是否以正确的方式接近它?

我认为你走错了路。循环控制优先级内的 运行 顺序。就好像每个优先级都有自己的队列,以及相应的循环调度程序。当给定优先级的队列为空时,将考虑后续较低优先级的队列。最终,它将进入空闲状态。

如果您不以这种方式处理它,您将如何防止空闲最终被安排,尽管实际工作已准备就绪?

大多数高优先级进程是反应性的,即它们执行短暂的突发事件以响应事件,因此大部分不在 run/ready 队列中。

在代码中:

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);
        }
}