进程调度

基本概念

抢占式与非抢占式

选择调度算法的原则

  • 资源利用率
  • 吞吐率:单位时间内 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 年发明。

多级反馈队列算法通常满足如下设计需求:

  1. 偏好短作业
  2. 偏好 I/O 消耗型(I/O bound)进程
  3. 根据进程对处理器的需要将其分为若干类
具体算法

使用多个 FIFO 队列,分为不同的等级,等级越高,所分配的时间片越少。

  1. 新进程被插入到顶级队列的尾部
  2. 在某个时刻,这个进程到达队列的头部并被分配给 CPU
  3. 如果进程在相应队列的时间片中完成,则离开系统
  4. 如果进程自愿交出 CPU 的控制权,则这个进程离开队列网络(queuing network),并且当进程再次就绪时,它会被插入到之前放弃 CPU 控制权时所处队列的尾部
  5. 如果进程用完了时间片,则被抢占,并插入到下一级队列的末尾
  6. 继续上述步骤直至进程完成或到达最低级的队列
  • 最低级的队列采用时间片轮转调度算法或先来先服务调度算法
  • 可选地,如果进程由于进行 I/O 而阻塞,它会被提升一级,插入到高一级的队列的末尾。这种方法使调度器更偏好 i/O 消耗型进程并且使进程可以“逃离”最低级的队列

如果高级别的队列为空,则从低一级的队列开始调度。同时,如果进程进入较高级别的队列,则它可以抢占较低级别队列中的进程。

调度参数

多级反馈队列调度器由如下的参数确定:

  • 队列的数量
  • 每个队列的调度算法(不局限于先来先服务)
  • 确定何时将进程提升到高一级队列的方法
  • 确定何时将进程降低到第一级队列的方法
  • 确定进程进入哪一个队列的方法

引用

更多资料

  • (美)Robert Love,《Linux 内核设计与实现》