银行家算法是一种用来避免操作系统死锁出现的有效算法,所以在引入银行家算法的解释之前,有必要简单介绍下死锁的概念。

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

死锁的发生必须具备以下四个必要条件:

1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不抢占条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

4)循环等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

避免死锁算法中最有代表性的算法就是Dijkstra E.W 于1968年提出的银行家算法,银行家算法是避免死锁的一种重要方法,防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。

为实现银行家算法,系统必须设置若干数据结构,同时要解释银行家算法,必须先解释操作系统安全状态和不安全状态。

安全序列:是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。

不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。

数据结构:
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的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。
4)需求矩阵Need

这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

下面是三者之间的关系:

Need[i,j]=Max[i,j]-Allocation[i,j]

银行家算法:

设Request(i)是进程Pi的请求向量,如果Request(i)[j]=k,表示进程Pi需要K个R(j)类型的资源。当Pi发现资源请求后系统将进行下列步骤

(1)如果Request(i)[j] <= Need[i,j],边转向步骤2),否则认为出错,因为它所请求的资源数已超过它所宣布的最大值。

(2)如果Request(i)[j] <= Available[i,j],便转向步骤3),否则,表示尚无足够资源,Pi需等待。

(3)系统试探着把资源分配给进程Pi,并需要修改下面数据结构中的数值;

Available[j] = Available[j] - Request(i)[j];

Allocation[i,j] = Allocation[i,j] + Request(i)[j];

Need[i,j] = Need[i,j] - Request(i)[j];

说了这么多基本的概念,下面就让我们通过实际案例来体会银行算法吧。

银行家算法之例:

解析:

从图中数据我们可以利用银行家算法的四个数据结构,来描述当前的系统状态

Max

Allocation

Need

Available

A

B

C

A

B

C

A

B

C

A     B     C

P1

5

5

9

2

1

2

3

4

7

2     3      3

P2

5

3

6

4

0

2

1

3

4

P3

4

0

11

4

0

5

0

0

6

P4

4

2

5

2

0

4

2

2

1

P5

4

2

4

3

1

4

1

1

0

因为系统资源R=(17,5,20)而系统分配给这几个线程的资源为Allocation=(15,2,17) 则可以求出Available=(2,3,3)

(1)在T0时刻,由于Availabel大于等于Need中 P5 所在行的向量,因此Availabel能满足 P5 的运行,在 P5 运行后,系统的状态变更为如下图所示:

Work

Need

Allocation

Work+Allocation

finsh

A

B

C

A

B

C

A

B

C

A

B

C

P5

2

3

3

1

1

0

3

1

4

5

4

7

true

P4

5

4

7

2

2

1

2

0

4

7

4

11

true

P3

7

4

11

0

0

6

4

0

5

11

4

16

true

P2

11

4

16

1

3

4

4

0

2

15

4

18

true

P1

15

4

8

3

4

7

2

1

2

17

5

20

true

因此,在T0时刻,存在安全序列:P5,P4,P3,P2,P1(并不唯一)

(2)P2请求资源,P2发出请求向量Request(i)(0,3,4),系统根据银行家算法进行检查;

① P2 申请资源Reuqest(i)(0,3,4)<=Need中 P2 所在行向量Need(i)(1,3,4)

② P2 申请资源Reuqest(i)(0,3,4)>=可以利用资源向量Availabel(2,3,3),所以,该申请不给于分配

(3)P4请求资源,P4发出请求向量Request(i)(2,0,1),系统根据银行家算法进行检查;

①Reuqest(i)(2,0,1)<= Need(i)(2,2,1)

