死锁
创始人
2024-05-30 15:59:23
0

1.死锁的定义

多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
下面我们通过一些实例来说明死锁现象。


先看生活中的一个实例,2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都同时占用一个资源,等待另一个资源,这个时候甲在等待乙吃完并释放它占有的筷子,同理,乙也在等待甲吃完并释放它占有的筷子,这样就陷入了一个死循环,谁也无法继续吃饭。。。

在计算机系统中也存在类似的情况。例如,某计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。

2.为什么会出现死锁?

死锁一般都是由于对共享资源的竞争所引起的。但对共享资源的竞争又不一定就会发生死锁。
产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。

互斥

不可剥夺

持有并等待(请求和保持)

形成等待环(循环等待)

互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, ..., pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的资源被P0占有,如图2-15所示。

3.如何避免死锁

3.1避免多次锁定。

尽量避免同一个线程对多个 Lock 进行锁定。例如上面的死锁程序,主线程要对 A、B 两个对象的 Lock 进行锁定,副线程也要对 A、B 两个对象的 Lock 进行锁定,这就埋下了导致死锁的隐患。

3.2具有相同的加锁顺序。

当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。

如果多个线程需要对多个 Lock 进行锁定,则应该保证它们以相同的顺序请求加锁。比如上面的死锁程序,主线程先对 A 对象的 Lock 加锁,再对 B 对象的 Lock 加锁;而副线程则先对 B 对象的 Lock 加锁,再对 A 对象的 Lock 加锁。这种加锁顺序很容易形成嵌套锁定,进而导致死锁。如果让主线程、副线程按照相同的顺序加锁,就可以避免这个问题。

3.3使用定时锁。

线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁。

另外一个可以避免死锁的方法是在尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行(译者注:加锁超时后可以先继续运行干点其它事情,再回头来重复之前加锁的逻辑)。
以下是一个例子,展示了两个线程以不同的顺序尝试获取相同的两个锁,在发生超时后回退并重试的场景:

Thread 1 locks A
Thread 2 locks BThread 1 attempts to lock B but is blocked
Thread 2 attempts to lock A but is blockedThread 1's lock attempt on B times out
Thread 1 backs up and releases A as well
Thread 1 waits randomly (e.g. 257 millis) before retrying.Thread 2's lock attempt on A times out
Thread 2 backs up and releases B as well
Thread 2 waits randomly (e.g. 43 millis) before retrying.

需要注意的是,由于存在锁的超时,所以我们不能认为这种场景就一定是出现了死锁。也可能是因为获得了锁的线程(导致其它线程超时)需要很长的时间去完成它的任务。

此外,如果有非常多的线程同一时间去竞争同一批资源,就算有超时和回退机制,还是可能会导致这些线程重复地尝试但却始终得不到锁。如果只有两个线程,并且重试的超时时间设定为0到500毫秒之间,这种现象可能不会发生,但是如果是10个或20个线程情况就不同了。因为这些线程等待相等的重试时间的概率就高的多(或者非常接近以至于会出现问题)。
(译者注:超时和重试机制是为了避免在同一时间出现的竞争,但是当线程很多时,其中两个或多个线程的超时时间一样或者接近的可能性就会很大,因此就算出现竞争而导致超时后,由于超时时间一样,它们又会同时开始重试,导致新一轮的竞争,带来了新的问题。)

3.4死锁检测。

死锁检测是一种依靠算法机制来实现的死锁预防机制,它主要是针对那些不可能实现按序加锁,也不能使用定时锁的场景的。

相关内容

热门资讯

彻底删除安卓系统更新,重拾纯净... 你有没有想过,你的安卓手机每次更新后,那些新功能、新界面,其实有时候并不是那么让人心动呢?有时候,我...
华为系统怎么打败安卓,揭秘如何... 你知道吗?在智能手机的世界里,最近可是掀起了一场不小的风波呢!那就是华为系统如何打败安卓系统,成为新...
安卓用户切换苹果系统,探索苹果... 你知道吗?最近在朋友圈里,有个话题可是热得不得了,那就是安卓用户纷纷切换到苹果系统。这究竟是怎么回事...
掌学派安卓系统密码,解锁便捷学... 亲爱的读者朋友们,你是否也有过这样的经历:手机里的掌学派安卓系统密码突然忘记了,心里那个急啊,就像热...
阿里云系统刷机安卓系统,轻松实... 你有没有想过,你的手机系统是不是也能像电脑一样,随时更新换代呢?今天,就让我带你一探究竟,看看阿里云...
安卓系统9.0会卡吗,流畅度解... 听说安卓系统9.0要来了,是不是又得担心手机卡成“龟速”啦?别急,今天咱们就来聊聊这个话题,看看安卓...
安卓系统平板图片分类,轻松浏览 你有没有发现,现在市面上平板电脑的种类真是五花八门,让人眼花缭乱?尤其是安卓系统的平板,更是层出不穷...
安卓系统查找位置软件,基于安卓... 手机不见了?别慌!安卓系统里藏着不少查找位置的小秘密,今天就来跟你聊聊这些神奇的小工具,让你的手机瞬...
安卓也能用ios系统,揭秘安卓... 哎呀呀,你知道吗?现在科技界可是掀起了一股热潮,那就是——安卓手机也能用iOS系统啦!是不是听起来有...
安卓系统如何清理文件,提升手机... 亲爱的手机,你是不是也觉得最近有点“胖”了呢?别担心,今天就来教你几招,让你的安卓系统文件轻松瘦身,...
安卓系统哪个平板好些,揭秘哪款... 你有没有想过,在这个科技飞速发展的时代,拥有一款性能出众的安卓平板,简直就像拥有了移动的办公室和娱乐...
安卓双系统进入动画,流畅体验与... 你知道吗?现在很多小伙伴都喜欢在自己的手机上玩转双系统,就像变魔术一样,一会儿是安卓,一会儿是iOS...
安卓系统无root权限,揭秘无... 亲爱的手机控们,你们有没有遇到过这样的情况:手机里装了各种软件,可有些功能却因为“无root权限”而...
安卓系统有区别吗,深度探讨不同... 你有没有想过,为什么你的手机里装的是安卓系统,而朋友的手机里却是苹果系统呢?这两种系统,它们之间到底...
安卓系统怎么录制唱歌,打造个人... 亲爱的音乐爱好者们,你是否曾在某个瞬间,想要记录下自己美妙的歌声,却又苦于找不到合适的方法?别担心,...
安卓系统需要安装什么,安卓系统... 你有没有想过,你的安卓手机里那些神奇的软件是怎么来的呢?没错,就是安卓系统在背后默默支持着它们。那么...
深圳苹果安卓系统下载,畅享智能... 你知道吗?最近有个游戏在朋友圈里火得一塌糊涂,那就是深圳城里3A字牌安卓版——魔Q游戏!这款游戏不仅...
苹果改安卓系统了,揭秘iOS系... 哇塞,你知道吗?苹果竟然改安卓系统了!是的,你没听错,就是那个一直以封闭著称的苹果,竟然开始向安卓系...
安卓手表更新不了系统,解锁系统... 最近是不是发现你的安卓手表更新系统时遇到了点小麻烦?别急,让我来给你支支招,让你轻松解决这个让人头疼...
海信电视 linux 安卓系统... 亲爱的读者们,你是否在寻找一款既时尚又实用的电视呢?今天,我要给你介绍一款在市场上备受好评的产品——...