进程死锁
来源:互联网 发布:建站如何买域名和空间 编辑:程序博客网 时间:2024/06/07 01:54
一. 死锁定义
所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁的发生必须具备以下四个必要条件:
(1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
(2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
(3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
(4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2, …… ,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,…… ,Pn正在等待已被P0占用的资源。
简单而言,就是形成一个闭环等待:
检测闭环也是一种检测死锁的方法,只要检测到闭环等待,就说明产生了死锁。
二. 解决死锁
解决死锁的方式主要有:
1. 预防死锁,事先预防的方法,通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。
2. 检测、解除死锁,这种方法并不须事先采取限制性措施。及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。一般就是闭环检测。
3. 避免死锁。与预防死锁一样,该方法同样是属于事先预防的策略。在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。经典的方法就是银行家算法。
三. 银行家算法
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
银行家算法实际上就是找到一个安全序列,来避免死锁的产生。
举个例子来说明,就很清楚了:
有3个进程{P1, P2, P3},两类资源{R1, R2},各自的总数量(S)为6, 3。
T0时刻各进程资源分配情况如下:
上表的关系为:
N=C-Ac
A=S-Ac
现在要找到一个安全序列,来避免死锁的产生。
这个例子比较简单,可以看出P2, P1, P3是一个安全序列。
- 执行P2,可用资源(2,1)>N(0,1),结束后,可用资源变为(2,2);
- 执行P1,可用资源(2,2)>N(1,1),结束后,可用资源变为(3,3);
- 执行P3,可用资源(3,3)>N(3,1)。
所以P2,P1,P3在T0时刻是一个安全序列。
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程死锁
- 进程 进程通信 死锁
- Sql 死锁 杀死死锁进程
- SQLServer2008 数据库备份还原
- android datePicker属性
- leetcode 479. Largest Palindrome Product最大的回文乘积
- PHP——一维数组遍历
- Oracle用户管理系列②--创建用户、权限授予,权限传递,权限授予调用方式,与权限收回全过程
- 进程死锁
- HDU 4734 数位DP 小水
- OC中导航条与UIScrollView冲突解决方法
- CentOS修改主机名
- 有两列数,Matlab让第二列数随着第一列的升序排列(sortrows)
- 学习多线程你应该知道这些
- 【LeetCode】C# 83、Remove Duplicates from Sorted List
- CF 440 div2 B.Maximum of Maximums of Minimums
- 大家好!给大家介绍一下,这是我们的供应链风险评估解决方案@东华国际