基本概念
- 调度:当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定出里这些任务的顺序,这就是调度。
- 处理机调度:就是从有序队列中按照一定的算法选择一个进程并将处理机分配给他运行,已实现进程的并发法执行
三个层次
高级调度(作业调度)
- 由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此需要确定某种规则来决定作业调入内存中的顺序
- 定义:按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等重要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利
- 高级调度是外存(辅存)与内存之间的调度。每个作业只调入一次,调出一次,在此期间会建立并撤销PCB。(高级调度主要是指调入问题)
中级调度(内存调度)
- 引进了虚拟存储技术后,可将暂时不能运行的进程调至外存等待。等重新具备了运行条件且内存稍有空闲时,再重新调入内存。这么做的目的是为了提高内存利用率和系统吞吐量
- 暂时调到外存等待的状态被称为挂起状态。调度时,PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存的存放位置,操作系统通过内存的PCB来保持对个进程的监控、管理。被挂起的进程PCB会被放到挂起队列中。
- 中级调度,就是决定将哪个处于挂起状态的进程重新调入内存。
- 一个进程会被多次的调入、调出,发生频率比高级调度高
低级调度(进程调度)
- 定义:低级调度,其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。
- 进程调度是操作系统做基本的一种调度,在一般的操作系统都必须配置进程调度
- 进程调度频率很高,一般几十毫秒一次
三层调度的联系、对比
补充知识
- 暂时调到外存等待的进程状态称为挂起状态(挂起态)
- 挂起态又可以进一步细分为就绪挂起和阻塞挂起两种状态
时机
什么时候需要进程调度
- 进程调度:也就是低级调度,按某种算法从就绪队列中选择一个进程为其分配处理机
- 当前进程主动放弃处理机
*进程正常终止
*运行过程中发生异常而终止
*进程主动请求阻塞(如 等待I/O) - 当前进程被动放弃处理机
*分给进程的时间片用完
*有更紧急的是需要处理(如 I/O中断)
*有更高优先级的进程加入就绪队列
什么时候不能进行进程调度
- 在处理中断的过程中。中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进程进程切换
- 进程在操作系统内核程序临界区中
- 在原子操作过程中。原子操作不可中断
临界区与内核程序临界区
- 临界资源:一个事件端只允许一个进程使用的资源。各进程需要互斥的访问临界资源
- 临界区:访问临界资源的那段代码
- 内核程序临界区一般用来访问某种内核数据结构,比如进程的就绪队列(由各就绪队列的PCB组成)
*进程访问内核程序临界区的数据结构时对就绪队列上锁,因此系统无法调用就绪队列的进程,故无法进程调度
*等到该进程访问结束后对就绪队列解锁,这样才能进程调度
切换与过程
"狭义的调度"与"切换"的区别
- 狭义的进程调度指的是从就绪队列中选中一个要运行的进程(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况需要进程切换)
- 进程切换是指一个进程让出处理机,有另一个进程占用处理机的过程
- 广义的进程切换包括选择一个进程和切换进程两个步骤
进程切换的过程需要做什么
- 1.对原来运行进程各种数据的保存
- 2.对新的进程各种数据的恢复(进程控制块PCB)
- 进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使系统的效率降低。
方式
非掠夺调度方式(非抢占式)
- 只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会尝试用处理机,知道该进程主动要求进入阻塞态
- 实现简单,系统开销小,但是无法及时处理紧急任务,适用于早期的批处理系统
掠夺调度方式(抢占式)
- 当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要更紧迫的那个进程
- 可以优先处理更紧急的进程,也可以实现按时间片轮流执行的功能。适用于分时操作系统,实时操作系统
调度算法的评价指标
CPU利用率
- 指CPU"忙碌"的时间占总时间的比例(有些问题还会问I/O设备的利用率等,只需要将净使用时间比总时间即可)
系统吞吐量
- 单位时间内完成作业的数量(总共完成了多少道作业/总共花了多少时间=n道/秒)
周转时间
- 指从作业从提交给系统开始,到作业完成为止的这段时间间隔(作业完成时间-作业提交时间)
- 包括四个部分
*作业在外存后备队列上等待作业调度的时间
*进程在就绪队列上等待进程调度的时间
*进程在CPU上执行的时间
*进程等到I/O操作完成的时间
*后三项在一个作业的整个处理过程中,可能发生多次 - 平均周转时间=各作业周转时间之和/作业数
- 带权周转时间=作业周转时间/作业实际运行的时间(对于周转时间相同的两个作业,实际运行时间长的作业,也就是等待时间短的作业,带权周转时间更小,用户满意度更高;对于实际运行时间相同的两个作业,周转时间短的带权时间更小,用户满意度高)
- 平均带权周期时间=各作业带权周转时间之和/作业数
等待时间
- 指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低
- 对于进程来说,等待时间就是指进程建立后等待被服务的是时间之和,在等待I/O完成的期间其实也是在被服务,所以不计入等待时间
- 对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在后备队列的等待时间
- 调度算法只会影响作业/进程的等待时间,也有平均等待时间,同上
响应时间
- 指从用户提交请求到首次产生响应所用的时间
调度算法
先来先服务(FCFS,First Come First Serve)
- 算法思想:主要从"公平"的角度考虑(类似于排队)
- 算法规则:按照作业/进程的先后顺序进行服务
- 用于作业/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列
- 是否可抢占:非抢占式算法
- 优缺点
*优点:公平、算法实现简单
*缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转啥时间很大,对短作业来说用户体验不好 - 是否会导致饥饿:不会(饥饿:某个进程/作业长期得不到服务)
例:
短作业优先(SJF,Shortest Job First)
- 算法思想:追求最少的平均等待时间,最少的平均周转时间,最少的平均带权周转时间
- 算法规则:最短的作业/进程有限得到服务(服务时间最短)
- 用于作业/进程调度:即可用于作业调度,也可用于进程调度。用于进程调度时称为"短进程有限(SPF,Shortest Process First)算法"
- 是否可抢占:SJF和SPF是非抢占式算法。但是也有抢占式算法–最短剩余时间优先算法(SRTN,Shortest Remaining Time Next)
- 优缺点
*优点:"做短的"平均等待时间、平均周转时间
*缺点:不公平,对短作业有利,对长作业不利。(作业/进程的运行时间是由用户提供的,并不一定真实,并不一定能做到真正的短作业优先) - 是否导致饥饿:会。如果有源源不断的短作业进来,可能会使长作业长时间的不到服务,产生"饥饿"现象。如果一直的得不到服务,则称为"饿死"
例:SPF
SRTN
- 做题时为特别说明,所提到的"短作业/进程优先级算法"默认是非抢占式的
- 在所有进程同时可运行或所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最短(主要看前提条件,如果选择题中出现,其他三项没有更合适的时候可去掉前提条件)
- 不过不加前提条件,SRNT算法的平均等待时间、平均周转时间最短
- 严格的来说,SJF的平均等待时间、平均周转时间不一定最少,但相比于FCFS,SJF会更短一些
高响应比优先(HRRN,Highest Respomse Ratio Next)
- 算法思想:综合考虑作业/进程的等待时间和要求服务时间
- 算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比高的作业/进程为其服务
*响应比=(等待时间+要求服务时间)/要求服务时间 - 用于作业/进程调度:既可用于作业调度,也可用于进程调度
- 是否可抢占:非抢占式的算法。只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比
- 优缺点
*优点:综合考虑了等待时间和运行时间;等待时间相同时,要求服务时间短的优先(SJF的有优点);要求服务时间相同时,等待时间长的优先(FCFS的优点);对于长作业来说,对着等待时间越来越久,其响应比也会越来越大,从而避免了饥饿问题
*缺点: - 是否导致饥饿:不会
例
- 这三种算法不关心"响应时间",不区分任务的紧急,适用于早起的批处理系统,不适用于交互式系统
时间片轮转(RR,Round-Robin)
- 算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
- 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个事件片(如:100ms)。若进程未在一个时间片内执行完成,则剥夺处理机,将进程从新放到就绪队列队尾重新排队。
- 用于作业/进程调度:只能用于进程调度(只有作业建立了相应的进程后,才能被分配处理机时间片)
- 是否可抢占:属于抢占式算法。由时钟装置发出时钟中断来通知CPU时间片已到
- 优缺点
*优点:公平、响应快,适用于分时操作系统
*缺点:进程切换时会产生一定的开销;不区分任务的紧急程度 - 是否导致饥饿:不会导致饥饿
例
- 常用与分时操作系统,更注重"响应时间",因而此处不计算周转时间
- 如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且增大响应时间。因此时间片不能太大
- 进程调度、切换是有时间代价的,因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程的切换,从而导致进程执行的时间比例减少。可见时间片不能太小(一般来说,设计时间片时要让切换进程的开销不超1%)
优先级调度
- 算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序
- 算法规则:每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程
- 用于作业/进程调度:既可用于进程调度,也可用于进程调度。甚至还可用于I/O
- 是否可抢占:抢占式和非抢占式都有:非抢占式秩序在进程主动放弃处理机进行调度既可;抢占式需在就绪队列变化时,检查是否会发生抢占
- 优缺点
*优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可以灵活地调整各种作业/进程的偏好程度
*缺点:若有源源不断的高优先级进程到来,则有可能导致饥饿 - 是否导致饥饿:会
例:非抢占式
抢占式
- 就绪队列未必只有一个,可以按照不同的优先级来组织。另外,也可以把优先级高的进程安排在更靠近队头的位置
- 根据优先级是否可以动态改变,可分为静态优先级和动态优先级
- 静态优先级:创建进程时确定,之后不会改变
- 动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级
- 通常(如何设置各类进程的优先级):
*系统进程优先级>用户进程
*前台进程优先级>后台进程
*操作系统偏好于I/O进程(或称I/O繁忙性进程。I/O设备与CPU可以并行工作,如果优先级先让I/O开始工作,则资源利用率、系统吞吐量都会得到提升)- 什么时候调整
*可以从追求公平、提高资源利用率等角度考虑
*如果某进程在就绪队列中等待时间过长,则可以考虑适当提高其优先级
*如果某进程占用处理机时间过长,适当降低其优先级
*如果发现一个进程频繁的执行I/O操作,适当提高其优先级
多级反馈队列
- 算法思想:对其他调度算法的折中权衡
- 算法规则:
*设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
*新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若时间片用完进程还没结束,则进程进入下一级队列队尾。如果此时已经是最低级的队列,则重新放回该队列队尾
*只要第k级队列为空时,才会为k+1级队头进程分配时间片 - 用于作业/进程调度:用于进程调度
- 是否可抢占:抢占式算法(在k级队列进程运行的过程中,若更上级队列中进入了一个新的进程,新进程会抢占处理机,原来运行的进程会放在k级队列的队尾)
- 优缺点
*优点:各类进程相对公平(FCFS);每个新到达的进程都可以很快得到响应(RR);短进程只需要较短时间就可以完成(SPF);不必估计事先进程的运行时间(就是定义长进程或短进程之别,避免用户作假);可灵活的调整能各类进程的偏好程度(可以将I/O进程被阻塞后后依然放回原队列,这样可以使其保持一个较高的优先级)
*缺点:源源不断的短进程进来,会导致饥饿 - 是否导致饥饿:会
例
这三种算法更适合用于交互式系统