CPU调度概述
CPU调度是多任务操作系统的基础,目的是使得CPU尽可能用于执行指令,从而提高CPU效率。
进程之间存在竞争,需要操作系统选择一个进程来进行这种转换。
长程和短程调度
长程调度
- 又称作业调度、高级调度。
- 指从“新建”状态转换到“就绪”状态的调度过程。
- 控制躲到程序的“道/度”。“道/度”:允许在内存运行的最多进程数。
短程调度
- 又称CPU调度、低级调度。
- 指调度进程选择下一个执行的进程。
长程与短程调度比较
切换频率 | 切换开销 | 操作系统中的应用 | |
---|---|---|---|
长程调度 | 低 | 大(秒/分,切换慢) | 可选,非必须 |
短程调度 | 高 | 小(毫秒级,切换快) | 必需 |
调度队列
为了方便进行CPU调度,操作系统需要对不同状态的进程进行组织和管理。为此,为某些特定的状态设立了一个或多个进程队列,用于管理这些进程。
就绪队列 -- 在内存中处于就绪状态并等待执行的所有进程的集合。
设备队列 --- 等待某一I/O设备的进程队列。
进程的执行过程实际上就是进程在各种队列之间的迁移。
图示有一个就绪队列;四个设备队列,四个设备队列均处于等待状态。
中程调度
中程调度,又称“交换”。指将进程在内存和外存间换进换出。(严格区别不属于进程调度,属于内存管理范畴)
目的:为了节省内存空间资源。
CPU脉冲周期
CPU调度过程
调度程序(Scheduler)
- 根据某种策略选择一个就绪进程。
- 一个CPU同时只能运行一个进程。
分派程序(Dispatcher)
- 负责把CPU的控制权转交给CPU调度程序。
- 切换上下文。
- 切换到用户态。
- 跳转到用户程序的适当位置并重新运行之。
分派延迟(Dispatch latency)--- 分派程序终止一个进程的运行并启动另一个进程运行所花的时间。
CPU调度方式和时机
非抢占调度(nonpreemptive)
- 一旦把CPU分配给某进程后,系统不可以抢占已分配的CPU分配给其他进程。
- 只有当进程自愿释放CPU,才可以把CPU分配给其它进程。
- 优点:容易实现,调度开销小,适合批处理系统。
- 缺点:响应时间长,不适合交互式系统。
抢占式调度(preemptive)
- 调度程序可根据某种原则暂停某个正在执行的进程,将已分配给它的CPU重新分配给另一个进程。
- 可以防止单一进程长时间独占CPU资源。
- 系统开销大。
抢占式和非抢占式区别:运行的进程是否自愿放弃CPU资源。
CPU调度时机
- 从运行转到等待(非抢占式)
- 从运行转到就绪(抢占式)
- 从等待转到就绪(抢占式)
- 终止运行(非抢占式)
CPU调度准则
调度准则--基本指标
CPU利用率 --- 固定时间内CPU运行时间的比例。
吞吐量 --- 单位时间内运行完的进程数量。
周转时间 --- 进程从提交到运行结束的全部时间。
等待时间 --- 进程等待调度(不运行)的时间片总和。
响应时间 --- 从进程提交到首次运行(而不是输出结果)的时间段,也就是第一段的等待时间。
周转时间 = 等待时间 + 运行时间
响应时间 <= 等待时间
调度准则--优化方法
通过调度算法,使得达到下述的优化方法:
- 最大的CPU利用率
- 最大的吞吐量
- 最短的周转时间
- 最短的等待时间
- 最短的响应时间
CPU调度算法1(FCFS和SJF)
先来先服务调度算法(FCFS)
先来先服务(First-Come, First-Served - FCFS)
按照进程请求CPU的先后顺序使用CPU。
算法特点
- 实现简单,可使用FIFO队列实现。
- 非抢占式。
- 当一个长进程后面的多个短进程,让长进程先执行,会让后面的短进程等待较长的时间,从而导致CPU和设备利用率降低。
- 公平。
短作业优先调度算法(SJF)
短作业优先(Shortest-Job-First, SJF)
关联到每个进程下次运行的CPU区间长度,调度最短的进程。
两种模式
非抢占式SJF调度,一旦进程拥有CPU,它的使用权限只能在该CPU区间结束后让出。
抢占式SJF调度,发生在有比当前进程剩余时间片更短的进程到达时,也称为最短剩余时间优先调度(Shortest-Remaining-Time-First, SRTF)。
SJF最优
对一组指定的进程而言,它给出了最短的平均等待时间。
下一个CPU区间长度的预测
SJF算法困难:如何知道下一个CPU区间的长度。
SJF通常用于长程调度。
指数估算法:通过先前的CPU区间长度及其指数平均进行预测。