② Reuqest(i)(2,0,1 <= Availabel(2,3,3)

③对 P4 的申请(2,0,1)进行预分配后,系统的状态为:

Max

Allocation

Need

Available

A

B

C

A

B

C

A

B

C

A    B   C

P1

5

5

9

2

1

2

3

4

7

0   3    2

P2

5

3

6

4

0

2

1

3

4

P3

4

0

11

4

0

5

0

0

6

P4

4

2

5

4

0

5

0

2

0

P5

4

2

4

3

1

4

1

1

0

可利用资源向量Availabel=(0,3,2),大于Need中 P4 所在行的向量(0,2,0),因此可以满足 P4 的运行。P4 运行结束后,系统的状态变为:

Work

Need

Allocation

Work+Allocation

finsh

A

B

C

A

B

C

A

B

C

A

B

C

P4

0

3

2

0

2

0

4

0

5

4

3

7

true

P5

4

3

7

1

1

0

3

1

4

7

4

11

true

P3

7

4

11

0

0

6

4

0

5

11

4

16

true

P2

11

4

16

1

3

4

4

0

2

15

4

18

true

P1

15

4

18

3

4

7

2

1

2

17

5

20

true

同理依次推导,可计算出存在安全序列P4,P5,P3,P2,P1(并不唯一)

(4)P1请求资源,P1发出请求向量Request(i)(0,2,0),系统根据银行家算法进行检查;

①Request(i)(0,2,0)<= Need(i)(3,4,7)

② Request(i)(0,2,0)<= Availabel(2,3,3)

③对 P1 的申请(0,2,0)进行预分配后,系统的状态为:

Max

Allocation

Need

Available

A

B

C

A

B

C

A

B

C

A  B  C

P1

5

5

9

2

3

2

3

2

7

0  1  2

P2

5

3

6

4

0

2

1

3

4

P3

4

0

11

4

0

5

0

0

6

P4

4

2

5

2

0

4

2

2

1

P5

4

2

4

3

1

4

1

1

0

由于Availabel不大于等于 P1 到 P5 任一进程在Need中的需求向量,因此系统进行预分配后

处于不安全状态,所以对于 P1 申请资源(0,2,0)不给予分配。

注意:因为(4)是建立在第(3)问的基础上的所以Available=(0,3,2)-(0,2,0)=(0,1,2)

总结:通过上述的解释,我相信大家对理解这种类似的题目应该游刃有余了吧,如果实在不懂的话那我就推荐一个网站,那里面有个专门讲这个银行家算法的案例,个人觉得比较详细,

银行家算法视频

银行家算法---------概念举例相关推荐

  1. 银行家算法(战争举例、便于理解)

    1 银行家算法 操作系统的进程可以动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性.(若此次分配为安全的,操作系统则将资源分配给进程,否则令进程等待) 避免死锁的实质在于:系统在 ...

  2. 【避免进程死锁】银行家算法

    一.概述 银行家算法(Banker's Algorithm)是一个避免进程死锁的著名算法,由 Dijkstra 于 1965 年提出.本文为笔者的读书笔记,结构如下: 死锁 银行家算法 例子展示 补充 ...

  3. python银行家算法_Linux 死锁概念与银行家算法python 实现

    一 . 死锁的概念 接上篇 http://shaobaobaoer.cn/archives/680/linux-process-manager-note 在之前的哲学家吃饭的问题中,当每个哲学家都想进 ...

  4. 操作系统概念 银行家算法

    1.死锁产生的四个条件 互斥:一次只能有一个进程使用资源. 占有并等待:拥有至少一个资源的进程正在等待获取其他进程拥有的其他资源. 非抢占:资源只能在拥有资源的进程完成其任务后才自动释放. 循环等待: ...

  5. 【银行家算法-安全性算法】

    1. 银行家算法 介绍 银行家算法是最具代表性的避免死锁的算法,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态则分配,否则等待. 银行 ...

  6. python银行家算法代码_避免死锁的银行家算法C++程序实现

     本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...

  7. 操作系统之银行家算法—详解流程及案例数据

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  8. 银行家算法实验报告c语言版,银行家算法实验报告C语言版.doc

    <操作系统>课程综合性实验报告 姓名: 学号: 2016 年 11 月 20 日 实验题目进程调度算法程序设计一.实验目的 通过对安全性算法和银行家算法的模拟,进一步理解资源分配的基本概念 ...

  9. 银行家算法总结及实现

    QUESTION:银行家算法总结及实现? 目录 QUESTION:银行家算法总结及实现? ANSWER: 一:银行家算法介绍 1.1什么是银行家算法 1.2背景 1.3数据结构 1.4算法分析 二:安 ...

最新文章

  1. 《设备调试与网络优化》教学讲义(二)
  2. swing 之FlowLayout 实现自动换行和滚动条添加
  3. python自动化可以做什么菜_用 Python 自动化办公能做到哪些有趣或有用的事情?...
  4. Docker操作命令详解
  5. boost::gil模块数字扩展中的 resize_view() 示例
  6. 大数据WEB阶段(九)Myeclipse中配置Tomcat并发布项目
  7. ThinkPHP5.0.5RCE
  8. springboot配置mybatis
  9. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
  10. 解读设计模式----简单工厂模式(SimpleFactory Pattern),你要什么我就给你什么
  11. php量表是什么心理量表,心理学中的“5大心理学测评量表”你知道多少?
  12. 如何利用docker 构建golang线上部署环境
  13. linux tar命令压缩_Linux tar命令来压缩和提取文件
  14. RT-Thread源码获取--Keil官网和GitHub
  15. 如何删除win10的windows.old
  16. linux vi字体大小,设置VIM字体大小
  17. 笔记本 亮度 无法调解
  18. transformers5--t5模型中encoder与decoder内容不同解读
  19. Socket学习总结系列(一) -- IM Socket
  20. FAQ是什么?如何高效地打造一个好的FAQ?

热门文章

  1. 相位对焦 反差对焦_HTML5自动对焦属性
  2. 性能测试中如何分析查看网络带宽占用情况
  3. sugarcrm连接mysql_php – 命令不同步;你现在无法使用mysql存储过程在SugarCRM中运行此命令...
  4. ROS下载、安装与配置
  5. 软件测试app内存溢出,检测APP内存溢出LeakCanary
  6. 关于visual studio 2015 ctrl+鼠标左键定位问题
  7. 甘肃省计算机二级考试试题,2013甘肃省计算机等级考试试题 二级ACCESS最新考试试题库(完整版)...
  8. java世界神奇“+”的学习
  9. 人工智能还不错,人工智障就算了
  10. 高效Android开发者必须知道的4个工具