我似乎无法在网上找到一个多级反馈队列的好例子来展示会发生什么。鉴于以下问题,我不一定需要回答整个问题,只需要如何进行几次迭代:
- 进程A:p nice = 2,运行0.1s,休眠0.6s,运行0.2s
- 进程B:p nice = 1,运行0.3s,休眠1.0s,运行0.3s
- 进程C:p nice = 3,运行1.0s
- 进程D:p nice = 1,运行0.5s
使用所描述的调度算法进行纸笔调度,并记下每次上下文切换时下一个要运行的进程的名称。假设进程在调度运行后立即休眠或退出(即如果进程在 0.1 秒后退出,它将被调度两次),并且进程在上下文切换发生之前唤醒。假设系统的负载为 0.5。将计算的每一步四舍五入到小数点后 2 位。
调度程序分配范围在 0 到 127 之间的进程优先级,其中 0 是最高的。内核进程的优先级可以在 0-49 之间,用户进程可以使用 50-127 的优先级。准备好执行的进程驻留在 32 个运行队列之一中,每个运行队列包含 4 个相邻优先级的进程(prio/4 = 运行队列)。运行队列中的进程没有进一步排序。
在每次上下文切换时,都会选择最高优先级队列头部的进程来执行。在每个时间片 (0.1s) 之后,当前运行的进程被上下文切换。调度程序从其原始队列的头部删除进程,调整其优先级(如果需要 - 见下文),并将其放置在它所属的队列的末尾(因为它的优先级可能刚刚改变)。然后重新扫描运行队列以查找包含可运行进程的最高优先级队列。
创建进程时,它以基本优先级(对于用户进程,我们称之为 PUSER 将其设置为 50)和估计的 cpu 利用率 (estcpu) 为 0.0 开始。进程每执行一个quanta,它的estcpu就加1。一个进程执行4个quanta后,它的优先级按照以下公式重新计算:Prio = PUSER + (estcpu/4) + 2* p_nice(注: Prio 不会小于 PUSER) 其中 p_nice 是在创建进程时指定的值。它的范围可以从 -20 到 19,但对于用户进程,指定负值将被忽略并默认为 0。
编辑:: 这是我对这个问题的回答,有人愿意看一下吗?
或链接:http: //imgur.com/jJVD3AC