死锁(Deadlock)是指多个进程在运行的过程中因争夺资源而造成的一种僵局。当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。在软件设计师的考试当中,这个知识点的考查是以选择题的形式出现的,考点主要有:死锁的必要条件、解决死锁的方法,最难高难度会考到“银行家算法”。本文将介绍死锁的相关知识,但不会具体讲解“银行家算法”,该算法将在本系列的下一篇文章中详细说明。
1、死锁发生的必要条件
死锁的发生必须具备四个必要条件,这四个条件相互联系、缺一不可。
(1)互斥条件:指进程对所分配到的资源进行排他性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求该资源,则请求者只能等待,直至占有该资源的进程用完并释放。
(2)请求和保持条件:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又已被其他进程占有,此时请求进程阻塞,但又对自己已获得的其他资源保持不放。
(3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
(4)环路等待条件:指在发生死锁时,必然存在一个进程--资源的环形链,即进程集合{P0,P1,P2…Pn}中的P0正在等待一个P1占用的资源,P1正在等待P2占用的资源,……Pn正在等待已被P0占用的资源。
2、解决死锁的策略
解决死锁的策略通常有三种:死锁预防、死锁避免以及死锁解除。前两种方法是“事前措施”,而死锁解除是“事后解决方案”。
(1)死锁预防:“解铃还需系铃人”,随便破坏导致死锁这任意一个必要条件就可以预防死锁。例如,要求用户申请
资源时一起申请所需要的全部资源,这就破坏了保持和等待条件;将资源分层,得到上一层资源后,才能够申请下一层资源,它破坏了环路等待条件。预防通常会降低系统的效率。
(2)死锁避免:避免是指进程在每次申请资源时判断这些操作是否安全,典型算法是“银行家算法”(本系列文章的下一篇将详细讲解该问题)。但这种算法会增加系统的开销。
(3)死锁解除:该方法的思路很简单,通过死锁检测判断系统是否处于死锁状态,若死锁,则由系统强制剥夺部分进程的资源,将资源强行分配给别的进程。
3、判断系统是否可能进入死锁状态
从上面的死锁解决方案来看,无论哪一种方式都不可避免的要增加系统的负担。而同时一个系统是否有可进入死锁状态受系统资源数量,需要使用该资源的进程数量等因素影响。若系统本不可能引起死锁,而我们采用了死锁解决方案,是很不合理的。所以,考试中常考到这样的题型:给出系统的资源数,以及需要使用该资源的进程数量等参数,让考生判断系统有无可能产生死锁。下面我们以例题的方式来说明如何解决这类问题。
例题1:
系统有3个进程:A、B、C。这3个进程都需要5个系统资源。如果系统有多少个资源,则不可能发生死锁。
解答:
在分析这个问题时,我们可以取一些简单的数据代入试题进行验证、分析,以得到相应的规如:
(1)当系统资源数量为9时,若给A与B分别分配了4个资源,C分配了1个资源,则系统中的每个进程都存在资源不足的情况,而都不放手自己拥有的资源。不能正常运行完毕,发生死锁。
(2)当系统资源数量为12时,若给A、B、C各分配4个资源,则死锁。
(3)当系统资源数量为13时,无论如何分
软件设计师重点难点——死锁 来自淘豆网m.daumloan.com转载请标明出处.