处理机调度与死锁

处理机调度与死锁

在这里插入图片描述

1. 处理机调度,作业调度,进程调度之间的关系:
 用户向操作系统中输入多个作业,一个作业又是多个进程合作完成的,而一个进程的完成需要多个处理机的参与。而在多道程序系统当中,处理机的个数小于又进程的个数,所以就无法对所有进程进行并行执行,此时就要有一定的处理机调度算法,为在就绪队列中的进程分配处理机。待执行的进程和作业都放在就绪队列当中,选择多少个和选择那些个都需要对应的调度算法来调度。
2. 处理机调度的层次:
 选择哪些后备队列中的作业调入内存执行就称为高级调度。为一个作业中的哪些进程分配处理机就称为低级调度。把内存中暂停执行的进程调出到外存中,把其他的进程调入内存中就被称为中级调度。
3. 处理机调度算法的目标:
 资源利用率,公平性,平衡性,策略强制执行

 不同系统采取的处理机调度算法不同,因为不同系统的侧重点各不相同。批处理系统强调的是平均周转时间短,吞吐量高,处理机利用率高,所以需要作业调度。分时系统强调的是响应时间块,均衡性,数据和命令都存放在内存中了,就不需要作业调度了。实时系统强调的是截止时间的保证和可预测性,不需要作业调度。

作业调度

在这里插入图片描述

 所有的作业都放在外存中的后备队列当中,被作业调度算法调入到内存中的就绪队列中等待执行。在调入过程中,我们要解决的问题有两个,分别为:(1).调入多少作业。(2).调入哪些队列。
1. 调入多少作业
 如果调入的作业过少,会导致CPU的利用率和吞吐量过低,而调入过多的作业会导致平均周转时间边长,影响用户体验。
2. 调入哪些队列
 调入哪些队列,就要想到作业的优先级问题,可以从三个方面考虑:(1)有优先级(2)无优先级(3)外部赋予优先级。
(1)无优先级
 无优先级调度算法有两种,分别是先来先服务调度算法(FCFS)和短作业优先调度算法(SJF),先来先优先调度算法是根据作业的先来后到进行调度的,把队列中等待时间最长的作业调入内存,而不考虑作业的长短。先来先服务调度算法一般不单独使用,会把作业分为多个优先级队列结合使用。短作业优先调度算法不考虑作业的先来后到,按照作业的长短排好序,依次把最短的调入内存当中。短作业优先调度算法存在明显的缺点,在调度之前就要知道作业的长短,而且对长作业不利,无法与用户交互。
(2)有优先级
 考虑到有优先级的调度算法为高响应比优先调度算法。用户提前给每个作业规定一个优先级。作业执行时间分为作业等待时间和作业服务时间,FCFS和SJF都是只考虑了单方面的因素,没有把两个因素结合起来考虑。高响应比优先调度算法把两者有机的结合起来。

优先比=(要求服务时间+等待时间)/要求服务时间

 可以看到每个作业的优先比是在变化的,都会随着等待时间的增大而增大,这样优先级就会变大。就必然会被调度算法调入内存。
(3)外部赋予优先级
优先级调度算法,由外部根据紧迫程度赋予作业优先级,再根据优先级调入内存。

进程调度

在这里插入图片描述

 当内存中正在执行的进程的时间片结束,就要考虑到从进程的队列中调度新的进程来执行。在调度好新的进程之前要把上一个进程执行后的现场进行保存。因为新调度的进程不一定就是完成对应作业的下一个进程。一个作业的完成需要多个进程的交流与合作,前一个进程执行完后会把处理结果交给对应的下一个进程。但是由于进程的执行时间和大小不同,为了提高CPU的执行效率和吞吐量,就会采用一定的进程调度算法,从而导致要对执行完进程的现场进行保存。所以进程调度有三个功能。
