首页  >  文章  >  后端开发  >  php开发如何避免文件死锁

php开发如何避免文件死锁

王林
王林原创
2019-09-26 17:40:042021浏览

php开发如何避免文件死锁

死锁

死锁,它是操作系统或软件运行的一种状态:在多任务下,当一个或多个进程等待系统资源而资源又被系统本身或其它进程占用时,就形成了死锁。死锁发生的最常见形式是两个或多个线程等待被另一个线程占用的资源:

死锁-1.png

如果两个顺序同时发生,线程1将永远无法获得锁B,因为锁B被线程2占有。同时线程2也永远无法获得锁A,因为锁A被线程1拥有。

死锁产生的条件

死锁的发生必须具备以下四个条件:

①互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只被一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直到占有资源的进程用完释放。

②请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占用,此时请求进程阻塞,但又对自己已获得的资源保持不放。

③不剥夺条件:指进程已获得的资源,在使用结束之前,不能被剥夺,只能在使用结束之后自己释放。

④环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,…,Pn}中的P0正在等待一个P1占用的资源,P1正在等待P2占用的资源,……,Pn正在等待P0占用的资源。

如何避免和处理死锁

预防死锁:预防死锁的方法是使四个条件中的第二、三、四个条件之一不能成立,来避免发生死锁。

①加锁顺序:按同一顺序加锁。

当多个进程需要相同的多个锁,又按照不同的顺序加锁时,就很容易发生死锁。如果能保证所有的进程都按照相同的顺序获得锁,那么死锁就不会产生。

②加锁时限:进程尝试获取锁时加上一定的时限。

也就是说如果申请锁时超过了这个时限,该进程就放弃对该锁的请求,并释放所有已经获得的锁。然后过一 段随机的时间后重试。这段随机的时间让其它线程有机会尝试获取相同的锁,并且让该应用在没有获得锁的时候继续进行。问题是,如果有非常多的进程同一时间去竞争同一批资源,即使有超时和回退机制,还是可能会存在某些进程反复尝试却始终得不到锁的问题。

避免死锁:该方法是同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。

死锁检测:它主要针对那些无法实现按序加锁并且加锁时限也不可行的情况。

通过设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源。然后采取适当措施从系统中将已发生的死锁清除掉。

每当一个进程获得了锁,会在进程和锁的相关数据结构中将其记下。并且,每当有进程请求锁,都会记录在这个数据结构中。当一个进程请求锁失败时,该线程可以遍历进程和锁的数据结构确认是否发生死锁。

例如:

进程A请求锁2,但锁2倍进程B占有,于是进程A等待进程B。同理,进程B等待进程C,进程C等待进程D,进程D等待进程A。进程A为了检测死锁,它需要递进地检测所有被B请求的锁。从进程B请求的所开始,进程A找到了进程C,然后找到了进程D。发现进程D请求的锁被进程A自己所占有,这样检测到发生了死锁。

当进程A检测到发生死锁之后,一个可行的方法是进程A释放自己占有的锁,回退,然后经过一段随机的时间后重试。这和加锁时限相似,不同是死锁已经发生了。

死锁解除:这是与检测死锁相配套的一种措施

当发现有进程死锁时,应立即把它们从死锁状态中解脱出来。

一种方法是,剥夺资源。从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态。      

还有一种方法是,撤销进程。最简单的撤销进程的方法是使全部死锁进程都夭折掉;稍微温和一点的方法是按照某种顺序逐个地撤销进程,这只有足够的资源可用。

推荐教程:PHP视频教程

以上是php开发如何避免文件死锁的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn