操作系统——进程调度
操作系统——进程调度
进程调度概念
多道程序的目标是时钟允许某个进程运行以最大化CPU利用率,当一个进程等待时,操作系统应该从该进程接管CPU控制,并将CPU交给另一进程,这样的方式不断重复,当一个进程需要等待时,操作系统将会调度另一个进程来使用CPU,进程调度是操作系统的基本功能,CPU是最重要的计算机资源之一,故CPU调度是操作系统设计的重要组成部分
调度方式
非剥夺调度方式
又称为非抢占的(nonpreemptive)
或协作的(cooperative)
方式,指的是当一个进程正在使用CPU时,即使有更为紧迫或重要的进程进入就绪状态等待调度,占用CPU的进程仍然将继续执行,直到它终止、阻塞或切换到等待状态,才会将处理机分配给更为紧迫的进程
剥夺调度方式
又称为抢占的(preemptive)
方式,指的是当一个进程正在使用CPU时,若有更为紧迫或重要的进程进入就绪状态等待调度,操作系统将暂停当前占用CPU的进程的执行,将CPU分配给更为重要或紧迫的进程。
剥夺式调度方式可能会导致竞争的情况,同时剥夺式调度需要遵循一定原则,例如优先级、时间片等等。
基本准则
CPU使用率
使CPU尽可能地忙碌
吞吐量
单位时间内CPU进程完成的数量,长进程消耗时间长,会降低吞吐量,短进程则反之
周转时间
从作业提交到作业完成所经历的时间,是作业等待、在就绪队列中排队、在处理机上运行及进行输出输出操作所花费时间的总和
- 公式
周转时间 = 作业完成时间 - 作业提交时间
- 平均周转时间
多个作业周转时间的平均值
平均周转时间 = ∑ i = 0 n \sum_{i=0}^n ∑i=0n作业周转时间 / n - 带权周转时间
作业周转时间与作业实际运行时间的比值
带权周转时间 = 作 业 周 转 时 间 作 业 实 际 运 行 时 间 {作业周转时间\over 作业实际运行时间} 作业实际运行时间作业周转时间 - 平均带权周转时间
指的是多个作业带权周转时间的平均值
平均带权周转时间 = ∑ i = 0 n \sum_{i=0}^n ∑i=0n作业带权周转时间 / n
等待时间
进程处于等待处理机状态的时间,CPU调度算法不影响进程运行和执行IO的时间,只影响进程在就绪队列因等待所需的时间。
响应时间
用户提交请求到系统首次产生响应所用的时,调度算法应尽量降低响应时间
调度算法
调度算法应最大化CPU使用率和吞吐量,最小化周转时间、等待时间和响应时间
先来先服务(FCFS)调度算法
先来先服务(First-Come First-Service, FCFS)算法
先请求CPU的进程首先分配到CPU,通过FIFO队列可以很容易地实现,FCFS算法属于不可剥夺算法
- 特点
- 算法简单
- 效率低
- 对长作业有利,不利于短作业(相对短作业优先和高响应比)
- 有利CPU繁忙型,不利于I/O繁忙型
- 护航效果
护航效果(convoy effect)
,所有进程处理完I/O进入就绪队列,等待一个CPU密集型进程的完成。
短作业优先(SJF)算法
短作业优先(Shortest-Job-First, SJF)算法
优先选择估计运行时间最短的作业,更为恰当的表示是最短下次CPU执行(Shortest-next-CPU-burst)算法,因为调度取决于下次CPU执行的长度,而非总长度
- 特点
- SJF算法平均等待时间和平均周转时间最短
- 对长作业不利,调度算法总是优先调度短作业将导致长作业长期不被调度,出现饥饿现象
- SJF算法完全未考虑作业的紧迫程度
- 常用于长期调度,在短期CPU调度级别上难以实现,因为没有办法知道下一次CPU执行长度,
一般依据用户提供的估计执行时间,而用户可能会有意或无意地缩短其作业估计执行时间,导致不一定做到短作业优先
,另一种方法是试图近似SJF调度,预测下一个CPU执行的长度,认为下一个CPU执行长度与以前相似
- SJF算法可以是剥夺式或非剥夺式的,剥夺式SJF调度又称为
最短剩余时间优先(Shortest-ramaining-time-first)调度算法
优先级调度算法
优先级调度(Priority-scheduling)算法
SJF算法是通用优先级调度算法的特例,每个进程都有一个优先级与其关联,具有最高优先级的进程能够分配到CPU
- 优先级
- 内部定义
采用一些测试数据来计算进程优先级,如时限、内存需求、打开文件树和平均I/O时间等 - 外部定义
采用操作系统以外的准则,如进程重要性、用于支付使用计算机的费用和数量、赞助部门或其他因素 - 静态优先级
创建进程时决定的,且在进程整个运行期间保持不变 - 动态优先级
在进程运行的过程中,可以根据进程情况的变化动态调整优先级 - 参照原则
系统进程 > 用户进程
交互性进程 > 非交互性进程
I/O型进程 > 计算型进程
- 特点
- 可能出现
无穷阻塞(indefinite blocking)
或饥饿(starvation)
,低优先级进程一直不能获得CPU资源 - 可以采用
老化(aging)
来解决无穷阻塞(indefinite blocking)
和饥饿(starvation)
,即逐渐增加系统中等待很长时间的进程的优先级 - 优先级调度算法可以是抢占式也可以是非抢占式的
高响应比优先调度算法
高响应比优先(Highest Response Ratio Next)调度算法
优先选取就绪队列中响应比最高的进程, 是对于FCFS算法和SJF算法的综合平衡,同时考虑了每个作业的等待时间和估计的运行时间
- 响应比
响应比 = 等 待 时 间 + 要 求 服 务 时 间 要 求 服 务 时 间 {等待时间 + 要求服务时间 \over 要求服务时间} 要求服务时间等待时间+要求服务时间 - 特点
- 等待时间相同时,要求服务时间越短,响应比越高,对短作业有利
- 作业的要求服务时间相同时,等待时间越长,响应比越高,实现了FCFS算法,对于长作业,等待时间越长,响应比越高,等待一定时间就可以获得处理机,克服饥饿状态
时间片轮转调度算法
时间片轮转调度(Time Slice Round Robin)算法
又称轮转(Round-Robin, RR)算法,专门为分时系统设计的,类似于FCFS,增加了抢占以切换进程,将一个较小的时间单元定义为时间量(time quantum)或时间片(time slice),时间片大小通常为10~100ms,就绪队列为循环队列,每个进程使用完一个时间片后,即使进程未完成也必须释放处理器给就绪队列的第一个进程,被抢占进程进行上下文切换并加入队尾等待下次调度
- 特点
- 平均等待时间较长
- RR算法性能很大程度上取决于时间片的大小,时间片很大以致于每个进程能在一个时间片内执行完成,则与FCFS算法相同,时间片很小会导致大量的上下文切换,处理机开销增大,而用于进程执行的时间却很少,周转时间同样取决于时间片大小
- 时间片长度通常取决于系统响应时间、就绪队列中的进程数量和系统的处理能力
多级反馈队列调度算法
多级反馈队列调度(Multilevel Feedback Queue Scheduling)算法
多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合和发展,通过动态调整进程优先级和时间片大小,可以兼顾多方面的系统目标
- 实现思路
- 设置多个就绪队列,为每个队列赋予不同优先级
- 赋予各个队列的执行时间片大小不同,优先级越高,时间片越小
- 新进程进入内存后,进入最高优先级队列队尾,按照FCFS原则等待,若在时间片内完成则进程撤离系统,否则进行上下文切换并进入下一优先级队列按照FCFS原则等待,直到完成或者到最低优先级队列,在最低优先级队列则为时间片轮转调度算法
- 仅当比当前队列优先高的队列为空时,当前队列中的进行才可以分配到处理机,若此时有新的进程进入则会抢占从当前队列调度进入CPU执行的进程,调度到当前队列末尾
- 特点
- 它是最通用的CPU调度算法,也是最复杂的CPU调度算法
- 对于终端用户,短作业优先
- 对于短批处理用户,周转时间较短
- 对于长批处理用户,经过几个队列得到部分执行,不会长时间得不到处理
鸣谢
- 《王道考研数据结构》
- 《操作系统概念》
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
发布评论