1. 进程调度的功能:
(1)保存处理机的现场信息
(2)按照某种调度算法选取进程
(3)把处理机分配给进程(按照一定的处理机调度算法)
2. 进程的调度机制(实现的过程)
(1)排队器(就绪队列)
(2)分派器(依据一定的调度算法把就绪队列中的进程选出来,分配处理机执行)
(3)上下文切换机制(用来保存执行完进程的现场和把新的进程装入对应寄存器中,以便运行)

 在经过调度算法后选择执行的方式称为非抢占方式,为了实现更好的交互方式,能够随时终端进程的执行,而不是非要等到一个进程执行完才调度。

3. 进程的调度方式
(1)非抢占方式
 只要处理机也就是CPU分配给了进程,就必须使其执行完,这种方式的调度情况只有两种:1.进程已经执行完毕 2.因为有进程提出I/O操作而暂停执行 3.某原语操作。
(2)抢占方式
 可以随时随地的暂停一个进程的执行把其处理机分配给其他的进程处理。
 抢占的原则:
 - 优先权原则
 - 短进程优先原则
 - 时间片原则(给该进程分配的时间片结束了)
4. 优先级的分类
 优先级分为两类,分别为静态优先级和动态优先级,静态优先级是在进程一开始就为它们规定一个不变的优先级,,而动态优先级会随着进程的等待时间改变而改变,是动态的。
轮转调度算法
 首先把进程根据FCFS策略进行排队成为一个就绪队列,之后设置一个时间间隔t,时间每经过一个t就会中断一次,这样可以使得每个进程得到执行的时间相同,保证一定的公平性,但是时间间隔的设置会带来一些问题,如果时间间隔小的话,就会频繁的执行进程调度和上下文切换,增加了系统的开销,如果时间间隔太大,又会使得多个进程在一段时间内完成,与FCFS算法无异。当在所处的时间间隔内的进程完成后,就会激活调度算法,该完成的进程就会从就绪队列中删除。
优先级调度算法
 一开始就为每个进程规定一个优先级,会把处理机分配给优先级高的进程优先使用,非抢占式优先级调度算法会让就绪队列中优先级最高的进程执行,当这个进程在处理过程中出现了其他比它优先级还高的进程并不会抢占终端它的执行,而会在它执行完之后来执行。抢占式优先级调度算法,如果在一个进程执行的过程中出现了比它优先级还高的进程,就会中断它的执行反过来执行优先级高的进程。
多队列调度算法
 为了满足多个用户对进程调度策略的要求,该算法采用了多个进程就绪队列,每个就绪队列采用的优先级调度算法各不相同。
多级反馈队列调度算法
 多个就绪队列连接在一起,采用相同的优先级调度算法(FCFS),但是每个就绪队列的优先级不同,就绪队列所分到的时间片长短各不相同,优先级越高的就绪队列分到的时间片越短,第一个就绪队列的优先级最高,如果在第一个就绪队列中的进程在对应时间片内没有执行结束,就会转入第二队列的末尾等待调度,如果在第二队列所对应的时间片内还没有完成的话,就会转入第三就绪队列的末尾,以此类推。这样的调度算法是目前公认较好的一种优先级调度算法。
保证调度算法
 为每一个进程都分配相同的处理机时间。
公平分配调度算法
在这里插入图片描述

##实时调度
 在实时操作系统中,设计优先级调度算法首要考虑的就是进程的截至时间,松弛度(处理时间加上截止时间)。同样,实时调度算法也分为抢占式和非抢占式调度算法。非抢占式调度算法又分为非抢占式轮转调度算法和非抢占式优先调度算法,非抢占式优先调度算法和进程调度中非抢占式优先调度算法相同。 非抢占式轮转调度算法类比进程排序中的轮转调度算法。抢占式调度算法分为基于时钟中断的抢占式优先级调度算法和立即抢占式优先级调度算法,基于时钟中断的抢占式优先级调度算法是如果有新的实时任务的优先级高于当前正在执行的实时任务,只有当中断时钟到达时才会发生抢占。立即抢占式优先级调度算法是只要当前实时任务没有进入临界区,那么就可以中断转到优先级高的实时任务中。
