调度
当有一堆任务要处理,由于资源有限,没办法同时处理。需要 某种规则 来决定处理这些任务的顺序
作业
作业:一个具体的任务
用户向系统提交一个作业 = 用户让操作系统启动一个程序(来处理一个具体的任务)
调度的三个层次
高级调度(作业调度)
按照某种策略从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次(建立PCB),调出一次(撤销PCB)
低级调度(进程调度、处理机调度)
按照某种策略从就绪队列中选出一个进程,将处理机分配给它
OS中最基本的一种调度,调度频率很高,一般几十毫秒一次
中级调度(内存调度)
内存不够时,可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存。
调到外存等待的进程状态 挂起状态。被挂起的进程PCB会被组织成挂起队列
按照某种策略决定将哪个处于挂起状态的进程重新调入内存
一个进程可能会被多次调出、调入内存,因此 中级调度发生频率要比高级调度高
挂起状态
五状态模型 => 七状态模型
暂时调到外存等待的进程状态为挂起状态,挂起态又可分为就绪挂起、阻塞挂起
XM-处理机调度
临界资源、临界区
临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源
临界区:访问临界资源的那段代码
进程调度的时机
进程调度的方式
非剥夺调度方式(非抢占式)
只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态
实现简单,系统开销小,但是无法及时处理紧急任务,适合于早期批处理系统
剥夺调度方式(抢占式)
有更紧迫的任务到达,立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程
可以优先处理更紧急的进程,也可以实现让各进程按时间片轮流执行的功能(时钟中断),适用于分时操作系统、实时操作系统
进程的切换与过程
狭义的进程调度 就是从就绪队列中选一个要运行的进程。(这个进程可能是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况需要进程切换)
进程切换 指一个进程让出处理机,由另一个进程占用处理机的过程。
广义的进程调度 包含了选择一个进程和进程切换。
进程切换的过程完成了:
- 对原来运行进程各种数据的保存(保存在PCB)
- 对新的进程各种数据的恢复
- PCB中的程序计数器,程序状态字,各种寄存器数据等处理机现场信息
进程切换室友代价的,过于频繁进行进程调度和切换,会使整个系统的效率降低,将大部分时间用于进程切换而不是执行进程。
XM-进程调度
调度器(调度程序)
不支持内核级线程的操作系统,调度程序的处理对象是进程
支持内核级线程的OS,调度程序处理对象是内核线程
闲逛进程
没有其他就绪进程时,运行闲逛线程,其特性
- 优先级最低
- 可以是0地址指令(不需要访存,能耗低),占一个完整的指令周期(指令周期末尾例行检查中断)
调度算法评价指标
CPU利用率:CPU忙碌的时间占总时间的比例
系统吞吐量:单位时间内完成作业的数量
周转时间: 从作业被提交给系统开始,到作业完成为止这段时间间隔
- 包括四个部分,作业在外存后备队列上等待高级调度的时间、进程在就绪队列上等待低级调度的时间、进程在CPU上执行的世界,进程等待IO完成的时间,后三项可能在一个作业处理过程中发生多次。
- 周转时间 = 作业完成时间 - 作业提交时间 (用户关心的)
- 平均周转时间 = 各作业完成时间之和 / 作业数 (操作系统关心的)
- 带权周转时间 = 作业周转时间 / 作业实际运行的时间(必然大于等于1)
- 带权周转时间越小用户满意度越高
- 平均带权周转时间 = 各带权周转时间之和 / 作业数
等待时间:进程/作业处于等待处理机状态时间之和
- 对于进程,等待时间是进程建立后等待被服务的时间之和,等待I/O完成的期间进程也是在被服务的,不计入等待时间
- 对于作业,要考虑建立进程后等待的时间,还要加上作业在外存后备队列等待的时间
一个作业总共需要被CPU服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法只会影响作业/进程的等待时间。
响应时间:用户提交请求到首次产生响应所用的时间
XM-调度算法评价指标
调度算法-①
先来先服务 FCFS
- 算法规则:按照作业/进程到达的先后顺序进行服务
- 用于作业/进程调度:哪个作业先到达后备队列;哪个进程先到达就绪队列
- 非抢占式
- 公平、算法简单
- 排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间大,对短作业来说用户体验不好。 对长作业有利,对短作业不利
- 不会导致饥饿(某进程/作业长期得不到服务)
短作业优先 SJF
- 思想:追求最少的平均等待时间,平均周转时间,平均带权周转时间
- 算法规则:最短(服务时间最短)的作业/进程优先得到服务
- 用于作业/进程调度。用于进程调度时称为短进程优先 SPF 算法
- SJF SPF非抢占式。也有抢占式 最短剩余时间优先算法 SRTN
- "最短的"平均等待时间、平均周转时间
- 对短作业有利,对长作业不利,可能产生饥饿现象。另外运行时间是由用户提供的,并不一定真实,不一定做到真正的短作业优先
- 源源不断地有短作业/进程到来,可能使长作业得不到服务,最终饿死
高响应比优先算法 HRRN
- 思想:综合考虑作业/进程的等待时间和要求服务时间
- 算法规则:每次调度时先计算各个作业/进程的 响应比,选择响应比最高的为其服务
- 响应比 = (等待时间+要求服务时间) / 要求服务时间
- 用于作业/进程调度
- 非抢占式
- 综合考虑了等待时间和要求服务时间
- 等待时间相同时,要求服务时间短的优先(SJF)
- 要求服务时间相同时,等待时间短的优先(FCFS)
- 对长作业来说,随着等待时间越来越久,响应比会越来越大,避免了长作业饥饿的问题
调度算法-②
时间片轮转 RR(分时操作系统)
- 思想:公平、轮流为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。更关心进程的响应时间。
- 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程没在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾排队
- 用于进程调度(只有作业放入内存建立了相应的进程后,才能分配处理机时间片)
- 抢占式。由时钟装置发出 时钟中断 来通知CPU时间片已到
- 公平;响应快,适用于分时操作系统
- 由于高频率进程切换,因此有一定开销;不区分任务的紧急程度
- 不会导致饥饿
如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法 退化为FCFS调度算法,并且会增大进程响应时间。因此时间片不能太大
时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,导致实际用于进程执行的时间比例减少
- 一般来说,设计时间片要让切换进程的开销占比不超过1%(了解)
优先级调度
- 思想:越来越多的场景需要根据任务的紧急程度来决定处理程序
- 算法规则:调度时选择优先级最高的作业/进程
- 用于作业/进程调度。甚至可以用于I/O调度中
- 抢占式(进程主动放弃处理机)、非抢占式(就绪队列改变时+主动放弃处理机)
- 用优先级区分各种任务的紧急程度、重要程度,适用于实时操作系统。可灵活调整对各种作业/进程的偏好程度。
- 若一直有高优先级进程进程到来,可能导致 饥饿
- 就绪队列未必只有一个,可以按照不同优先级来组织。可以把优先级更高的进程排在更靠近队头的位置
- 优先级可分为静态优先级和动态优先级
- 静态优先级:创建进程后一直不变
- 动态优先级:创建进程有一个初始值,之后会根据情况动态地调整优先级
- 如何合理设置进程优先级
- 系统进程优先级高于用户进程
- 前台进程优先级高于后台进程
- 操作系统更偏好 I/O型进程(I/O繁忙型进程)
- I/O设备和CPU可以并行工作,I/O型进程优先运行的话,则越有可能让I/O设备尽早投入工作,则资源利用率、系统吞吐量都会得到提升
- 与 I/O 繁忙型进程相对的是 计算型进程 (CPU繁忙型进程)
- 如果采用动态优先级,什么时候应该进行调整
- 从追求公平、提升资源利用率等角度考虑:某进程在就绪队列中等了很长时间提升优先级,某进程占用处理机运行了很长时间降低优先级,某进程频繁进行I/O操作提升其优先级
多级反馈队列
- 思想:对其他算法的折中权衡
- 算法规则:
- 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
- 新进程到达先进入第1级队列,按FCFS原则排队等待被分配时间片。若时间片用完进程还没结束,进入下一级队列队尾。如果此时已经在最下级队列,则重新放回最下级队列队尾
- 只有第k级队列为空时,才会为k+1级队头的进程分配时间片
- 被抢占处理机的进程重新放回原队列队尾
- 用于进程调度
- 抢占式
- 对各类进程相对公平 FCFS;每个新到达的进程都可以很快得到响应 RR;短进程只用较少时间完成 SPF;不必实现估计进程的运行时间(避免用户作假);可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程(将I/O阻塞的进程重新放回原队列,保持较高优先级)
- 会导致饥饿