死锁
2016-04-08 10:18
211 查看
一、死锁的概念
死锁是指两个或两个以上的进程在执行过程中,竞争意资源或者由于彼此通信而造成一种阻塞,如果没有外力作用,它们都将无法推进,此时就称系统处于死锁或产生了死锁。二、死锁产生的原因
1、系统的资源不足
2、进程运行推进顺序不合适
3、资源分配策略不当
关于这三点,可以这样理解如果系统资源充足,那么进程的所有请求都会得到满足;进程调度(不同进程运行速度、所需资源等都不相同)和资源分配(这里主要指临界资源),不合适就会使进程竞争临界资源而陷入死锁状态三、死锁产生的四个必要条件
1、互斥条件
指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只能被一个进程使用(即临界资源),如果此时还有其他进程请求该资源,则请求者只能等待直到占有资源的进程释放;2、请求与保持条件
指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不释放;3、不可剥夺条件
指进程已获得的资源,在进程使用完之前,不能被剥夺,只能在使用完成时由进程本身释放;4、循环等待条件
指死锁发生时,必然存在一个进程的资源环链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。四、死锁处理方法
1、死锁的预防
防止死锁的发生只需要破坏死锁产生的四个必要条件中任意一个即可(1)破坏互斥条件
如果允许系统资源都能共享使用,则系统不会进入死锁状态,但有些资源不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件来预防死锁的方法不太可行,而且有的场合应该保护这种互斥性;
(2)破坏请求与保持条件
釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。
(3)破坏不可剥夺条件
当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。
(4)破坏循环等待条件
为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使甩资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。
2、死锁的避免
死锁的避免同样属于事先预防的策略,但并不是采用破坏死锁产生的四个必要条件,而是在资源动态分配过程中防止系统进入不安全的状态,从而达到避免死锁的发生1)系统安全状态
所谓安全状态,是指系统能按某种进程推进顺序( P1, P2, ..., Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称 P1, P2, ..., Pn 为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。注意并非不安全状态都是死锁状态,但当系统进入不安全状态后便有可能进入死锁状态;反之,只要系统进入安全状态,便可避免进入死锁状态
2)银行家算法
银行家算法是最著名的死锁避免算法。它提出的思想是:把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。3、死锁的检测和解除
先检测,然后解除死锁:死锁的检测和解除并不事先采取任何限制性措施,也不必检查系统是否已进入不安全状态,该方法允许系统在运行过程中发生死锁,但可通过系统设置的检测机构及时地检测出死锁的发生,并精确的确定与死锁有关的进程和资源。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来,常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。常用的检测方法包括:(1)定时检测;(2)效率低时检测;(3)进程等待时检测等
常用的解除方法包括:(1)撤销陷于死锁的全部进程;逐个撤销陷于死锁的进程,直到死锁不存在;(2)从陷于死锁的进程中逐个强迫放弃所占用资源,直到死锁消失;(3)从另外的进程那里强行剥夺足够数量的资源分配给处于死锁的进程,以解除死锁状态
相关文章推荐
- Java 通过httpClient Post方式提交xml,并从服务端返回数据
- NSString 和NSData 转换
- 高精度数据权限定义和实现
- iOS开发点滴 - 关闭键盘
- Asp.net 导出Excel
- 数据库主体在该数据库中拥有架构,无法删除解决方法(转)
- LeetCode || Palindrome Number
- [cocos2dx笔记016]cocos2dx 3.2 的UserDefault
- php将字符首字母大小写转换
- Jsoup +JavaScript 扒取网站模板 bootstarp
- Android Studio 使用技巧
- Linux iconv --字符编码转换工具
- Spring 后台向前端传送json数据中文乱码
- JS中函数参数的传递
- XTU1238:Segment Tree(线段树区间更新)
- 蓝牙时钟
- 曾经经历的面试题汇总(2)
- json
- [BIM]STEP标准和EXPRESS语言
- apache thrift 和 apache jersey 记录