最早截至时间优先EDF算法
 该方法是基于截止时间来进行调度算法的,截止时间越早,优先级越高。同样,该算法分为两类非抢占和抢占,非抢占式是按照优先级高到低(截止日期从早到迟)依次执行。抢占式是根据截止日期动态中断。
最低松弛度优先LLF算法
 松弛度的概念:任务有他的开始时间,截止时间,和执行时间,截止时间减去开始时间再减去执行时间就称为该任务的松弛度,该调度算法按照松弛度的大小来确定优先级,松弛度越小的优先级越高。

 上述的优先级调度算法基本可以实现优先级高的任务先执行,优先级低的后执行。但是,在OS中仍然存在优先级高的进程被优先级低的进程阻塞的现象,这就是优先级倒置。假设有三个进程P1,P2,P3,P1和P3共享一个临界资源Q,三个进程的优先级由大到小,开始,P3开始执行,进入临界区后,P2由于比P3的优先级高,就会抢占P3的处理机执行,但是P1的优先级又比P2高,又会占用P2的处理机执行,又因为P1和P3共享一个临界资源Q,P3在进入临界区后占用Q使得P1无法执行,造成了优先级倒置的现象(实际上就是P1被P3阻塞了,又被P2的插入延长了阻塞时间)。
 处理方法:(1)当P3进入临界区之后,P3的处理机就不能被其他的进程占用,当P3执行完成后,再执行优先级高的进程(2)为了减少阻塞的时间,就规定,如果一个高优先级的进程因为临界资源的原因被低进程阻塞了,那么该低进程就会继承高优先级进程的优先级继续执行,这样就防止了有其他中间优先级进程的插入导致阻塞时间延长。

死锁

 如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发事件,那么该组进程就是死锁的。产生死锁的最重要问题就是资源问题,要分清资源的种类。
资源的分类:
(1)可重用性资源和消耗性资源
 可重用性资源就是可以多次使用的资源,在计算机中的寄存器等,该类资源不允许多个进程同时使用,只允许一个进程使用,而且严格遵循申请,使用,释放的步骤。
 消耗性资源类似于生产者消费者问题中生产者所生产出来的资源,进程之间的信息就是可消耗性资源。
(2)可抢占性资源和不可抢占性资源
 可抢占性资源是指一个资源在被占用时仍然可以被其他进程占用,例如处理机等,非抢占性资源不能被其他进程抢占,例如打印机等。

 弄清资源的分类就可以分清死锁产生的三个原因,分别为:
(1)竞争不可抢占性资源引起死锁
 多个进程执行所需要的资源存在重合,调用资源的顺序不同,当多个进程同时执行的时候,就会对资源产生争用,导致产生死锁的现象。
(2)竞争可消耗性资源引起死锁
 可消耗性资源必须先生产后消费,不能先消费,后生产。 例如进程通信时引起的死锁。
(3)进程顺序不当引起死锁(竞争资源)
在这里插入图片描述

死锁产生的必要条件:
(1)互斥条件,就是一个资源只能被一个进程所占用,如果有其他的进程申请使用这个资源,这个资源会拒绝被占用。(强调资源)
(2)请求和保持条件,该进程在执行的时候需要多个资源,但是至少进程内部要保持一个资源的占用,同时申请一个其他进程正在使用的资源,造成阻塞,同时自身保持的资源不会被释放。
(3)不可抢占条件,就是在该进程使用该资源的时候,其他的进程不可使用该资源,只用进程自己释放资源。类似于竞争不可抢占性资源引起的死锁。(强调进程)
(4)循环等待条件,多个进程保持自己所占有的资源,同时又申请其他人所占有的资源,每个进程都是一个循环等待的过程。

根据死锁产生的必要条件,为了处理死锁,通过四个方面来处理死锁,分别为预防死锁,避免死锁,检测死锁,解除死锁。
预防死锁
 预防死锁产生就是破坏死锁产生的四个必要条件。死锁大部分产生在非共享设备中,所以非共享设备的必要条件就是互斥条件,内部资源在占用的时候拒绝其他进程的占用,因此,我们只能破坏产生死锁必要条件的后面三个。
