博客
关于我
操作系统常问面试问题 3 —— 死锁(deadlock)(产生的条件、死锁避免(银行家算法)、死锁检测)
阅读量:530 次
发布时间:2019-03-08

本文共 3231 字,大约阅读时间需要 10 分钟。

死锁(产生的条件、死锁避免(银行家算法)、死锁检测)

死锁(deadlock)

1、定义

在这里插入图片描述

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

2、产生的条件

  • 1、互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源;
  • 2、请求和保持条件:进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但该进程不会释放自己已经占有的资源
  • 3、不可剥夺条件:进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放
  • 4、环路等待条件:进程发生死锁后,必然存在一个进程-资源之间的环形链 ,环路中每个进程都在等待下一个进程所占有的资源

发生死锁时,上面的情况必须同时会发生。如果其中任意一个条件不会成立,死锁就不会发生。可以通过破坏其中任意一个条件来破坏死锁,下面这些破坏条件就是我们探讨的重点

3、死锁避免

  • 1、破坏请求和等待条件。 所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源
  • 2、破坏不可抢占条件。当进程新的资源未得到满足时,释放已占有的资源
  • 3、破坏环路等待条件。 系统给每类资源赋予一个序号,每个进程按编号递增的请求资源,释放则相反

3.1、银行家算法

1、问题:

一个银行家共有20亿财产第一个开发商:已贷款15亿,资金紧张还需3亿。第二个开发商:已贷款5亿,运转良好能收回。第三个开发商:欲贷款18亿

在这种情况下,如果你是银行家,你怎么处理这种情况?一个常规的想法就是先等着第二个开发商把钱收回来,然后手里有了5个亿,再把3个亿贷款给第一个开发商,等第一个开发商收回来18个亿,然后再把钱贷款给第三个开发商。

这里面什么值得学习呢?最重要的就是眼光放长一点,不要只看着手里有多少钱,同时要注意到别人欠自己的钱怎么能收回来。

2、银行家算法的实现思想

允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。

3.1.1、实现过程

1、数据结构

  • 1、 可利用资源向量Available。这是一个含有m个元素的数组,其中的而每一个元素代表一类可利用资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态的改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。

  • 2、 最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K;则表示进程i需要Rj类资源的最大数目为K。

  • 3、 分配矩阵Allocation。这也是一个n*m的矩阵,它