处理机调度的基本概念
当计算机系统是多道程序设计系统时,通常就会有多个进程或线程同时竞争 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。
将调度机制和调度策略分离,调度机制位于内核,调度策略由用户进程决定。调度算法以某种形式参数化,而参数可以有用户进程填写。内核使用优先级调度算法,并提供一条可供进程设置/改变优先级的系统使用。
线程调度
当若干进程都有多个线程时,就存在两个层面的并行:进程和线程。