(1)破坏“请求和保持”条件,分为破坏“请求”条件和“保持”条件,有两种方法来破坏这两种条件,第一种方法:在系统为进程分配资源的时候,如果可分配的资源足够的话,一次性把进程所需要的资源全部分配给该进程,这样就破坏了“请求”的条件,如果系统内可分配的资源不够的话,一个也不分配给该进程,这样就破坏了“保持”的条件。第二种方法:一开始只为该进程分配初始所需要的资源,把剩余需要的资源分给其他的进程,当其他进程使用完释放该资源后,该进程就使用该资源完成之后和操作,这样就破坏了“保持”条件。这种方法相对与第一种方法更加实用。
(2)破坏“不可抢占”条件,代表着正在执行的进程所占有的资源将会被其他的进程所占用。会出现暂停释放的情况。
(3)破坏“循环等待”条件,
避免死锁
 前面的破坏“请求和保持”条件的方法的第二种方法就是采用了动态分配资源的方法,避免死锁的方法也类似于动态分配,只不过多了一个安全序列,即把可分配的资源按照这个安全序列来分配资源。如果系统按照这个安全序列的顺序来执行就会处于一种名为安全状态的状态,处于这样状态的系统不会进入死锁状态,如果系统不按照这个安全序列 来执行分配资源的话,系统就会进入不安全状态,就会发生死锁。
过程:系统为多个进程分配该进程初步的必要资源后,还存在一部分可分配资源,但是每个进程只分到了完成该进程所需资源的一部分,要想完成还得继续申请其他资源,这时,系统就会计算把剩余未分配的资源分配给哪一个进程可以执行完成,执行完成后可分配的资源就等于一开始剩余的分配资源数加上系统开始为该进程分配的资源数,再把现有可分配的资源分配给其它申请资源的进程。这样每个进程的执行就会有先后顺序,这个先后顺序就称为安全序列。
实际上,避免死锁就是使计算机进入不安全的状态

计算安全序列的算法:
 银行家算法(这边转载其他博主的介绍)
银行家算法
死锁的检测和解除
 如何检测系统正处于死锁状态,可以通过判断资源分配图中是不是可完全化简的来判定是否有死锁。
资源分配图:
 图由结点和边构成,结点是由进程和资源构成的,一个进程为一个结点,一个资源类为一个结点,一个资源类由多个同类型的资源构成,当一条边由资源结点指向进程结点,代表把资源分配给该进程;当一条边由进程结点指向资源结点时,代表进程申请该资源。把资源分配图化简之后,进程在执行之后释放所有的资源,如果图中所有进程都为独立的点,那么就代表这个资源分配图为完全简化,就不会发生死锁。
 利用资源分配图或者死锁检测算法判断出系统出现死锁后,如何解除死锁通常采取的是两种方法,死锁的出现,无疑是从两个方面,一方面是给全死锁所申请的资源,让死锁解除,另一个方面就是拿走死锁所占有的资源,让死锁的进程直接终止,释放被死锁的资源,直到打破循环,从死锁中解除出来。
 第一种方法简单明了,但是系统可分配的资源往往不支持。第二种直接终止进程的方法有两个分别为:
(1)终止所有的死锁进程,但是同时付出的代价会很多,有的进程快要结束的时候发生死锁,如果全部解除的话会有巨大损失。
(2)逐个终止进程,按照一定的顺序来终止进程,终止的进程所占有的资源分配给其他死锁的进程,这个终结顺序是按照进程的优先级大小,代价大小等来判断的。
死锁解除算法:
 从死锁状态中先 解除一个死锁的进程,再把解除死锁所花费的代价放入到一个队列中,对应解除死锁后的状态放入一个状态队列,接着把解除第二个死锁的进程所花费的代价放入队列,对应解除死锁后的状态放入一个状态队列,类似的对其他进程这样操作,最后就会得到一个代价的队列和状态队列。当在死锁状态时,从代价队列中选择一个最小的对应的进程,解除这个进程,如果状态依然是死锁状态,再解除代价队列中第二小对应的进程。直到从死锁状态解除。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值