没有合适的资源?快使用搜索试试~ 我知道了~
银行家算法(Banker’s Algorithm)是一种避免死锁(Deadlock)的资源分配策略。它通过检测系统状态是否处于安全状态来确保资源分配不会导致死锁。如果一个系统状态是安全的,那么就可以分配资源而不会导致死锁。如果系统状态不安全,则不分配资源。 算法步骤 初始化:系统启动时,每个进程都会声明其最大资源需求量。 安全性检查:在系统运行过程中,每次资源分配前,都要进行安全性检查。安全性检查的目的是确保系统不会因为资源分配而进入不安全状态。 资源分配:如果安全性检查通过,系统将分配所需资源给进程。 执行:进程使用分配的资源进行计算。 回收:进程完成后,释放其占用的所有资源。 重复:重复步骤2到5,直到所有进程都完成。 安全性检查 安全性检查是通过比较当前系统状态与一个安全状态来判断的。一个系统状态是安全的,当且仅当存在一个资源分配序列,使得每个进程都可以顺利完成。 为了进行安全性检查,我们需要定义两个概念: 工作负载: 一组进程的最大资源需求。 可用资源: 系统当前可用的资源。 一个状态是安全的,当且仅当对于每个进程,其最大需求都可以由当前可用资源满足
资源推荐
资源详情
资源评论
银行家算法详解及示例代码
1 需求分析
1.1 银行家算法的实现思想
允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全
性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的
资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配
资源,让进程等待。
1.2 死锁的概念
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造
成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态
或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
银行家算法是避免死锁的一种重要方法。 操作系统按照银行家制定的规则为进程分配资
源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可
以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继
续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程
对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否
满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分
配。
1.3 产生死锁的必要条件
① 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一
个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程
用毕释放。
② 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资
源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
③ 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时
由自己释放。
④ 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合
{P0,P1,P2,···,Pn}中的 P0 正在等待一个 P1 占用的资源;P1 正在等待 P2 占用的资
源,……,Pn 正在等待已被 P0 占用的资源。
1.4 功能实现
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
解除死锁。所以,在系统设计、进程调度等方面注意如何能够不让这四个必要条件成立,
如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于
等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源
申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则
不予分配,否则予以分配 。因此,对资源的分配要给予合理的规划。
2 概要设计
2.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 的矩阵,它定义了系统中每一类资源当前已分配
给每一进程的资源数。如果 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]
2.2 设计思路
第一部分:银行家算法模块
1.如果 Request<=Need,则转向 2;否则,出错
2.如果 Request<=Available,则转向 3,否则等待
3.系统试探分配请求的资源给进程
4.系统执行安全性算法
第二部分:安全性算法模块
1. 设置两个向量
① 工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
② Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为 False
2. 若 Finish[i]=False&&Need<=Work,则执行 3;否则执行 4(i 为资源类别)
3. 进程 P 获得第 i 类资源,则顺利执行直至完成,并释放资
源: Work=Work+Allocation; Finish[i]=true;转 2
4. 若所有进程的 Finish[i]=true,则表示系统安全;否则,不安全!
3 详细设计
在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据
检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配 。
因此,对资源的分配要给予合理的规划。
3.1 银行家算法
设 Request i 是进程 Pi 的申请向量,如果 Request i[j]=K,则表示进程 Pi 需要 K 个 Rj 类型的
资源。当 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];
4) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将
资源分配给进程 Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分
配状态,让进程 Pi 等待。
3.2 安全性算法
系统所执行的安全性算法可描述如下:
1) 设置两个向量
① 工作向量 Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有 m
个元素,在执行安全算法开始时,Work:=Available。
② Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做
Finish[i]:=false;当有足够资源分配给进程时,再令 Finish[i]:=ture.
2) 从进程集合中找到一个满足下述条件的进程:
① Finish[i]=false;
② Need[i,j]<=Work[j];若找不到,执行步骤 3),否则,执行步骤 4)。
3) 当进程 Pi 获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执
行:
Work[j]:=Work[j]+Allocation[i,j];
Finish[i]:=true;
Go to step 2;
4) 如果所有进程的 Finish[i]=true 都满足,则表示系统处于安全状态;否则,系统处于不安
全状态。
剩余15页未读,继续阅读
资源评论
奔向理想的星辰大海
- 粉丝: 4939
- 资源: 28
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功