操作系统—死锁
死锁的定义
由于多个进程共享资源而引起的进程不能向前推进的僵死状态成为死锁。
进程访问资源是通过执行程序实现的。一般来说,进程按照申请资源、访问资源、释放资源的顺序使用资源。
产生死锁的原因
竞争共享资源且分配资源的顺序不当造成的。
必要条件:
①互斥
②请求和保持
③不剥夺
④环路等待
解决死锁的对策
1、预防死锁
通过保证至少其中一个条件不成立来达到预防发生死锁的目的。(在操作系统中无法预知进程是否一定不访问临界资源,所以通常不能采用摒弃互斥条件来预防死锁的发生)
方法:
①摒弃请求和保持条件:要求所有的进程执行前要一次性地申请在整个运行过程中所需要的全部资源,只要有一个资源申请不成功,其它所有资源也不分配给该进程,并阻塞该进程。
②摒弃不剥夺条件:一个已保持了某些资源的进程,当它再提出新的资源要求而不能立即得到满足时,必须释放它已经保持的所有资源。缺点:实现复杂而且代价高。
③摒弃环路等待条件:指进程必须按规定的顺序申请资源。对所有不同类型的资源排序,要求每个进程按规定的顺序申请资源。
缺点:
1)限制了新设备的增加。
2)系统为资源分配的序号与进程实际使用资源的顺序不同,造成资源浪费。
3)给用户编程带来了麻烦。
2、避免死锁
把系统的资源分配状态分为安全状态和不安全状态,只要资源分配使系统资源分配状态处于安全状态,死锁就不会发生。
在避免死锁的方法中,允许进程动态地申请资源。系统在资源分配之前,先计算资源分配的安全性;若本次资源发呢配不会导致系统进入不安全状态,便将资源分配给进程;否则拒绝进程的资源请求,将进程阻塞起来。
避免进程死锁的实质在于使系统处于安全状态。
比如:银行家算法
3、检测并解除死锁
操作系统可以不采取事先预防和避免的方法来解决死锁问题,而是检测是否有死锁发生。如果检测到系统中有死锁的进程,则解除死锁。
检测:
要考虑的问题:
①何时调用检测算法?
②如何检测死锁?
1)何时调用检测算法
两个因素:一是死锁可能发生的频率;二是当死锁发生时受影响的进程数量。
2)资源分配图与死锁定理
死锁定理用于检测系统所处的资源分配状态是否为死锁状态。
死锁定理为:资源分配状态为死锁状态的充分条件是当且仅当S状态的资源分配图是不可完全简化的。
在进行一系列的简化后,若能消去图中所有的边,使所有的进程都成为孤立节点,则称该图是可完全简化的;否则称该图是不可完全简化的。
解除
检测到系统出现死锁后,可由系统管理员人工处理死锁,也可以让系统自动解除死锁。
解除死锁途径:
一是终止处于死锁状态的进程;
二是抢占死锁进程占有的资源。
1)进程终止
①终止所有死锁进程
②一次只终止一个处于死锁的进程,直到死锁解除。
2)资源抢占
逐步从进程中抢占资源给其它进程使用,直到死锁环被打破为止。
要考虑的问题:如何保证不会总是从同一个进程抢占资源而使该进程处于饥饿状态?
解决方案:限制对同一进程进行资源抢占的次数
方法:在影响代价的因素中加上回滚次数。
回滚:如果从一个进程哪里抢占一个资源,那么该进程因缺少资源不能从抢占点正常执行,必须讲进程回滚到某个安全状态,以便该状态重启进程。最简单的方法是完全回滚,就i时终止进程并重启进程。
饥饿:进程因长时间不能获得所需要的资源而无限等待的状态。比如系统采取基于静态优先权的进程调度算法,当系统不断有高优先权进程到来时,优先权低的进程就可能长时间得不到CPU,也就不能运行,这种状态被称为饥饿状态。
还没有评论,来说两句吧...