所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
(1)产生死锁的必要条件
虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。
<1> 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
<2> 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
<3> 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
<4> 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
(2)处理死锁的基本方法
在系统中已经出现死锁后,应该及时检测到死锁的发生,并采取适当的措施来解除死锁。目前处理死锁的方法可归结为以下四种:
<1> 预防死锁
这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。
<2> 避免死锁
该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
<3> 检测死锁
这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
<4> 解除死锁
这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。
(3)死锁排除的方法
<1>撤消陷于死锁的全部进程;
<2>逐个撤消陷于死锁的进程,直到死锁不存在;
<3>从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
<4>从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态
分享到:
相关推荐
sqlserver查杀死锁sqlserver查杀死锁sqlserver查杀死锁sqlserver查杀死锁
一种Linux内核自旋锁死锁检测机制的设计与实现.pdf
oracle杀死锁 ,在批量导入数据的时候,在数据库中很容易就碰到锁表了,导致长时间数据库卡死,此脚本方便找寻数据库被锁对象,如果在oracle中不能alter kill掉 说明该session已过期需要进入后台去杀掉进程
当诺基亚手机被锁死时用解锁软件可以将其解开
SQL数据库由于开发过或DEBUG过程中,出现表死锁,此时要找出死锁的表,并杀死,才能解决问题,这个很重要
此方法的成功率比较高效,不需要寄回厂家就能够帮你把芯片锁死解锁。
对于熔丝位锁死的解决办法 搞错熔丝位,导致芯片锁死的恢复办法
SQLServler自动杀死死锁进程SQL,直接在SqlServer中执行即可
Monitor.Wait和Monitor.Pulse用于线程同步,类似信号操作,个人感觉使用比较复杂,容易造成死 锁。 互斥体Mutex和事件对象EventWaitHandler属于内核对象,利用内核对象进行线程同步,线程必须要在用户模式和内核模...
本文介绍了解决Oracle杀死死锁进程的方法。
Android home键锁死源码,适用于2.3版本.源码简短实用
描述在使用IIC时总线可能锁死的产生原因,防止死锁的设计要点,解除iic锁死的方法
本实例程序解决Labview中,对于事件结构经常发生的界面锁死,采用一个示例说明怎样编写程序,从而避免锁死现象,具有很好的参考价值。
H-JTAG第一次烧写NOR Flash,Flash锁死问题解决H-JTAG第一次烧写NOR Flash,Flash锁死问题解决H-JTAG第一次烧写NOR Flash,Flash锁死问题解决
如何避免AVR单片机熔丝位锁死,下面说说一些预防措施。
标准库std::mutex, std::condition_variable实现的读写锁,写优先,通过优先级控制防止读线程饿死。在支持c++11不支持C++14的工程使用。
打印机为什么老是清零锁死呢?.docx
数据库死锁的概念, 所谓死锁,是指两个会话,每个会话都持有另外一个会话想要的资源,因争夺资源而造成...对于锁死的会话,我们可以直接删掉该会话,等事物回滚完成,也可以找出锁死进程的spid,从服务器中删掉该进程。
用oracle命令和操作系统命令杀oracle锁死进程
本过程自动捕捉SQLSERVER中的死锁进程并且自动杀掉