【Linux】死锁(更新中)

在这里插入图片描述

一. 什么是死锁

  • 死锁是指一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用的不会释放的资源,而处于一种永久等待的状态。

就像下图(图片来自网络)

在这里插入图片描述

第一种死锁是,线程A和线程B同时让线程C让路,但因为空间狭窄,并且两人都互补想让,所以一直处于等待状态
第二种死锁是,线程A和线程B互相阻塞,都抢夺路权,并且不相让自己的,所以处于等待状态

二. 死锁产生的四个条件

死锁产生的四个条件属于必要条件,即如果出现死锁,必然由这四种条件导致,不过反之,可能还出现第5,第6种情况,也导致死锁。

  1. 互斥条件: 一个资源每次只能被一个执行流使用
  2. 请求与保持条件: 一个执行流因请求资源而阻塞时,对已获得的资源保持不释放
  3. 循环等待条件: 若干个执行流之间形成的一种头尾相接的循环等待资源的关系
  4. 不剥夺条件:一个执行流已获得的资源,在未使用完之前,不能被强行剥夺

三. 避免死锁

避免死锁的一种方法就是破坏上述的四个条件,只要破坏其中的任意一个,就不会产生死锁。

  • 对于互斥条件:我们可以尽量减少对临界资源的访问,减少加锁解锁的操作
  • 对于请求与保持条件:pthread_mutex_trylock函数,在多次加锁后,如果仍不成功,会解除自己所申请的锁。
  • 循环等待条件:使得加锁的顺序一致,比如两个线程都获取A,B两把锁。两个线程获取的顺序都是AB,减少交错的情况。如果一个线程AB,一个线程BA,那么一定会死锁。
  • 不剥夺条件:解锁操作允许其他线程进行,即可以剥夺资源。

还有一些其他方法:

  1. 避免锁未释放的场景
  2. 资源一次性分配

有两种常见的避免死锁的方法:

  1. 死锁检测算法
  2. 银行家算法

1. 死锁检测算法

死锁检测算法,首先需要一种数据结构来保存资源的请求和分配
其次是通过算法,利用请求和分配信息检测系统是否存在死锁

首先画图理解一下
在这里插入图片描述

如果系统中空闲的资源满足线程所需资源数量,那么该线程不会阻塞。
而当一个线程完成执行任务,将资源归还给操作系统,那么空闲的资源变多,可能使得一些本来因空闲资源不足而阻塞等待的线程被激活,开始执行任务。
以此类推,当最后所有线程都完成任务时,表面给程序没有死锁。
当一个线程可以完成任务时,我们可以在图中将其有向边消除。比如P1完成任务。

在这里插入图片描述
然后再P2完成任务
在这里插入图片描述

所有有向边消除,表面该程序没有死锁。


但如果是以下场景
在这里插入图片描述

R1分配2个资源给P1,分配1个资源给P2,R2分配1个资源给P2,但是此时,P2需要两个R1资源才能开始执行任务,P1需要两个R2资源才能执行任务,两个线程互相等待资源,但又不释放自己分配到的资源,导致死锁。

检测死锁的算法

在资源分配图中,找到既不阻塞又不是孤点的线程Pi(即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量。若所有链接该线程的有向边都满足次条件,那么该线程可以执行任务,然后归还资源。)

然后线程Pi归还的资源可能唤醒其他线程执行任务,当最后所有有向边都消除了,那么该程序没有死锁,反之,剩下的有向边是导致死锁的原因之一。


2. 银行家算法

后续补充

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java和Linux都是非常常用的软件开发工具。但是,无论是Java还是Linux都存在可能导致死锁的情况。 在Java死锁是指两个或多个线程相互等待对方持有的资源,而导致所有线程都无法继续执行的情况。这通常发生在多线程编程,当多个线程尝试以不同的顺序锁定多个资源时,可能会导致死锁。例如,线程A持有资源X并等待获取资源Y,而线程B持有资源Y并等待获取资源X,这样就会导致死锁。 在Linux死锁是指多个进程或线程由于争夺有限的系统资源而无限期地相互等待对方释放资源的情况。这种情况通常发生在系统资源(如内存、文件描述符等)不足时,多个进程或线程同时请求这些资源,但由于资源分配不当而无法满足所有请求,从而导致死锁。 对于Java死锁,可以通过使用锁的合理顺序、避免使用多个锁或使用锁的超时机制来预防。另外,通过使用工具如检测死锁的工具(如jstack)可以帮助发现和解决死锁问题。 对于Linux死锁,可以通过合理规划和分配系统资源、采用进程/线程优先级策略、使用资源分配算法等手段来避免。此外,Linux内核还提供了一些死锁检测和解决方法,如通过/sysfs下的文件system下的文件deadlock_detection来检测和解决死锁。 总之,无论是Java还是Linux死锁都是需要引起关注的问题,但通过合理的设计和调优,我们可以最大程度地避免死锁的发生,并保证系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值