处理机调度与死锁
1 处理机调度的层次和调度算法的目标
1.1 处理机调度的层次
(1)高级调度
又称长程调度或作业调度。它的调度对象为作业,只适用于多道批处理系统中,不适合实时和分时系统。主要功能是根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。
(2)低级调度
又称进程调度或短程调度。它的调度对象为进程或内核级线程,适用于所有类型的操作系统。其主要功能是,根据某种算法,决定就绪队列中的哪个进程获得处理机。进程调度是最基本的一种调度,在多道批处理、分时、实时三个类型的os中,都必须配置这级调度。
(3)中级调度
又称内存调度。主要目的是为了提高内存利用率和系统吞吐量。应使那些暂时不能运行的进程不再占用宝贵的内存资源,而将它们调至外存上去等待,把此时的进程状态称为就绪驻外存状态或挂起状态
总结:进程调度的运行频率最高,不宜使进程调度算法太复杂。作业调度的周期较长,故允许作业调度算法花费较多的时间。中级调度的运行频率基本上介于两种调度之间。
1.2 处理机调度算法的目标
- 处理机调度算法的共同目标
(2)公平性。公平性是指应使诸进程都获得合理的CPU 时间,不会发生进程饥饿现象。公平性是相对的。
(3)平衡性。应尽可能保持系统资源使用的平衡性。
(4)策略强制执行。包括安全策略,只要需要,就必须予以准确地执行,即使会造成某些工作的延迟也要执行。
- 批处理系统的目标
(1)平均周转时间短。 所谓周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔(称为作业周转时间)。包括四部分时间:作业在外存后备队列上等待(作业)调度的时间,进程在就绪队列上等待进程调度的时间,进程在 CPU 上执行的时间,以及进程等待 I/O 操作完成的时间。
(2)系统吞吐量高。吞吐量是指在单位时间内系统所完成的作业数。如果单纯是为了获得高的系统吞吐量,就应尽量多地选择短作业运行。
(3)处理机利用率高。如果单纯是为使处理机利用率高,应尽量多地选择计算量大的作业运行。
- 分时系统的目标
(1)响应时间快。所谓响应时间,是从用户通过键盘提交一个请求开始,直至屏幕上显示出处理结果为止的一段时间间隔。
(2)均衡性。指系统响应时间的快慢应与用户所请求服务的复杂性相适应。
- 实时系统的目标
(1)截止时间的保证。是指某任务必须开始执行的最迟时间,或必须完成的最迟时间。
(2)可预测性。 例如在多媒体系统中,可实现第 i 帧的播放和第 i+1 帧的读取并行处理,进而提高其实时性。
2 作业与作业调度
2.1 作业和作业步
(1)作业:不仅包含了通常的程序和数据,还配有一份作业说明书。在批处理系统中,是以作业为基本单位从外存调入内存的。
(2)作业步:把每一个加工步骤称为一个作业步。例如一个典型的作业可分成:“编译”作业步;“链接装配”作业步;“运行”作业步
2.2 作业控制块
为了管理和调度作业,在多道批处理系统中,为每个作业设置一个作业控制快JCB,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。
JCB中包含:作业标志、用户名称、用户账号、作业类型(CPU 繁忙型、I/O繁忙型、批量、终端型)作业状态、调度信息(优先级、作业运行时间)、资源需求(预计运行时间、要求内存大小等)、资源使用情况。
每当一个作业进入系统时,便由“作业注册”程序为该作业建立一个 JCB,再根据作业类型将它插入相应的作业后备队列中等待调度。在作业运行期间,系统就按照 JCB 中的信息和作业说明书对作业进行控制。
2.3 作业运行的三个阶段和三种状态
(1)收容阶段
把作业输入到硬盘上,再为作业建立 JCB 并把它放入作业后备队列中。此时作业状态为“后备状态”。
(2)运行阶段
当作业被作业调度选中后,便为它分配必要的资源和建立进程,并将它放入就绪队列。
(3)完成阶段
系统中的“终止作业”程序将会回收已分配给该作业的作业控制块和所有资源,并将作业运行结果信息形成输出文件后输出。
2.4 作业调度的主要任务
作业调度称为接纳调度。需做出以下两个决定:
(1) 接纳多少个作业?
取决于多道程序度,即允许多少个作业同时在内存中运行
(2)接纳哪些作业?
取决于所采用的调度算法
总结:在批处理系统中,作业进入系统后,总是先驻留在外存的作业后备队列上,因此需要有作业调度,以便将他们分装入内存。在分时系统和实时系统中,为了做到及时响应,用户通过键盘输入的命令或数据等都是被直接送入内存的,因而无需再配置作业调度机制,但也需要有某些限制性措施来限制进入系统的用户数。
2.5 调度算法
(1)先来先服务调度算法 FCFS
优先考虑在系统中等待时间最长的作业。
(2)短作业优先 SJF 的调度算法
作业的长短是以作业要求的运行时间来衡量的,SJF算法是以作业的长短来计算优先级的。
缺点
- 长作业等待时间过长,出现饥饿现象
- 采用SJF算法时,人机无法实现交互
- 该调度算法完全未考虑作业的紧迫程度,所以不能保证紧迫性作业能得到及时处理
- 必须预知作业的运行时间
(3)优先级调度算法 PSA
由外部赋予作业相应的优先级,调度算法是根据该优先级进行调度的。作业的长短就是作业的优先级,等待时间越长,其优先级越高。同样不能反应作业的紧迫程度。
(4)高响应比优先调度算法 HRRN
高响应比优先调度算法是既考虑了作业的等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长。为每个作业引入一个动态优先级,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地增加
由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先权又相当于响应比 RP
3 进程调度
3.1 进程调度三任务
- 保存处理机的现场信息
- 按某种算法选取进程
- 把处理器分配给进程
3.2 进程调度机制
- 排队器:按照一定的策略将就绪进程插入到相应的就绪队列中,提高进程调度的效率
- 分派器:根据进程程序所选的及昵称,将其从就绪队列中取出,然后进行从分派器到新选出进程间的上下文切换,将处理分配给新进程。
- 上下文切换器:当对处理机进行切换时,会发生两对上下文切换操作:①操作系统将保存当前进程的上下文,即把当前进程的处理机寄存器内容保存到该进程的 PCB 内的相应单元,再装入分派程序的上下文,以便分派程序运行。②移出分派程序的上下文,而把新选进程的 CPU 现场信息装入到处理机的各个相应寄存器中。在执行上下文操作的时候,需要执行大量的load和store等操作指令,以保存寄存器的内容。
3.3 进程调度的方式
(1)非抢占方式
不会因为时钟中断或任何其它原因去抢占当前正在运行进程的处理机。适用于大多数的批处理系统环境,不能用于分时系统和大多数实时系统。优点:实现简单,系统开销小,适用于大多数的批处理系统环境。
(2)抢占方式
调度程序可以根据某种原则重新分配当前进程的处理机给其它进程。在现代OS中广泛采用抢占方式,在分时系统中,只有采用抢占方式才有可能实现人—机交互。在实时系统中,抢占方式能满足实时任务的需求。
缺点:抢占方式复杂,系统开销大,需要遵循原则
①优先权原则
②短进程优先原则
③时间片原则
3.4 轮转调度算法
1 轮转法的基本原理
在轮转(RR)法中,系统将所有的就绪进程按FCFS策略(先来先服务)排成一个就绪队列。设置每隔一定时间(即一个时间片)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,令其执行。当该进程的时间片耗尽或运行完毕时,系统再将CPU分配给队首进程。**优点:**可以保证就绪队列中的所有进程在一个确定的时间段内,都能获得一个时间片的处理机时间。
2 进程切换机
① 若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,并为新进程启动一个新的时间片
②在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾
3 时间片大小的确定
确定策略:一个较为可取时间片大小略大于一次典型交互所需的时间,使大多数交互式进程能在一个时间片内完成。
3.5 优先调度算法
(1)优先级调度算法的类型
①非抢占式优先级调度算法 ②抢占式优先级调度算法(常用于实时性要求较高的系统)
(2)优先级的类型
① 静态优先级
静态优先级是在创建进程时确定的,在进程的整个运行期间保持不变。用0-255中的某一整数,成为优先数。
确定因素
- 进程类型:系统进程 高于 用户进程
- 进程对资源的需求:少 高于 多
- 用户要求:进程的紧迫程度
②动态优先级
在创建进程之初,先赋予其一个优先级,然后其值随进程的推进或等待时间的增加而改变,以便获得更好的调度性能。
(3)多队列调度算法
可以将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列可以采用不同的调度算法。一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可以设置不同的优先级。
- 调度机制
(1)设多个就绪队列:每个队列赋予不同的优先级,第一个最高,依次逐渐降低;时间片设置也不同,优先级越高,时间片越小
(2)每个队列都采用FCFS算法:当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则等待调度。
(3)按队列优先级调度:调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行
- 性能
如果规定第一个队列的时间片略大于多数人机交互所需之处理时间时,便能较好地满足各种类型用户的需要
(1)终端型用户:作业通常较小
(2)短批处理作业用户:对于稍长的作业,通常也只需在第二队列和第三队列各执行一个时间片即可完成
(3)长批处理作业用户:用户不必担心其作业长期得不到处理。
3.6 基于公平原则的调度算法
(1)保证调度算法
不是优先运行,而是明确的性能保证,该算法可以做到调度的公平性,针对进程而言,处理机时间分配的公平性。
(2)公平分享调度算法
针对用户而言,使所有用户能获得相同的处理机时间,或要求的时间比例。
4 实时调度
4.1 实现实时调度的基本条件
(1)提供必要的信息
- 就绪时间
- 开始截止时间和完成截止时间
- 处理时间
- 资源要求
- 优先级
(2)系统处理能力强
在实时系统中,若处理机的处理能力不够强,则有可能因处理机忙不过,而致使某些实时任务不能得到及时处理,从而导致发生难以预料的后果。
假定系统中有m个周期性的硬实时任务HRT,它们的处理时间可表示为Ci,周期时间表示为Pi,则在单处理机情况下,必须满足下面的限制条件系统才是可调度的
若是采用多处理机系统。假定系统中的处理机数为N,则应将上述的限制条件改为:
(3)采用抢占式调度机制
在含有HRT任务的实时系统中,广泛采用抢占机制,这样便可满足HRT任务对截止时间的要求。
(4)具有快速切换的机制
为保证硬实时任务能及时运行,在系统中还应具有快速切换机制,具备两方面的能力
- 对中断的快速响应能力:要求系统具有快速硬件中断机构,还应使禁止中断的时间间隔尽量短
- 快速的任务分派能力:使系统中的每个运行功能单位适当的小
4.2 实现实时调度算法
按照调度方式:①非抢占调度算法 ②抢占调度算法
实时任务性质:①硬实时调度算法 ②软实时调度算法
(1)非抢占式调度算法
- 非抢占式轮转调度算法:适用于要求不高的实时控制系统中
- 非抢占式优先调度算法:适用于有一定要求的实时控制系统中
(2)抢占式调度算法
- 基于时钟中断的抢占式优先级调度算法
在某实时任务到达后,如果该任务的优先级高于当前任务的优先级,这时并不立即抢占当前任务的处理机,而是等到时钟中断到来时,调度程序才剥夺当前任务的执行,将处理机分配给新到的高优先权任务。适用于大多数的实时控制系统中
- 立即抢占的优先级调度算法
求操作系统具有快速响应外部事件中断的能力。一旦出现外部中断,只要当前任务未处于临界区,便立即剥夺当前任务的执行,把处理机分配给请求中断的紧迫任务。适用于要求极高的实时控制系统中
4.3 最早截止时间优先EDF算法
根据任务的截止时间确定任务的优先级,截止时间越早,优先级越高
(1)非抢占式调度方式用于非周期实时任务
4.4 最低松弛度优先 LLF 算法
任务紧急程度愈高即松弛程度愈低,赋予该任务的优先级就愈高
松弛度 = 完成截止时间 – 还需要的执行时间 – 当前时间
松弛度是动态变化的,所以优先级也是动态的
4.5 优先级倒置
1 什么是优先级倒置
系统中存在着影响进程运行的资源而可能产生“优先级倒置”的现象,即高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞
2 怎么解决优先级倒置
①规定进程进入临界区后,该进程占用的处理机不允许被抢占
②动态优先级:当高优先级进程要进入临界区时,去使用临界资源R时,如果已有一个低优先级进程正在使用该资源。此时高优先进程被阻塞,另一方面低优先级进程继承高优先进程的优先级,直到低优先进程退出临界区
5 死锁概述
5.1 资源问题
(1)可重用性资源和消耗性资源
-
可重用性资源:是一种可供用户重复使用多次的资源。每一个可重用性资源只能分配给一个进程使用,不允许多个进程共享
使用顺序:请求资源—使用资源—释放资源
-
可消耗性资源:在进程运行期间,由进程动态地创建和消耗。资源的单元数目在进程运行期间可以不断变化的。进程可以请求若干个可消耗性资源单元。资源数目可为零。
(2)可抢占性资源和不可抢占性资源
- 可抢占性资源:可抢占性资源不会引起死锁。CPU和主存均属于可抢占性资源
- 不可抢占性资源:一旦被分配给进程,只能在进程用完后自行释放。会引起死锁,磁带机、打印机等属于不可抢占性资源
5.2 死锁
(1)竞争不可抢占性资源引起死锁
两进程分别保持一个临界资源,而又分别因请求对方所保持的资源被阻塞
(2)竞争可消耗性资源引起死锁
一进程需接受到对方发送的消息a后才能发送消息b,而另一进程需接受到对方发送的消息b后才能发送消息a
(3)进程推进顺序不当引起死锁
对资源进行申请和释放的顺序是否合法,也会影响是否死锁。
5.3 死锁的定义、必要条件和处理方法
(1)死锁的定义
如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的(Deadlock)
(2)产生死锁的必要条件
- 互斥条件:即在一段时间内某资源只由一个进程占用。如果其它进程请求该资源则只能等待
- 请求和保持条件:指进程已经保持了至少一个资源,又请求新资源而被阻塞,但又对自己已获得的其它资源保持不放
- 不可抢占条件:已获得资源不能被抢占,只能进程自己释放
- 循环等待条件:必然存在一个进程—资源的循环链
(3)处理死锁的方法
- 预防死锁:即破坏产生死锁的四个必要条件中的一个或几个条件。较易实现,已被广泛使用
- 避免死锁:在资源的动态分配过程中,用某种方法去防止系统进入不安全状态
- 检测死锁:允许发生死锁,但可通过系统所设置的检测机构,及时地检测出死锁的发生,然后采取适当措施
- 解除死锁:撤消或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程
6 预防死锁
6.1 破坏“请求和保持”条件
(1)第一种协议
规定所有进程在开始运行之前,都必须一次性地申请其在整个运行过程所需的全部资源。在整个运行期间便不会再提出资源要求,从而破坏了请求条件。在分配资源时,只要有一种资源不能满足某进程的要求,即使其它所需的各资源都空闲,也不分配给该进程,即在该进程的等待期间,它并未占有任何资源,因而也破坏了保持条件。
(2)第二种协议
允许进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再去请求新的所需资源。
6.2 破坏”不可抢占条件”
当一个已经保持了某些资源的进程,再提出新的资源请求而不能立即得到满足时,必须释放它已经保持了的所有资源,待以后需要时再重新申请。已占有的资源在运行过程中会被释放,可认为是被抢占,而从破坏”不可抢占条件”。
6.3 破坏”循环等待”条件
系统将所有类型资源进行线性排队,并赋予不同的序号。规定每个进程必须按序号递增的顺序请求资源。假如某进程已请求到一些序号较高的资源,后来它又想请求一个序号低的资源时,它必须先释放所有具有相同和更高序号的资源后,才能申请序号低的资源。在采用这种策略后不可能再出现环路,因而破坏了“循环等待”条件。
7 避免死锁
7.1 系统安全状态
系统在进行资源分配之前,应先计算此次资源分配的安全性。所谓安全状态,是指系统能按某种进程顺序(P1,P2,…,Pn)每个进程 Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。此时称(P1,P2,…,Pn)为安全序列。
避免死锁的实质:系统在进行资源分配时,如何使系统不进入不安全状态。
7.2 利用银行家算法避免死锁
思路:每一个新进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。
(1)数据结构—四种
-
可利用资源向量 Available。这是一个含有 m 个元素的数组,其中的每一个元素代表一类可利用的资源数目。其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果 Available[j]=K,则表示系统中现有 R j类资源K 个。
-
最大需求矩阵 Max。这是一个 n×m 的矩阵,它定义了系统中 n 个进程中的每一个进程对 m 类资源的最大需求。如果 Max[i,j]=K,则表示进程 i 需要 Rj 类资源的最大数目为 K。
-
分配矩阵 Allocation。n×m 的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果 Allocation[i,j]=K,则表示进程 i 当前已分得 R j类资源的数目为 K。
-
需求矩阵 Need。n×m 的矩阵,用以表示每一个进程尚需的各类资源数。如果 Need[i,j]=K,则表示进程 i 还需要 R j类资源 K 个,方能完成其任务
总结:Need[i, j]=Max[i, j]-Allocation[i, j]
(2) 银行家算法
设 Request[i] 是进程 P i 的请求向量,如果 Request[i][j]=K,表示进程 P i需要 K 个 R j类型的资源。当 P i发出资源请求后,系统按下述步骤进行检查
-
如果 Request[i][j]≤Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值
-
如果 Request[i][j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi 须等待
-
系统试探着把资源分配给进程 P i,并修改下面数据结构中的数值
Available[j] = Available[j]-Request[i][j];
Allocation[i,j] = Allocation[i,j]+Request[i][j];
Need[i,j] = Need[i,j]-Request[i][j]; -
系统执行安全性算法:检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程 Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程 Pi等待。
(3) 安全性算法
- 设置两个向量
①工作向量 Work:它表示系统可提供给进程继续运行所需的各类资源数目,它含有 m个元素,在执行安全算法开始时,Work=Available
② Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false;当有足够资源分配给进程时,再令 Finish[i]=true
- 从进程集合中找到一个能满足下述条件的进程
①Finish[i]=false
② Need[i,j]≤Work[j]
③若找到,执行步骤(3),否则,执行步骤(4)
- 当进程 Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源
Work[j] = Work[j]+Allocation[i,j];
Finish[i] = true;
go to step 2;
- 如果所有进程的 Finish[i]=true 都满足,则表示系统处于安全状态;否则,系统处于不安全状态
8 死锁的检测与解除
8.1 死锁的检测
①保存有关资源的请求和分配信息
②提供一种算法,以利用这些信息来检测系统是否已进入死锁状态
(1) 资源分配图
用圆圈代表一个进程,用方框代表一类资源
(2)死锁定理
利用把资源分配图加以简化的方法,来检测系统是否为死锁状态
-
在资源分配图中,找出一个既不阻塞又非独立的进程结点 Pi。消去pi所求的请求边和分配边,使之成为孤立的结点。表示其运行完毕。依次进行
-
在进行一系列的简化后,若能消去图中所有的边,使所有的进程结点都成为孤立结点,则称该图是可完全简化的;若不能通过任何过程使该图完全简化,则称该图是不可完全简化的
S 为死锁状态的充分条件是:当且仅当 S 状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理
8.2 死锁的解除
(1) 抢占(死锁进程所需的)资源
(2) 终止(死锁)进程
①终止进程
- 终止所有死锁进程
- 逐个终止进程,直至有足够的资源,以打破循环等待
选择终止进程的策略最主要的依据是,为死锁解除所付出的”代价最小“
② 付出代价最小的死锁解除算法
一种付出代价最小的死锁解除算法是类似于动态规划地去选择被终止进程
(1) 资源分配图
用圆圈代表一个进程,用方框代表一类资源
(2)死锁定理
利用把资源分配图加以简化的方法,来检测系统是否为死锁状态
-
在资源分配图中,找出一个既不阻塞又非独立的进程结点 Pi。消去pi所求的请求边和分配边,使之成为孤立的结点。表示其运行完毕。依次进行
-
在进行一系列的简化后,若能消去图中所有的边,使所有的进程结点都成为孤立结点,则称该图是可完全简化的;若不能通过任何过程使该图完全简化,则称该图是不可完全简化的
S 为死锁状态的充分条件是:当且仅当 S 状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理
8.2 死锁的解除
(1) 抢占(死锁进程所需的)资源
(2) 终止(死锁)进程
①终止进程
- 终止所有死锁进程
- 逐个终止进程,直至有足够的资源,以打破循环等待
选择终止进程的策略最主要的依据是,为死锁解除所付出的”代价最小“
② 付出代价最小的死锁解除算法
一种付出代价最小的死锁解除算法是类似于动态规划地去选择被终止进程
还有一个比较有效的方法是类似于贪心地去选择被终止进程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16161.html