分析linux系统中死锁处理策略
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析linux系统中死锁处理策略
摘要:介绍了死锁的概念、预防、必要条件及linux处理死锁的策略,并对银行家算法进行分析。
关键字:死锁,linux,银行家算法
1.死锁的概念
死锁(Deadlock)是若干进程因系统资源有限且操作不当而造成的带有全局危害性的现象。我们考虑下面这个例子:设系统中只有一台打印机和一台读卡机,它们被进程A和进程B共用。这两台物理设备的特性决定了对它们的使用方式必须是顺序的,即一个进程用完了,另一个进程才能用。进程A和B各自对资源的申请使用情况如下:
A:申请读卡机 B:申请打印机
申请打印机申请读卡机
使用读卡机使用打印机
使用打印机使用读卡机
释放读卡机释放打印机
释放打印机释放读卡机
由于进程并行工作,就可能出现这样的执行序列:
A:申请读卡机
B:申请打印机
A:申请打印机
B:申请读卡机
所谓死锁就是指在一个进程集合中的每个进程,都在等待仅由该集合中的另一进程才能引发的事件,而无限期地僵持下去的局面。
2.死锁的四个必要条件
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相邻进程正占用的资源。
3.死锁的预防
1. 破坏互斥的条件
非共享的资源必定具有互斥的条件。例如,一台打印机不能同时被多个进程所共享。
2. 破坏占有且等待的条件
为了使系统中从来不会出现占有且等待的情况,我们要保证无论在什么时候,一个进程都可申请到它没有占有的任何其他资源。
两种策略也有如下缺点:
(1)在许多情况下,一个进程在执行之前不可能知道它所需要的全部资源。
(2)资源利用率低。
(3)降低了进程的并发性。
(4)可能出现有的进程总得不到运行的状况(“饥饿”)。
3. 破坏非抢占的条件
产生死锁的第三个必要条件是对已分配资源的非抢占式分配。为破坏这个条件,可采用下述隐式抢占方式:如果一个进程占有某些资源,它还要申请另外的资源,而后者又被别的进程所占有,不能立即分给它,该进程就一定处于等待状态。
4. 破坏循环等待的条件
为了使循环等待的条件从不出现,一种方法是实行资源有序分配策略,即把全部资源事先按类编号,然后依序分配,使得进程在申请、占用资源时不会构成环路,从而不会产生死锁。
4.处理死锁的策略
1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。
2.检测死锁并且恢复。
3.仔细地对资源进行动态分配,以避免死锁。
4.通过破除死锁四个必要条件之一,来防止死锁产生。
检测死锁的代价很大。所有Linux对死锁不作任何处理,这是因为基于成本的考虑选择鸵鸟算法。
5.银行家算法
众所周知,避免死锁的著名算法叫做“银行家算法(Banker’s
Algorithm)”。其设计思想是当用户申请一组资源时,系统必须确定:如果把这些资源分出去,系统是否还处于安全状态。若是,就可以分出这些资源;否则,该申请暂不予满足。
实现银行家算法要有若干数据结构,用它们来表示资源分配系统的状态。令n表示系统中进程的数目, m表示资源分类数。还需要下列数据结构:
(1) Available是一个长度为m的向量,它表示每类资源可用的数量。
(2) Max是一个n×m矩阵,它表示每个进程对资源的最大需求。
(3) Allocation是一个n×m矩阵,它表示当前分给每个进程的资源数目。
(4) Need是一个n×m矩阵,它表示每个进程还缺少多少资源。
1. 资源分配算法
令Requesti表示进程pi的申请向量。若 Requesti[j]=k,表示进程pi 需要申请k个rj类资源。当进程pi申请资源时,就执行下列动作:(1)若Requesti>Needi,表示出错,进程对资源的申请量大于它说明的最大值。
(2)如果Requesti>Available,则pi等待。
(3)系统假设把申请的资源分给进程pi,则相应数据结构被修改成如下状态:
Available: =Available-Requesti;
Allocationi: =Allocationi+Requesti;
Needi: =Needi-Requesti。
(4)系统执行安全性算法,查看此时系统是否处于安全状态。
2. 安全性算法
为了找出一个系统是在安全状态还是在不安全状态下,可采用下述算法:
(1)令Work和Finish分别表示长度为m和n的向量,最初置Work:
=Available, Finish[i]:=false, i=1, 2, …, n。
(2)找满足下列条件的i:
① Finish[i]=false;
② Needi≤Work。
若没有找到,则转向(4)。
(3) Work:=Work+Allocationi(pi释放了所占的全部资源)
Finish[i]=true转向(2)。
(4)若Finish[i]=true对所有i都成立(考虑到任一进程都可能是pi),则系统处于安全状态;否则,系统处于不安全状态。