调度

152 阅读6分钟

处理机调度的基本概念

当计算机系统是多道程序设计系统时,通常就会有多个进程或线程同时竞争 CPU。只要是有两个或更多的进程处于就绪状态,这种情形就会发生。如果只有一个 CPU 可用,就必须选择下一个要运行的进程。在操作系统中,完成选择工作的这一部分称为调度程序,该程序使用的算法称为调度算法。

  • 进程行为:几乎所有进程的 I/O 请求和计算都是交替突发的。
  • 何时调度:
    • 创建一个新进程之后,需要决定是运行父进程还是运行子进程
    • 一个进程退出时
    • 当一个进程阻塞在 I/O 和信号量上或由于其他原因阻塞时
    • 在一个 I/O 中断发生时

如果硬件时钟提供周期性中断,可以在每个时钟中断或者在每 k 个时钟中断时做出调度决策。

  • 非抢占式调度:选择一个进程,然后让该进程运行直至被阻塞,或者直到该进程自动释放 CPU
  • 抢占式调度:选择一个进程,并且让该进程运行某个固定时段的最大值。如果在该时段结束时,该进程仍在运行,它就被挂起,而调度程度挑选另一个进程运行(如果存在一个就绪进程)

调度算法的目标

操作系统的分类:

  • 批处理
  • 交互式
  • 实时

所有系统:

  • 公平:给每个进程公平的 CPU 份额
  • 策略强制执行:保证规定的策略被执行
  • 平衡;保持系统的所有部分都忙碌

批处理系统:

  • 吞吐量:每小时最大作业数
  • 周转时间:从提交到终止间的最小时间
  • CPU 利用率:保持 CPU 始终忙碌

交互式系统

  • 响应时间:快速响应请求
  • 均衡性:满足用户的期望

实时系统

  • 满足截止时间:避免丢失数据
  • 可预测性:在多媒体系统中避免品质降低

批处理系统的调度

计算公式:

  • 完成时间=开始时间+服务时间
  • 周转时间=完成时间-到达时间
  • 平均周转时间=作业周转总时间/作业个数
  • 带权周转时间=周转时间/服务时间
  • 平均带权周转时间:带权周转时间/进程数

先来先服务 FCFS

按照进程请求 CPU 的顺序使用 CPU,排在就绪队列队头的进程运行它所期望的时间长度,当正在运行的进程被阻塞时,就绪队列中的第一个进程接着运行,当被阻塞的进程变为就绪时,它就像一个新来的进程一样,排在就绪队列的末尾。

  • 优点:易于理解、方便实现
  • 缺点:资源利用率低、影响响应时间

最短作业优先(SJF)

进程开始获取 CPU 一直运行直到完成或者由于某事件被阻塞放弃 CPU,运行结束后从当前就绪队列选择“最短”的进程运行。该调度算法适用于运行时间可以预知的任务。

  • 优点:利于短进程、可以有效减少周转时间
  • 缺点:长进程可能由于得不到 CPU 而‘饿死’

最短剩余时间优先

使用这个算法,调度程序总是选择剩余运行时间最短的那个进程运行。

  • 有关的运行时间必须提前掌握。当一个新的作业到达时,其整个时间同当前进程剩余时间做比较;

  • 如果新的进程比当前运行进程需要更少的时间,当前进程就被挂起,而运行新的进程。

  • 优点:利于短进程

  • 缺点:开销大、不利于长进程

响应比优先 HRRN

进程开始获取 CPU 一直运行直到完成或由于某事件被阻塞放弃 CPU,运行结束从当前就绪队列选择最高响应比的进程投入运行。

  • 响应比=(等待时间+运行时间)/运行时间=1+等待时间/运行时间(等待时间指进程到达时可能需要等待前一进程先执行完)
  • 在响应时间固定的情况下,利于短进程。长进程随着等待时间边长,响应比会提高,因此长进程也能在足够长的时间被调度。

交互式系统中的调度

轮转调度

每个进程被分配一个时间段,称为时间片,即允许该进程在该时间段中运行。
时间片小会导致过多的进程切换,降低 CPU 效率;而太大又可能引起对短的交互请求的响应变差。将时间片设为 20ms-50ms 通常是一个比较合理的折中。

优先级调度

轮转调度的隐含假设:所有的进程同等重要。拥有和操作多用户计算机系统的人对此有不同的看法。这种将外部因素考虑在内的需要就导致了优先级调度。基本思想是每个进程被赋予一个优先级,允许优先级最高的可运行进程先运行。

  • 为了防止高优先级进程一直获取 CPU,调度程序可以在每个时钟滴答(即每个时钟中断)降低当前进程的优先级。如果这个动作导致该进程的优先级低于次高优先级的进程,则进行进程切换。
  • 每个进程可以被赋予一个允许运行的最大时间片,当这个时间片用完,下一个次高优先级的进程获得机会运行。

实时系统

实时系统是一种时间起着主导作用的系统。
实时系统的分类:

  • 硬实时:必须满足绝对的截止时间
  • 软实时:虽然不希望偶尔错失截止时间,但是可以容忍

实时系统中的事件分类:

  • 周期性:以规则的时间间隔发生
  • 非周期性:发生时间不可预知

m 个周期性事件,事件 i 以周期 Pi 发生,并需要 Ci 秒 CPU 时间处理一个事件,那么可以处理负载的条件是:Ci/Pi 的和不大于 1 。 满足这个条件的实时系统是可调度的。

机制和策略

假设系统中所有进程分属不同的用户,并且进程间相互竞争 CPU。
将调度机制和调度策略分离,调度机制位于内核,调度策略由用户进程决定。调度算法以某种形式参数化,而参数可以有用户进程填写。内核使用优先级调度算法,并提供一条可供进程设置/改变优先级的系统使用。

线程调度

当若干进程都有多个线程时,就存在两个层面的并行:进程和线程。