挑战408——操作系统(13)——死锁(deadlock)

数字IC设计工程师笔试面试经典100题 本文来自芯社区,谢谢。 1:什么是同步逻辑和异步逻辑? 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序逻辑电路的特点:各触发器的时钟端全部连接在一起,并接在系统时钟端,只有当时钟脉冲到来时,电路的状态才能改变。改变后的状态将一直保持到下一个时钟脉冲的到来,此时无论外部输入x有无变化,状态表中的每个状态都是稳定的。 异步时序逻辑电路的特点:... 阅读详情

死锁,可以定义为一组竞争系统资源或者相互通信的进程,相互的“永久性“”的阻塞,若无外力作用,这组进程将永远没有办法继续执行。很遗憾,目前这种问题没有一种有效的通用解决方案。
这里对于死锁的定义理解要注意死锁的对象——一组进程,相互竞争。如果是一个进程可能长期或者永久性得不到执行,那么这个进程是处于饥饿状态而不是死锁。同时,饥饿 ≠死锁!,饥饿现象只是死锁的一种结果,就是说由于死锁的出现,导致了死锁的进程饿死。但是饥饿现象不是一定由于死锁导致的。比如前面的一些调度算法,也可能造成饥饿,因为有些程序可能永远得不到执行,但是不意味着它就死锁了。用句现在流行的话来说它仅仅是“自闭”了而已。

哲学家进餐问题

在讲PV操作的时候,特意没讲这个经典的问题,目的就是让学到这里的时候,对死锁再加深认识,直接举例子不如分析例子来的好。

问题描述:这个问题由伟大的计算机科学家dijkstra提出并解决。有5个哲学家,他们的生活方式是,思考,进餐。他们围绕着圆桌而坐,桌子上有5双筷子和5碗米饭,平时哲学家进行思考,饥饿的时候他拿起左右两边的筷子(一根一根的拿起),试图进餐,进餐完毕后又陷入思考。哲学家只有同时拿到筷子才能进食。如图:
在这里插入图片描述
我们按照之前的模板分析:

  1. 临界资源分析:显然筷子是临界资源,因为它一次只允许一个哲学家使用。
  2. 交互关系分析:这里有5个哲学家,也就是有5个一样的进程,他们对筷子的访问是互斥的。他们之间没有一定的先后顺序,毕竟不知道谁会先饿。
  3. 思路分析:哲学家能吃到饭的前提是,他手里有两根筷子,而拿到筷子的前提是,他左右两边的哲学家,恰好在思考。
  4. 信号量设置分析:这里筷子是临界资源,每个筷子都是一个临界资源,对临界资源的访问要以互斥的形式访问,所以要设置5个互斥信号量,信号量较多的情况下,我们用数组表示会方便很多,比如 chopsticks[5] = {1,1,1,1,1,}.因为没有同步关系,因此我们也不用设置其他的资源信号量。

伪代码如下:

