我似乎找不到一个在线多级反馈队列的好例子,显示会发生什么。鉴于以下问题,我不一定需要回答整个问题,如何进行一些迭代:
使用所描述的调度算法进行铅笔纸调度,并记下来 每个上下文切换时下一个要运行的进程的名称。假设进程休眠或退出 在它们被安排运行之后,(即如果一个过程在0.1秒之后退出,它将被安排 两次),并且在上下文切换发生之前唤醒进程。假设负载 系统是0.5。将计算的每一步舍入为2位小数。
调度程序分配处理优先级,范围在0到127之间,0表示最高。 内核进程的优先级可以在0-49之间,用户进程可以使用优先级50-127。 准备执行的进程驻留在32个运行队列之一中,每个队列都有一个运行队列 包含4个相邻优先级的进程(prio / 4 =运行队列)。运行队列中的进程不是 进一步订购。
在每个上下文切换时,选择最高优先级队列头部的进程来执行。 在每个量子(0.1s)之后,当前运行的过程被上下文切换出来。调度程序 从原始队列的头部移除进程,调整其优先级(如果需要 - 见下文), 并将其放在它所属的队列的末尾(因为它的优先级可能刚刚改变)。 然后重新扫描运行队列,以获得包含可运行进程的最高优先级队列。
创建进程时,它以基本优先级开始 (对于用户进程,我们称之为PUSER将其设置为50)并且估计cpu利用率(estcpu)为0.0。 每次进程执行一个量程时,其estcpu增加1.进程后 已执行4个量子,其优先级根据以下公式重新计算: Prio = PUSER +(estcpu / 4)+ 2 * p_nice(注意:Prio不会低于PUSER) 其中p_nice是创建进程时指定的值。它的范围从-20到19, 但对于用户进程,将忽略指定负值并默认为0.
编辑::这是我对这个问题的回答,有人会关心这个吗?
答案 0 :(得分:1)
要做的第一件事是设置起始状态并定义参考条款。 P(X) t 将是量子t
处的过程X的优先级; E(X) t 将是量子t
处的过程X的估计CPU使用量; T(X) t 将是在下一次状态改变之前剩余的量子数。 S(X) t 将是进程的状态 - R = runnable,S = sleep,D = dead。过程X具有良好的N(X)。有多个队列,Q n 是优先级 n ... n + 3 的队列。我们正在处理用户进程,因此每个进程X的优先级为P(X) t = PUSER + E(X) t / 4 + 2 * N(X),初始估计的CPU由E(X) 0 = 0给出。
N(A)= 2; N(B)= 1; N(C)= 3; N(D)= 1。
最初,P(A) 0 = 54(50 + 0 + 2 * 2); P(B) 0 = 52,P(C) 0 = 56; P(D) 0 = 52.因此,A,B和D在Q 13 上,C在Q 14 上。为了反对,D位于Q 13 的前面,然后是B,然后是A.
对于下一个量子,调度程序选择Q 13 前面的过程,即D. D为量子运行(并且最后有4个量子运行,并且E (D) 1 = 1)。它位于Q 13 的背面,下一个过程B运行一个量子(所以E(B) 2 = 1,它有2个量子在它贪睡之前离开。它放在Q 13 的背面,A运行下一个量子,依此类推。
你需要设计一支铅笔和纸笔'记录发生了什么的记法。
---- A ---- ---- B ---- ---- C ---- ---- D ----
t R P E S T P E S T P E S T P E S T Q13 Q14
0 D 54 0 R 1 52 0 R 3 56 0 R 10 52 0 R 5 D,B,A C
1 B 54 0 R 1 52 0 R 3 56 0 R 10 53 1 R 4 B,A,D C
2 A 54 0 R 1 53 1 R 2 56 0 R 10 53 1 R 4 A,D,B C
3 D 55 1 S 6 53 1 R 2 56 0 R 10 53 1 R 4 D,B,A C
4 B 55 1 S 5 53 1 R 2 56 0 R 10 54 2 R 4 B,A,D C
所以这个过程继续进行。最终,进程将为多个量子进入休眠状态(请注意,睡眠过程的剩余时间在每个量程上减少,而不是在可能已经被调度的时候),或者将会死亡(从不再次运行),等等。您需要小心地理解这条线在量子开始时记录状态。