一、死锁的定义
文章插图
多进程,多线程的并发执行虽然提升了系统资源的利用率,提高了系统的性能,但是并发执行也带来了新的问题—–死锁 。
死锁是指多个进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象(互相挂起等待),若无外力作用,它们都将无法推进下去 。此时系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
举一个生活中的简单例子:小明和小红都想买一块橡皮,这块橡皮价值一块钱,但是他们俩每个人都只有五毛钱,小明说:你把你的五毛钱给我,让我买橡皮 。小红说:你把你的五毛钱给我,让我买橡皮 。这样,两个人互相僵持着,谁也不愿意低头,谁都买不到橡皮 。
二、几种常见的死锁1.线程将自己锁住
为了保证线程之间的同步和互斥,我们往往需要给其加锁,有时候,线程申请了锁资源,还没有等待释放,又一次申请这把锁,结果就是挂起等待这把锁的释放,但是这把锁是被自己拿着,所以就会永远挂起等待,就造成了死锁 。
2.多线程竞争资源循环等待
有两个线程P1和P2,P1首先申请得到了锁L1,P2申请得到了锁L2,这个时候P1有向去申请锁L2,结果是被挂起等待P2释放锁L2,而P2恰好也想申请锁L1,结果是挂起等待P1释放锁L1,此时就造成两个线程互相僵持,造成死锁 。
3.进程推进顺序不当引起的死锁问题
有三个线程,P1,P2和P3,分别生产数据M1,M2,M3,同时分别接收别的线程产生的数据M3,M2,M1,如果线程推进的顺序正确,即三个线程都先生产数据,再接收,那么没有问题,但是一旦线程先接受数据,再生产数据,因为一开始没有数据产生,那么就会造成三个线程的死锁问题 。
更多Linux内核视频教程文档资料免费领取后台私信【内核】自行获取 。
内核学习网站:
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂
三、死锁产生的原因和必要条件1.死锁产生的主要原因:系统的资源不足 。进程(线程)推进的顺序不对 。资源的分配不当 。
当系统的资源很充沛的时候,每个进程都可以申请到想要的资源,那么出现死锁的概率就很低,线程的调度顺序和速度不同,也会导致死锁问题 。
2.死锁产生的四个必要条件:互斥条件:进程(线程)申请的资源在一段时间中只能被一个进程(线程)使用 。请求与等待条件:进程(线程)已经拥有了一个资源,但是又申请新的资源,拥有的资源保持不变。不可剥夺条件:在一个进程(线程)没有用完,主动释放资源的时候,不能被抢占 。循环等待条件:多个进程(线程)之间存在资源循环链 。3.处理死锁的方法:预防死锁:破坏死锁产生的四个条件之一,注意,互斥条件不能破坏 。避免死锁:合理地分配资源 。检查死锁:利用专门的死锁机构检查死锁的发生,然后采取相应的方法 。解除死锁:发生死锁的时候,采取合理的方法解决死锁 。一般是强行剥夺资源 。4.如何打破四个产生条件打破互斥条件:改造独占性资源为虚拟大资源,但是大部分资源无法改造,因此不建议使用这个方法 。打破请求与保持条件:在进程(线程)运行之前,就把需要申请的资源一次性申请到位,满足则运行,不满足就等待,这样就不会造成在占有资源的情况下,还要申请新资源 。打破不可剥夺条件:在占有资源并且还想要申请新资源的时候,归还已经占有的资源 。打破循环等待条件:实现资源的有序分配,即对所有的设备进行分类编号,只能以升序的方式来申请资源 。
- 手机关键词搜索软件 wps手机版快速搜索
- 界面原型设计工具有用哪些 ui界面原型图软件推荐
- 婚礼司仪培训 婚礼司仪培训软件
- sql工具有哪些 文档加密软件排名
- revit操作实例教程 bim画图从头到尾步骤
- 怎样卸载桌面上的软件 怎样卸载
- mysql数据库系统表有哪些 数据库使用教程
- u盘结构损坏 u盘做系统详细步骤
- 苹果平板4怎么更新系统 苹果平板ipad最新款
- 海淘app排名有哪些 正品海外代购软件推荐