0

0

php开发如何避免文件死锁

王林

王林

发布时间:2019-09-26 17:40:04

|

2261人浏览过

|

来源于php中文网

原创

php开发如何避免文件死锁

死锁

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

死锁-1.png

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

死锁产生的条件

立即学习PHP免费学习笔记(深入)”;

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

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

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

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

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

如何避免和处理死锁

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

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

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

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

云模块网站管理系统3.1.03
云模块网站管理系统3.1.03

云模块_YunMOK网站管理系统采用PHP+MYSQL为编程语言,搭载自主研发的模块化引擎驱动技术,实现可视化拖拽无技术创建并管理网站!如你所想,无限可能,支持创建任何网站:企业、商城、O2O、门户、论坛、人才等一块儿搞定!永久免费授权,包括商业用途; 默认内置三套免费模板。PC网站+手机网站+适配微信+文章管理+产品管理+SEO优化+组件扩展+NEW Login界面.....目测已经遥遥领先..

下载

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

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

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

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

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

例如:

进程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速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

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

相关专题

更多
菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

56

2026.01.21

三角洲入口地址合集
三角洲入口地址合集

本专题整合了三角洲入口地址合集,阅读专题下面的文章了解更多详细内容。

51

2026.01.21

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

397

2026.01.21

妖精漫画入口地址合集
妖精漫画入口地址合集

本专题整合了妖精漫画入口地址合集,阅读专题下面的文章了解更多详细内容。

118

2026.01.21

java版本选择建议
java版本选择建议

本专题整合了java版本相关合集,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

11

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 9.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号