//哲学家进餐问题
semaphore chopsticks[5] = {1,1,1,1,1};//定义互斥信号量数组
void philosopher(int i){ //第i个哲学家进程
	while (true){
		P(chopsticks[i]);//申请左边的筷子
		P(chopsticks[(i + 1)%5]);//申请右边的筷子
		.......
		..进餐.       //拿到了左右两根筷子后,进餐
		.......
		V(chopsticks[i]);//放下左边的筷子
		V(chopsticks[(i + 1)%5);//放下右边的筷子
		.......
		..思考.  //吃完饭思考
		.......
	}
}

上面的代码,解决了两个相邻的哲学家不会同时进餐的问题,但是思考这样一个问题。假设所有的哲学家同一时间都饿了呢?我们分析一下,进程同时执行下面的语句:

P(chopsticks[i]);申请左边的筷子

那么,现在所有的哲学家手里都有一根筷子,右边的筷子已经被别人拿走了,所以谁也没有办法进食,每个人都希望右边的人能放下手中的筷子,陷入了无休止的等待当中,哲学家迟早被饿死。这就是死锁现象。这样的理解很是深刻。
那么先就事论事,先解决这个问题再说:
提供一种思路,既然这样全都得饿死,那不如就先让一个人吃完,吃完后把筷子让出来。也就是说,只有当哲学家两边的筷子都能用的时候,才允许它吃饭。那么具体怎么实现呢?其实不难,我们只要在某个哲学家拿筷子的时候,其他的哲学家都不能拿筷子,也就是说取筷子这个动作是互斥的。于是有了下面的改进代码:

//哲学家进餐问题
semaphore chopsticks[5] = {1,1,1,1,1};//定义互斥信号量数组
semaphore mutex = 1;//设置使用筷子的互斥信号量
void philosopher(int i){ //第i个哲学家进程
	while (true){
		P(mutex);//申请使用筷子操作
		P(chopsticks[i]);//申请左边的筷子
		P(chopsticks[(i + 1)%5]);//申请右边的筷子
		.......
		..进餐.       //拿到了左右两根筷子后,进餐
		.......
		V(chopsticks[i]);//放下左边的筷子
		V(chopsticks[(i + 1)%5];//放下右边的筷子
		V(mutex);//筷子使用完毕,放回原位
		.......
		..思考.
		.......
	}
}

死锁产生的原因

死锁产生的原因主要有四个方面:资源不足,进程推进顺序非法,资源的使用。

  1. 资源不足:通常系统中拥有的不可剥夺的资源,数量不足以满足多个进程的需要,使得进程在运行过程中因为竞争资源而导致竞争资源陷入僵局,导致死锁。(比如竞争打印机,刚刚哲学家问题的筷子
  2. 进程推进顺序非法:进程中申请和释放资源的顺序安排不当(如将生产者消费者之间的PV操作的顺序颠倒)。如果进程P不是同时需要两个资源,先使用一个再申请一个,这样就不会产生死锁。
  3. 资源的使用。系统中的资源主要分两大类:可重复资源,可消耗资源。
    可重复资源包括:处理机,I/O通道,设备文件,以及数据库等等,这种资源,进程得到后,再释放,供其他进程再次使用。
    可消耗资源包括:中断,信号量,缓冲区。当一个进程使用该资源后,便不复存在。
    就生产者消费者问题而言,按照顺序先P(mutex)也是基于此考虑的。

解决死锁的方法是:预防,检测和避免。(这个很重要,常识)

死锁的必要条件
  1. 互斥。一段时间内,某种资源只能由一个进程占有,此时其他要求使用该资源的进程只能阻塞。
  2. 请求与保持。当进程已经占有了至少一个进程,又提出新的资源要求,而该被请求的资源又被其他进程占用,此时进程阻塞,但是对它持有的资源,保持不放。
  3. 不可剥夺。进程已经获得资源,在它使用完毕前不能被剥夺,只能使用完毕后自己释放。
  4. 环路条件。存在一个与资源的环形链,设链中的每个进程都在等待一个被占用的资源。(就是哲学家问题中的,每个哲学家都手持一根筷子的情况)。
    在这里插入图片描述
    一般情况下,前面三种情况都是合理的。进程间的互斥,是为了保证再现性,请求与保持是正常的运行,对于一些资源,比如打印机,是不能剥夺使用的。
    123是死锁的必要条件,而4是123的潜在的结果。当前面的123某一种情况与4同时出现的时候,表明进程间发生了死锁

解决死锁的方法是:预防,检测和避免。(这个很重要,常识)

死锁的预防

死锁的预防可以从4个必要条件入手。

  • 对于互斥,这是程序并发必不可少的一种机制,无法避免
  • 对于请求与保持。出现问题的原因是因为,运行过程中自己的资源不够,而向外申请造成的。所以我们可以预先分配。即要求进程一次性请求完所有资源,若不能满足,就阻塞这个进程。直到它所有的资源都满足为止。这就要求预知进程运行所需要的总资源数。
    缺点:进程将会被延迟运行,资源被严重浪费。而且最重要的是,进程只有在运行的时候才知道需要哪些资源
  • 对于不可剥夺,最直接的方式就是剥夺阻塞进程的资源,但是代价太大,会导致进程无限期推迟运行。
  • 对于环路,那么破坏环路的条件。可以采用有序分配策略
    如果一个进程已经分配到了某种类型的资源,它接下来请求的资源,只能是那些排在这个资源之后的资源。(即按一定顺序来申请资源)
死锁的检测

死锁检测算法主要是检查系统中的进程是否有循环等待,将系统总的进程和资源的申请和分配描述成一幅有向图,称为资源分配图。通过检查有向图中是否有环来判断死锁的存在。
在这里插入图片描述

用方框代表资源,方框里面的小圆圈代表的是资源数,P1,P2是进程。
从进程出的边为请求边,从进程入的边为分配边
那么,采用拓扑排序的方式来判断图中是否有环。关于拓扑排序 看这个:数据结构——图(9)——拓扑排序与DFS

死锁定理:系统处于死锁状态等价于状态S的资源分配图是不可以被简化的

死锁的预防

银行家算法(下篇详细介绍)

(王道408考研操作系统)第二章进程管理-第四节3:死锁处理策略之检测和解除 文章目录一:死锁检测算法(1)资源分配图(2)死锁定理二:死锁解除算法 如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就极有可能发生死锁,在这种情况下系统应当提供两个算法: 死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁 死锁解除算法:当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解脱出来 一:死锁检测算法 为了能对系统是否已经发生了死锁进行检测,必须 使用某种数据结构来保存资源的请求和分配信息-资源分配图 提供一种算法,利用上述信息来检测系统是否进入了死锁状态 阅读详情

相关推荐

【信息科学与工程学】【通信工程】第五十九篇 IP网络设计01

IP网络设计不是只写ip address;它本质是的问题,所以参数天然分布在:层级例子物理/传输(可选但你会要求光路/电路)光功率/OSNR/色散/衰减/BER/FEC;铜/微波链路预算L1/L2 链路模型速率、MTU、成帧开销、串行化、传播时延、缓冲排队/调度/QoS服务曲线、令牌桶、延迟界、丢包概率近似路由/TE/可靠性流守恒、路径容量、切换/收敛时间信息论/可达性Shannon 上限、FEC 有效码率、链路容量 after overhead计算科学/数值。

weixin_49199313的博客 458

操作系统死锁&饥饿

死锁:如果一组进程中的每一个进程都在等待由该进程中的其他进程才能引发的事件,那么该组进程是死锁的。砍树你需要一个斧子,但是斧子又需要木头来做,这就发生了死锁。 饥饿:指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。排队过程中,总有人插队到你前面,你一直处于排队状态,这就发生了饥饿。

燕双嘤 8524

基因树构建全流程:从OrthoFinder到iTOL的保姆级教程(附兰科植物案例)

本文提供了一份从OrthoFinder到iTOL的基因树构建全流程保姆级教程。详细解析了利用OrthoFinder构建物种树、IQ-TREE构建无根基因树、Notung进行树调和生根,以及最终在iTOL中实现专业可视化的每一步操作与实战经验,并以兰科植物NB-ARC基因家族为例进行演示,帮助研究者系统掌握基因树分析方法。

tequila的博客 489

不当竞争:四大领域深度剖析

不当竞争:四大领域深度剖析。

JiYan_Strategic的博客 1024

零售商品的定价策略

本文调研了经济学中常用的定价策略, 为了方便介绍, 把它们分为三类: 基于用户心理的定价策略. 从心理学的角度分析用户的购买行为, 并制定相应的定价策略. 基于企业长期利益的定价策略. 通过定价策略实现市场份额和销售利润的增长. 基于企业短期利益的定价策略. 通过定价策略实现短期销售利润的最大化. 注: 本文绝大部分内容参考自网络12. 1. 基于用户心理的定价策略 1.1 奇数定价(Odd ...

胡拉哥 6118

408精华知识】死锁考点总结

死锁共有以下几个考点:死锁的概念、死锁与饥饿的联系与区别、死锁计算、死锁产生的必要条件、死锁的处理策略,下面我们依次来看~

@啊哈哈哈哈哈韩的博客 2103

mysql死锁报错循环_记一次线上MySQL数据库死锁问题

最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过。这次刚好遇到了,便在此记录一下。出现死锁问题背景项目层面:报错的项目做的是一个批量下单的动作,会同时写入多条订单数据,代码之前写的是一个事务中一个循环一条一条insert到数据库(至于为啥没用批量插入就不追究了,历史原因了)。数据库层面:一张te...

weixin_39769228的博客 350

记一次线上MySQL数据库死锁问题

最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过。这次刚好遇到了,便在此记录一下。 出现死锁问题背景 项目层面:报错的项目做的是一个批量下单的动作,会同时写入多条订单数据,代码之前写的是一个事务中一个循环一条一条insert到数据库(至于...

weixin_30897079的博客 167

进程与线程

系统调用与库调用的区别。进程属性、模型、实现以及调度。进程避免竞争的条件,同步手段。线程以及线程间调度

愿戎马一生,归来仍少年 804

机器学习之自组织特征映射神经网络(SOM)

定义 自组织特征映射神经网络(Self-Organizing Feature Map,也称Kohomen映射),简称为SOM网络,主要用于解决模式识别类的问题。SOM网络属于无监督学习算法,与Kmeans算法相似。所不同的是,SOM网络不需要预先提供聚类数量,类别的数据由网络自动识别出来。它的基本思想是:将距离小的个体集合划分为同一类别,而将距离大的个体集合划分为不同的类别。 2.

qq_26645205的博客 6778

神经网络-联想学习规则-内星学习规则

A: Winner - Take - All(胜者为王)学习规则是一种竞争关系的学习规则,用于无监督学习,一般将网络的某一层确定为竞争层,对于一个特定的输入x,竞争层的所有的p个神经元均有输出响应,其中响应值最大的神经元为在竞争中获胜的神经元,即: ...

pjw2146087的博客 1571

聚类分析应用之市场细分

转载自:http://www.itongji.cn/article/120914292012.html 上一篇博客提到聚类分析方法和基本概念,但是可能没有回答一些人的疑问?比如到底应该分成多少类,类的稳定性以及如何评估聚类的结果。其实,要想解决这个问题,首先是要与分析目的有关,不简单是一个统计分析问题,或者说聚类问题,而应该是研究者的判断或者说研究者的洞察力,当然,我们还是要有一套方法去

栖客 4961

iOS Wow体验 - 第三章 - 用户体验的差异化策略

本文是《iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad》第三章译文精选,其余章节将陆续放出。上一篇:Wow体验 - 第二章 - iOS用户体验解析(2) 关于本套译文分享的详情及目录结构,请参考iOS Wow体验 - 译文分享说明。 全文由C7210自发翻译(编译),并首发于Beforweb.com,如需转载,请

jjunjoe的专栏 581

死锁产生的原因和必要条件详解

在多道程序系统中,虽借助于多个进程的并发执行,改善了系统的资源利用率,提高了系统的吞吐量,但可能发生一种危险——死锁死锁deadlock): 是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种状态时,若无外力作用,它们都将无法再向前推进。

loveCC_orange的博客 1万+

检测线程死锁的另一种方法(付界面卡死检测方法)

由来:之前笔者写了一篇《一个检测线程死锁的方法》用于检测自己的程序在使用锁的时候是否发生死锁的文章,但考虑到那个方法存在很大的局限性: 只有代码中使用了那个锁封装类对象才能检测到线程死锁。 考虑到性能问题,只是在debug模式下才开启了这个功能,在Release版下是无效的。全靠开发在调试模式下才能检测到是否存在死锁,实验场景和样本都太狭隘。 只做了临界区(Critical Section)...

liaozhilong88的博客 2326

死锁问题

死锁问题 所谓死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 死锁产生的原因 1、系统资源的竞争。通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。 2、不剥夺性条件。只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。 3、进程推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程P1、P2分别

m0_53917137的博客 279

计算机基础-操作系统

操作系统

HBryce24的博客 3213

死锁产生的原因及解决

一、定义 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。(指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。) 二、死锁产生的四个必要条件 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。 循环等待,即存在一个等待队列:P1占有P2的

hequnwang10的博客 7194

死锁演示及避免的策略

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

zuijiazhenrong的博客 344
上一篇: 挑战408——操作系统(12)——进程通信,管程介绍
下一篇: 挑战408——组成原理(9)——存储器简介
gzhosp_redAnt
博客等级 码龄10年 702粉丝 269原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值