面试技术栈 —— 操作系统之死锁

发布时间:2024年01月21日

这里的死锁知识,不仅仅在OS中有用,在编程涉及到资源竞争时也很有用,因为死锁的发生条件无外乎就这四种。

一、什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

一、参考文章或视频链接
[1] 汤小丹等.《计算机操作系统》.西安电子科技大学出版社.2012.9.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、死锁发生条件

陈胜曰:“天下苦秦久益”,陈胜吴广振臂一呼:“王侯将相,宁有种乎!”,斩木为兵,揭竿为旗,天下云集响应,秦朝统治的根基开始风雨飘摇,进入到楚汉争霸时期,刘邦与项羽以鸿沟为界,刘邦作汉王项羽作楚王,刘邦占据汉中,项羽坐拥江东,彼此最终都想打败对方并问鼎天下。即便双方想讲和,有了大一统的开端,历史也不再允许。

二、参考文章或视频链接
[1] 【花三分钟了解一下死锁 | 这波不亏,不亏】 - bilibili jstack分析线程

2.1 互斥条件

共享资源shared_resources只能被线程A或线程B所占用。天不可二日,朝不可二君,皇帝的称号只能是一个人的。每个人吃饭的碗是不可能分享给别人的,饭碗一定是互斥的。

2.2 请求并保持条件

线程A已经获取共享资源R1,在等待共享资源R2时,不释放R1。刘邦占据了汉中,项羽坐拥江东,彼此都有一个大本营,想要获得对方的资源,但都不可能放弃已经到手的土地。

2.3 不可抢占条件

其它线程不能强行抢占线程A已经获得的资源。这点如果照搬楚汉争霸的故事不太好类比,这么理解,刘邦和项羽必须是你死我活,只要双方的军事集团还存在,那就不可能获得对方的土地,在没让对方屈服的基础上抢占对方的资源是不可能的。现实中也一样,抢劫自人类进入私有制与法律的社会,从始至终都被认为是严重的刑事犯罪,原始社会就没这种约束,弱肉强食,活着干抢了算。

2.4 循环等待条件

线程A等待共享资源R2,线程B等待共享资源R1,循环等待。刘邦和项羽都对彼此虎视眈眈。

三、死锁预防、避免与解决

3.1 死锁发生前,预防死锁(资源分配前)

将上面这四条类比到现实,把你自己代入到线程,你会不会认为这四种条件对自己而言很自然?分别对应于现实中的这些行为:不肯把东西分享给别人;装进口袋里的东西再想拿出来就难了;被爸爸妈妈教育不能抢别人东西(这犯法);别人拥有的东西更香更想要(第四条和第三条就是滋生矛盾的土壤,总有一天会爆发)。我看这四条,条条都是在说人性,这也不奇怪,人难免都是有私心的嘛,但是这样也难免带来矛盾,毕竟你争我抢总有一天会有矛盾的,那现实生活中是如何解决这些矛盾的?那用道德把这些条件破坏掉就好了(但这不意味着矛盾的土壤彻底消失,而是缓解了)。

(1)第一个条件,互斥条件。这个真不行,好的像穿一条裤衩只是开玩笑,你的内裤怎么可能给别人?总得留点东西在自己身上的。
(2)第二个条件,请求并保持条件。一开始就把所有东西占到自己手中,打消别人的任何想法。你的成绩在班级里一直遥遥领先,门门功课考第一,别人也就没想法了,反而会认为你就是厉害,天生聪明,谁知你背后付出了多少努力与科学的思考。
(3)第三个条件,不可抢占条件。俗语说,吃亏是福,“一纸书来只为墙,让他三尺又何妨?万里长城今犹在,不见当年秦始皇”,在现实中,谦让是种美德,而计算机中的线程不懂这个道理, 就让OS来替天行道释放线程所占资源吧。
(4)第四个条件,循环等待条件。给资源按序号从小到大的排队,只能按指定顺序来获取资源,窗口排队打饭就是这样。

3.2 死锁发生前,避免死锁(资源分配中)

避免死锁是指,在避免死锁的方法中,系统会在每次进行资源分配时(例如,在进程或线程请求资源时)检查是否会导致死锁的情况发生。如果系统检测到可能会导致死锁,它会拒绝该请求并采取适当的措施来打破死锁循环,以确保系统能够继续正常运行。

从中文表达上是一样的,平常我们用词也不会特意区分,但在这里,避免和预防是两回事,预防就是算无遗策料事如神,是资源分配前要做的事情;避免就是摸着石头过河,是资源分配中要做的事情。所以没有道德的话,还是得有人对资源进行监督与规划。

3.2 参考文章或视频链接
[1] 银行家算法 【死锁的处理-避免死锁】 - bilibili

3.3 死锁发生后,检测与解决死锁(资源分配后)

如果没有什么道德约束又没有监督、规划的话,那么上面的四种条件就没有得到破坏,这个时候到底还是发生了死锁,产生了资源竞争,这个时候就不得不动用更高级的手段,如族规国法。

(1)资源剥夺法。刘邦赢得胜利,将项羽贬为庶民,给口饭吃就行,然后等刘邦去世后,结果项羽后代来一句,“楚虽三户,亡汉必楚”。
(2)撤销进程法。如果将“天”比作楚汉争霸里的操作系统,那就让线程A借助操作系统的力量干掉线程B,毕竟只要这个线程还活着,那就有来争夺资源的可能性,就像西楚霸王一样在生命的最后一刻所喊出的那样:“此天之亡我也,非战之罪”,不是老哥我抢资源不厉害,是“老天爷”它要剥夺我的权力啊。
(3)进程回退法。把历史进程往回拨,回到“田园牧歌”般的原始社会吧,社会上不少人美化曾经的过去多么多么好,其实有道理又没道理,这真的得是神级文明才能做到了,不过对于OS来说没什么问题,OS就是计算机里的上帝,掌管一切。
在这里插入图片描述

3.3 参考文章或视频链接
[1] 【死锁的处理-避免死锁】 - bilibili

四、总结

峰峦如聚,波涛如怒,山河表里潼关路。
望西都,意踌躇。
伤心秦汉经行处,宫阙万间都做了土。
兴,百姓苦;亡,百姓苦。—— 《山坡羊·潼关怀古》 元·张养浩

如何跳出这个历史周期律,避免操作系统走入死锁并宕机,是一件事关你我子孙后代的大事。
在这里插入图片描述
在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_44327736/article/details/135573871
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。