进程调度
基本概念
抢占式与非抢占式
选择调度算法的原则
- 资源利用率
- 吞吐率:单位时间内 CPU 处理作业的个数
- 公平性
- 响应时间
- 作业周转时间与作业带权周转时间
\[作业周转时间 = 作业处理时间 + 作业等待时间 \]
\[作业带权周转时间 = \dfrac{作业周转时间}{作业处理时间} \]
进程调度算法
先来先服务(First Come First Served,FCFS)调度算法
按照作业进入系统后备作业队列的先后次序来挑选作业,非抢占式
最短作业优先(Shortest Job First,SJF)调度算法
总是选取预计计算时间最短的作业投入运行,非抢占式
严格来讲应称作最短下一个 CPU 突发期优先:
\[\tau_{n + 1} = \alpha t_n + (1 - \alpha)\tau_n \]
其中,\(t_n\) 是进程 / 线程最近一个 CPU 突发期长度,是最近信息;\(\tau_n\) 是估算的第 n 个 CPU 突发期长度,是历史信息;参数 \(\alpha\)
\[\tau_{n + 1} = \alpha t_n + (1 - \alpha)\alpha t_{n - 1} + ... + (1 - \alpha)^j\alpha t_{n - j} + ... + (1 - \alpha)^{n + 1}\tau_0 \]
由于 \(\alpha\) 和 \(1 - \alpha\)
最短剩余时间优先(Shortest Remaining Time First,SRTF)调度算法
抢占式
最高响应比优先(Highest Response Ratio First,HRRF)调度算法
\[响应比 = \dfrac{作业周转时间}{作业处理时间} = \dfrac{作业处理时间 + 作业等待时间}{作业处理时间} = 1 + \dfrac{作业等待时间}{作业处理时间} \]
短作业容易得到较高的响应比
优先级调度算法
可为抢占式或非抢占式。
静态优先级和动态优先级
静态优先级:在进程 / 线程创建时确定,且在其生命周期中不再改变,但容易产生饥饿现象
动态优先级:进程 / 线程优先级随时间改变
时间片轮转(Round-Robin,RR)调度算法
时间片长度的确定:综合考虑进程数目、切换开销、系统效率和响应时间等多方面因素
多级反馈队列(Multilevel Feedback Queue,MFQ)调度算法
多级反馈队列算法由 Fernando J. Corbató 于 1962 年发明。
多级反馈队列算法通常满足如下设计需求:
- 偏好短作业
- 偏好 I/O 消耗型(I/O bound)进程
- 根据进程对处理器的需要将其分为若干类
具体算法
使用多个 FIFO 队列,分为不同的等级,等级越高,所分配的时间片越少。
- 新进程被插入到顶级队列的尾部
- 在某个时刻,这个进程到达队列的头部并被分配给 CPU
- 如果进程在相应队列的时间片中完成,则离开系统
- 如果进程自愿交出 CPU 的控制权,则这个进程离开队列网络(queuing network),并且当进程再次就绪时,它会被插入到之前放弃 CPU 控制权时所处队列的尾部
- 如果进程用完了时间片,则被抢占,并插入到下一级队列的末尾
- 继续上述步骤直至进程完成或到达最低级的队列
- 最低级的队列采用时间片轮转调度算法或先来先服务调度算法
- 可选地,如果进程由于进行 I/O 而阻塞,它会被提升一级,插入到高一级的队列的末尾。这种方法使调度器更偏好 i/O 消耗型进程并且使进程可以“逃离”最低级的队列
如果高级别的队列为空,则从低一级的队列开始调度。同时,如果进程进入较高级别的队列,则它可以抢占较低级别队列中的进程。
调度参数
多级反馈队列调度器由如下的参数确定:
- 队列的数量
- 每个队列的调度算法(不局限于先来先服务)
- 确定何时将进程提升到高一级队列的方法
- 确定何时将进程降低到第一级队列的方法
- 确定进程进入哪一个队列的方法
引用
- 费翔林、骆斌,《操作系统教程》(第五版)
- Wikipedia,Multilevel feedback queue
更多资料
- (美)Robert Love,《Linux 内核设计与实现》