处理机调度的层次和调度算法的目标
调度:是一种资源分配;
处理机调度:对处理机资源进行分配;
处理机调度算法:根据处理机分配策略所规定的处理机分配算法。
处理机调度的层次:
1. 高级调度:又称长程调度或作业调度,调度对象是作业。
功能:根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。
主要应用于多道批处理系统中。
2. 低级调度:又称短程调度或进程调度,调度对象是进程。
功能:根据某种算法,决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。
它是最基本的一种调度,在多道批处理、分时和实时三种类型的OS中,都必须配置这级调度。
3. 中级调度:又称中程调度或内存调度。引入中级调度的主要目的,是为了提高内存利用率和系统吞吐量。
功能:使暂时不能运行的进程调至外存上等待。此时的进程状态称为就绪驻外存状态或挂起状态。
若挂起状态的进程已具备运行条件且内存又稍有空闲时,由中级调度来决定把外存上的那些又具备运行条件的就绪进程,重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待进程调度。
处理机调度算法的目标
1. 处理机调度算法的共同目标
(1) 资源利用率
使系统中的处理机和其它所有资源都尽可能地保持忙碌状态。
(2) 公平性
使诸进程都获得合理的CPU时间,不会发生进程饥饿现象。公平性是相对的,对相同类型的进程应获得相同的服务;但对于不同类型的进程,由于紧急程度或重要性不同,则提供不同的服务。
(3) 平衡性
由于在系统中可能具有多种类型的进程,有的属于计算型作业,有的属于I/O型。为使系统中的CPU和各种外部设备都能经常处于忙碌状态,调度算法应尽可能保持系统资源使用的平衡性。
(4) 策略强制执行
对所制定的策略其中包括安全策略,只要需要,就必须予以准确地执行,即使会造成某些工作的延迟也要执行
2. 批处理系统目标
(1) 平均周转时间短(周转时间:从作业提交给系统开始,到作业完成为止这段时间间隔)
四部分时间:
- 作业在外存后备队列上等待作业调度的时间
- 进程在就绪队列上等待进程调度的时间
- 进程在CPU上执行的时间
- 进程等待I/O操作完成的时间
(2) 系统吞吐量高
- 吞吐量是指在单位时间内系统所完成的作业数
- 吞吐量与批处理作业的平均长度有关
- 如果单纯是为了获得高的系统吞吐量,就应尽量多地选择短作业运行
(3) 处理机利用率高
- 如果单纯是为使处理机利用率高,应尽量多地选择计算量大的作业运行
3. 分时系统目标
(1) 响应时间快(响应时间:从用户通过键盘提交一个请求开始,直到屏幕上显示出处理结果为止的一段时间间隔。)
- 请求信息从键盘输入开始,直至将其传送到处理机的时间
- 处理机对请求信息进行处理的时间
- 将所形成的响应信息回送到终端显示器的时间
(2) 均衡性
- 指系统响应时间的快慢应与用户所请求服务的复杂性相适应
4. 实时系统目标
(1) 截止时间的保证
- 开始截止时间
- 完成截止时间
(2) 可预测性
作业与作业调度
批处理系统中的作业
1. 作业和作业步
作业 = 程序与数据还有作业说明书
作业步:即每个作业相对独立又相互关联的加工步骤。
作业控制过程:编译、链接、装配、运行
2.作业控制块JCB(为了管理和调度作业,在多批道处理系统中,为每个作业设置了一个作业控制块)
- 用来对作业进行描述的数据结构称为作业控制块
- 和进程控制块类似,作业控制块用来唯一的标识作业
- JCB保存了系统对作业进行管理和调度的全部信息
- JCB内容包括:作业标识、用户名称、用户账号、作业类型(CPU繁忙型、I/O繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业运行时间)、资源需求(预计运行时间、内存大小要求)、资源使用情况。
3. 作业运行阶段及状态
(1) 收容阶段 — 后备状态
(2) 运行阶段 — 运行状态
(3) 完成阶段 — 完成状态
4.作业调度主要任务
接纳多少个作业,接纳那些作业。
作业调度算法
1. 先来先服务FCFS(first-come first-served)
- 思想:系统按照作业到达的先后次序进行调度,优先考虑在系统中等待时间最长的作业,不管作业执行时间长短。
- 特点:简单,用于作业调度和进程调度
- 有利于长作业,不利于短作业(周转时间长)
- FCFS调度算法的作业平均周转时间与作业提交的顺序有关。
2. 短作业优先SJF(short job first)
- 思想:系统按照作业长短计算优先级,作业越短,优先级越高。
- 特点:(1) 必须预知作业的运行时间。(2) 对长作业不利,增长其周转时间。(3) 无法实现人-机交互。(4) 未考虑作业紧迫程度。
- 易于实现,能获得较理想的作业平均周转时间 ;未考虑等待时间,可能使执行时间长的作业长时间等待。
- 例:四个作业同时到达系统并立即进入调度:
实施SJF调度算法和FCFS调度算法,分别求作业平均周转时间和平均带权周转时间:
FCFS:作业平均周转时间:T = (9+13+23+31)/4 = 19
作业平均带权周转时间:W = (9/9+13/4+23/10+31/8)/4 = 2.51
SJF:作业平均周转时间:T = (4+12+21+31)/4 = 17
作业平均带权周转时间:W=(4/4+12/8+21/9+31/10)/4 = 1.98
由此可知:SJF的平均作业周转时间比FCFS要小,故它的调度性能比FCFS好。
3. 优先级调度PSA
- 思想:基于作业的紧迫程度,由外部赋予作业相应的优先级,根据优先级进行调度。
- 特点:紧迫性作业可优先运行。
4. 高响应比优先HRRN
- 思想:根据每个作业动态优先级调度
- HRRN是介乎于FCFS与SJF两者之间的折衷算法,既考虑作业等待时间,又考虑作业的运行时间,既照顾短作业又不使长作业的等待时间过长,改进了调度性能。
- 例:以下四个作业先后到达系统进入调度:
FCFS:作业平均周转时间T = (20+30+30+35)/4 = 28.75
作业平均带权周转时间W = (20/20+30/15+30/5+35/10)/4 = 3.13
SJF:调度顺序为:1、3、4、2。
作业平均周转时间T = (20+15+20+45)/4 = 25
作业平均带权周转时间W = (20/20+15/5+20/10+45/15)/4 = 2.25
HRRN:
- 先执行作业1,执行时间20ms;
- 作业1执行完毕,响应比依次为1+15/15、1+10/5、1+5/10,作业3被选中,执行时间5ms;
- 作业3执行完毕,响应比依次为1+20/15、1+10/10,作业2被选中,执行时间15ms;
- 作业2执行完毕,作业4被选中,执行时间10ms;
作业平均周转时间T = (20+15+35+35)/4 = 26.25
作业平均带权周转时间W = (20/20+15/5+35/15+35/10)/4 = 2.46
进程调度
1.进程调度任务
- 保存处理机现场信息
- 按某种算法选取进程(调度程序)
- 把处理机分配给进程(分派程序)
2. 进程调度机制
(1)排队器:为提高效率,提前将就绪进程按照一定策略进行排队处理。
(2)分派器:根据进程调度选定的进程,将其从就绪队列中取出,进行从分派器到新选进程的上下文切换。
(3)上下文切换器:当前进程→分派程序,分派程序→新选定进程。
3.调度方式
1)非抢占方式:
- 分配CPU后,进程一直运行到完成或异常终止
- 简单、系统开销小
- 批处理系统
2)抢占方式:
- 系统根据某种策略(抢占原则)收回正在运行进程的CPU,调度其它就绪进程运行
- 及时响应各进程的请求
- 分时、实时系统
- 抢占原则:(1)优先权原则(2)短进程优先原则(3)时间片原则
轮转调度算法
基于时间片的轮转(round robin,RR)调度算法,采用非常公平的处理机分配方式。
1. 轮转法基本原理:系统将所有就绪进程按FCFS策略排成一个就绪队列,每次把CPU分配给队首进程,令其执行一个时间片。
2. 进程切换时机(两种情况):
- 进程结束时一个时间片尚未用完,立即激活调度程序调度队首进程运行,启动一个新的时间片。
- 一个时间片用完时进程尚未运行完毕,计时器中断程序被激活,调度程序将当前进程送至队列末尾。
3. 时间片大小确定
轮转法调度是一种抢占式调度,系统耗费在进程切换上的开销比较大,这个开销与时间片的大小很有关系。
- 时间片过短->用户的一次请求需要多个时间片才能处理完,上下文切换次数增加,响应时间长。
- 时间片过长->退化为FCFS算法,进程在一个时间片内都执行完。
优先级调度算法
思想:调度时把处理机分配给就绪队列中优先级最高的进程。
优先级调度算法分为非抢占式和抢占式
优先级的类型:
- 静态优先级:在创建进程时确定,在进程的整个运行期间保持不变。用0~255之间的一个整数表示。
确定优先级的三个依据:
(1)进程类型:系统级>用户级;
(2)进程对资源需求;
(3) 用户要求,进程紧迫程度
- 动态优先级:在创建进程之初,先赋予其一个优先级,然后其值随进程的推进或等待时间的增加而改变,以便获得更好的调度性能。
多队列调度算法
该算法将系统中的进程就绪队列从一个拆分成若干个:
- 将不同类型或性质的进程固定分配在不同的就绪队列
- 不同的就绪队列采用不同的调度算法
- 一个就绪队列的进程可以设置不同的优先级
- 不同就绪队列本身可以设置不同的优先级
多级反馈队列调度算法
1.调度机制
(1) 设置多个就绪队列。每个队列赋予不同优先级,优先级越高的队列时间片越短。
(2) 每个队列采用FCFS算法。当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便撤离系统。否则,在一个时间片结束尚未完成,调度程序将其转入第二队列的末尾等待调度。如果在第二队列运行一个时间片后尚未完成,依次放入第三队列,依次类推。当进程降到第n队列后,在第n队列中便采取按照RR方式运行。
(3) 按队列优先级调度。调度程序首先调度最高优先级队列中各进程运行,当最高级队列为空时才选择调度次高级队列中进程。
2.调度算法的性能
(1) 终端型用户。
(2) 短批处理作业用户。
(3) 长批处理作业用户
死锁概述
Dijkstra在1968年提出“死锁”的现象:两个或多个进程都占有其它进程请求的资源,每个进程都不能执行,处于永远的等待状态。
资源按照是否能被消耗分为:
- 可重用性资源:就是指永久性资源,可以重复使用,如CPU、主存、I/O设备等。
- 可消耗性资源:临时性资源,通常由一个进程产生,而被另一个进程消耗掉,只能使用短暂的时间,如进程同步时交换的信息、数据文件等。
资源分为可抢占性资源和不可抢占性资源。
死锁与不可抢占性资源及可消耗资源有关。
计算机中死锁问题往往基于以下原因:
- 竞争不可抢占性资源引起死锁
- 竞争可消耗资源引起死锁
- 进程推进顺序不当引起死锁
死锁:如果一组进程中每一个进程都在等待仅由该组进程中其他进程才能引发的事件,那么该组进程是死锁的(Deadlock)。
产生死锁的四个必要条件:
- 互斥(资源独占):对其申请的资源排他使用,其他申请资源的进程必须等待。
- 请求和保持(占有和等待):进程在已经占有资源的情况下,又申请资源得不到满足时,并不释放已占资源。
- 不可抢占:资源只有进程自己释放,不能由其他进程强制释放,即使进程阻塞,其占有资源也不能被别的进程使用。
- 循环等待:等待进程形成一个封闭的链,链上的进程都在等待下一个进程占有的资源,造成了无止境的等待状态。
*****四个条件是产生死锁的必要条件,并非充分条件。如果破坏上述4个条件之一,就可以预防死锁的产生。
处理死锁的方法:
(1) 预防死锁:通过破坏死锁四个必要条件一个或几个实现,方法简单。
(2) 避免死锁:资源动态分配过程中防止系统进入不安全状态。
(3) 检测死锁:检测机构检测死锁发生,采取措施处理。
(4) 解除死锁:发生死锁后,采用抢占或撤销进程方式解除死锁状态。
预防死锁
1.破坏“请求和保持”条件
协议1:规定所有进程开始运行前,必须一次性申请整个运行过程中所需的全部资源。
优点:简单,易行且安全。
缺点: 资源被严重浪费,严重恶化了资源的利用率;进程会发生饥饿现象。
协议2:允许一个进程只获得运行初期所需资源后便开始运行,运行过程中再逐步释放已分配且已用毕的全部资源,然后再请求新的资源。
优点: 提高设备利用率;减少进程发生饥饿的几率。
2.破坏“不可抢占”条件
规定当一个进程已经保持了某些不可被抢占资源,又提出新的资源请求无法满足时,必须释放已经保持的所有资源,待以后需要时重新申请。
缺点:实现复杂,代价高。可能造成进程前一段工作失效,也会延长进程周转时间,增加系统开销。
3.破坏“循环等待”条件
对系统资源进行线性排序,并赋予不同的序号。
协议:规定每个进程必须按照序号递增的顺序请求资源。即一个进程开始时请求到Ri资源单元,以后当且仅当F(Rj)>F(Ri)时,进程才可以请求Rj资源单元。
避免死锁
基本思想:确保系统始终处于安全状态
避免死锁机制,是在资源动态分配过程中,防止系统进入不安全状态。
所谓安全状态,指系统能按照某种进程推进顺序(P1,P2,...,Pn)为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成,此时称(P1,P2,...,Pn)为安全序列。
并非所有的不安全状态都会转为死锁状态 但不安全状态有可能进入死锁。
死锁的检测与解除
死锁的检测
1. 资源分配图:圆圈代表一个进程,方框代表一类资源。由于一种资源的类型可能有多个,方框中的一个点代表一类资源中的一个资源。此时,请求边是由进程指向方框中的Rj,而分配边则应始于方框中的一个点。
2. 资源分配图的简化
在进行一系列的简化后,若能消去图中所有边,使所有进程都成为孤立结点,则称该图是可完全简化的;若不能通过任何过程使该图完全简化,则称该图是不可完全简化的。即当前状态为死锁状态。
3. 死锁定理
S为死锁状态的充分条件是当且仅当S状态的资源分配图是不可以完全简化的。
死锁的解除
1. 解除死锁方法
- 抢占资源
- 终止(或撤销)进程