解决进程死锁——银行家算法透析

Jacquelyn38
• 阅读 1784

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

避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的

银行家算法:

下面我们将从例题中一点一点的分析:

解决进程死锁——银行家算法透析

解题:

第一步:**求出初始剩余资源数**

图中有四种资源,分别是 A、B、C、D。题中只是给出了每个资源的总数量,没有给出剩余资源数(一般题中会给出),那么我们将它求出,每个资源总数减去每个资源已被分配资源数就得到各自资源的剩余资源数。

这里得出的是:

A 资源已被分配2,

B资源已被分配6,

C资源已被分配12,

D资源已被分配12。

那么总数量减去已被分配的得出:

A资源 3-2=1

B资源 12-6=6

C资源 14-12=2

D资源 14-12=2

最后得到初始剩余资源数(1,6,2,2

第二步:**求出各个进程的需求资源数量**

解决进程死锁——银行家算法透析

第三步:**比较**

我们先检查A选项

P1 P4 P5 P2 P3

第一个是 进程P1

我们可以在第二步看出

进程P1需求的资源数量为 (0,0,1,2)

那么初始初始剩余资源数 (1,6,2,2) 每个值大于 (0,0,1,2),那么P1是安全序列。

第二个是 进程P4

我们将上一个进程的剩余资源数 (1,6,2,2) 加上上一个进程的已分配资源数量 (0,0,3,2) 得出剩余资源量 (1,6,5,4)

将剩余资源量 (1,6,5,4)与P4需求资源量 (0,6,5,2) 相比较,每个值都大于。那么P4是安全序列

第三个是 进程P5

我们将上一个进程的 剩余资源量 (1,6,5,4)加上上一个进程的已分配资源数量 (0,3,3,2)得出剩余资源数

(1,9,8,6)

将剩余资源数 (1,9,8,6) 与P5需求资源量 (0,6,5,6)相比较,每个值都大于。那么P5是安全序列

第四个是进程P2

我们将上一个进程的 剩余资源量 (1,9,8,6)加上上一个进程的已分配资源数量 (0,0,1,4)得出剩余资源数

(1,9,9,10)

将剩余资源数 (1,9,9,10)与P2需求资源量 (1,7,5,0) 相比较,每个值都大于。那么P2是安全序列

最后一个是进程P3

我们将上一个进程的 剩余资源量 (1,9,9,10)加上上一个进程的已分配资源数量 (1,0,0,0)得出剩余资源数

(2,9,9,10)

将剩余资源数 (2,9,9,10)与P3需求资源量 (2,3,5,6) 相比较,每个值都大于。那么P3是安全序列

那么A选项正确

按照这个思路,B选项也正确,B选项只是将进程P5跟P2调换了位置。

其余不正确。

总结:

剩余的资源数大于或者等于进程需求的资源数才是安全序列。

剩余的资源数: 剩余资源数量=资源的数量-已分配资源数量

需求资源数: 最大资源需求量-已分配资源数量

本文转转自微信公众号前端历劫之路原创https://mp.weixin.qq.com/s/Sq6tLFeFxdzWBLV4Ln1EPQ,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Wesley13 Wesley13
2年前
MySQL 5.6.35 索引优化导致的死锁案例解析
一、背景随着公司业务的发展,商品库存从商品中心独立出来成为一个独立的系统,承接主站商品库存校验、订单库存扣减、售后库存释放等业务。在上线之前我们对于核心接口进行了压测,压测过程中出现了MySQL5.6.35死锁现象,通过日志发现引发死锁的只是一条简单的sql,死锁是怎么产生的?发扬技术人员刨根问底的优良传统,对于这次死锁原因进行了细致的排
Stella981 Stella981
2年前
PostgreSQL死锁进程及慢查询处理
1、死锁进程查看:SELECTFROMpg_stat_activityWHEREdatname'数据库名称'andwaitingtrue;pid进程id。2、慢查询SQL:selectdatname,pid,usename,application_name,client_addr,client
Wesley13 Wesley13
2年前
Mysql 死锁的详细分析方法
 用数据库的时候,偶尔会出现死锁,针对我们的业务系统,出现死锁的直接结果就是系统卡顿、客户找事儿,所以我们也在想尽全力的消除掉数据库的死锁。_出现死锁的时候,如果只是想解锁,用showfullprocesslist看下kill掉就好了,__如果想查找到详细的问题,一个办法是用showengineinnodbstatus来查看简略
Wesley13 Wesley13
2年前
Unity C# lock关键字的坑
Unity5.6环境下的lock关键字,在特定的多线程环境下会死锁崩溃其中一种情况:异步socket操作,由于内部是一个线程池回调的异步回调,操作同一个对象时lock关键字会概率出现死锁闪退,(发现现象的例子是服务器不断重启或者WIFI断开打开,导致连接断开客户端异步任务大量要在主线程执行导致闪退,而主线程保证线程安全的是用关键字l
Wesley13 Wesley13
2年前
2万字Java并发编程面试题整理(含答案,建议收藏)
Java并发编程1、在java中守护线程和本地线程区别?2、线程与进程的区别?3、什么是多线程中的上下文切换?4、死锁与活锁的区别,死锁与饥饿的区别?5、Java中用到的线程调度算法是什么?6、什么是线程组,为什么在Java中不推荐使用?7、为什么使用Executor框架?8、在Java
Wesley13 Wesley13
2年前
Java多线程之死锁编码及定位分析
目录死锁是什么代码实现死锁解决办法1\.死锁是什么死锁是指两个或两个以上的进程在执行过程中因争夺资而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源允是,进程的资源请求都能够得到满是,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。2.代码实现代码实现import
Wesley13 Wesley13
2年前
Oracle死锁查询及处理
Oracle死锁查询及处理2011年08月13日11:43:37阅读数:136295一、数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。二、死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语
Wesley13 Wesley13
2年前
Java并发编程之锁的活跃性问题
引子在安全性和活跃性之间通常存在一种制衡。当我们使用锁来保证线程的安全的同时,如果过度使用加锁,可能会导致死锁。应用无法从死锁中恢复过来,所以在设计时一定要避免会排除这些可能会出现的活跃性问题。死锁死锁描述了这样一种情景,两个或多个线程永久阻塞,互相等待对方释放资源如果线程1锁住了A,然后尝试对B进行加锁,同