银行家算法实现
银行家算法的实现

实验四银行家算法的实现1、实验目的通过编写和调试银行家算法的模拟程序以加深对避免死锁方案的理解。
熟悉银行家算法的分配思想。
2、实验要求设计一个银行家方案。
并编写模拟程序实现之。
已知系统总共的资源数、进程名、进程已分配的资源、进程运行完毕最大最资源的需求量,以书上例题为例,分析某一时刻系统是否会产生死锁。
3、算法描述银行家算法中数据结构如下:n :系统中的进程个数;m :系统中的资源类数。
1)Available(m):现有资源向量。
Available(j)=k表示k个未分配的j类资源2)Max(n,m):资源最大申请量矩阵。
Max(i,j)=k表示第i个进程在运行过程中对第j类资源的最大申请量为k。
3)Allocation(n,m):资源分配矩阵。
Allocation(i,j)=k表示进程i已占有k个j类资源。
4)Need(n,m):进程以后还需要的资源矩阵。
Need(i,j)=k表示进程i以后还需要k个第j类资源。
显然有Need[i,j]=Max[i,j]-Allocation[i,j]。
5)Request(n,m):进程申请资源矩阵。
Request(i,j)=k表示进程i申请k个第j类资源。
银行家算法思想如下:若进程i申请资源,申请资源向量为Request(i),则有如下资源分配过程:1)如果Request(i)〉Need(i),则报错返回。
2)如果Request(i)〉Avaliable,则进程i进入等待资源状态,返回。
3)假设进程进程i的申请已获批准,于是修改系统状态:Avaliable=Avaliable-Request(i)Allocation(i)=Allocation(i)+Request(i)Need(i)=Need(i)-Request(i)4)调用安全状态检查算法。
设Work(m)为临时工作向量。
初始时Work=Available。
令N={1,2,……n}。
寻求j∈N 使其满足:Need(j)<=Work,若不存在这样的j则转至3)。
银行家算法及代码实现

available[j]=available[j]-request[j]; allocation[i][j]+=request[j]; need[i][j]=need[i][j]-request[j]; //系统尝试把资源分配给请求的进程 }
void check() //安全算法函数 { int k,f,v=0,i,j; int work[m],a[m]; bool finish[m]; r=1; for(i=0;i<no1;i++) finish[i]=false; // 初始化进程均没得到足够资 源数并完成 for(i=0;i<no2;i++) work[i]=available[i];//work[i]表示可提供进程继续 运行的各类资源数 k=no1;
}
while(k>0); f=1; for(i=0;i<no1;i++) //判断是否所有的进程都完成 { if(finish[i]==false) { f=0; break; } } if(f==0) //若有进程没完成,则为不安全状态 { printf("系统处在不安全状态!"); r=0; } else { printf("\n系统当前为安全状态,安全序列为:\n"); for(i=0;i<no1;i++) printf("p%d ",a[i]); //输出安全序列 } }
excel 银行家算法

银行家算法(Banker's Algorithm)是一种用于避免死锁的资源分配算法,最初由Edsger Dijkstra 提出。
这个算法主要用于多道程序设计和并发系统,确保在分配资源时不会导致系统陷入不可解的等待环路。
在 Excel 中并没有直接提供银行家算法的实现,因为 Excel 不是一个操作系统。
然而,可以通过 Excel 的一些函数和公式来模拟这个算法的基本原理。
以下是一个简单的例子,演示如何使用 Excel 实现银行家算法的一部分。
假设有三种资源(A、B、C)和三个进程(P1、P2、P3)。
每个进程需要的资源如下:进程需要资源A 需要资源B 需要资源CP1 7 5 3P2 3 2 2P3 9 0 2现在,我们有一定数量的可用资源:可用资源资源A 资源B 资源C3 3 2我们可以使用 Excel 的一些函数来检查是否可以安全地分配资源,以避免死锁。
以下是一种可能的实现方法:1.使用 SUM 函数计算每个进程已分配的资源总和:这个公式计算了进程P1已分配的资源总和,B2:D2分别代表资源A、B、C 已分配的数量。
2.使用 SUM 函数计算每个资源的已分配总和:这个公式计算了资源A已分配的总和,B2:B4分别代表进程P1、P2、P3已分配的数量。
3.使用减法计算每个资源的可用数量:这个公式计算了资源A的可用数量,E2是资源A总数,F2是资源A已分配的总和。
4.使用 IF 函数检查是否满足银行家算法的条件:这个公式检查资源A是否足够分配给进程P4。
如果结果是"Safe",则说明可以安全分配;如果是"Unsafe",则说明分配这个资源会导致死锁。
这只是一个简单的演示,实际上,银行家算法涉及到更复杂的资源分配和回收机制。
在实际应用中,可能需要更多的列和更多的公式来模拟整个资源分配的过程。
c语言银行家算法

c语言银行家算法在C语言中实现银行家算法,首先需要了解该算法的基本概念和原理。
银行家算法是一种避免死锁的资源分配算法,它模拟了银行贷款的过程。
当一个进程请求资源时,系统先检查分配后是否安全,如果是,则分配资源。
否则,进程必须等待,直到足够的资源可用。
以下是一个简单的银行家算法的C语言实现:```c#include <stdio.h>#define MaxProcs 5#define MaxResources 3int Allocation[MaxProcs][MaxResources] = {0};int Max[MaxProcs][MaxResources] = {0};int Allocation[MaxProcs][MaxResources] = {0};int Available[MaxResources] = {0};int Need[MaxProcs][MaxResources] = {0};int Work[MaxResources] = {0};int safeSeq[MaxProcs] = {0};int count = 0;void calcNeed() {for (int p = 0; p < MaxProcs; p++) {for (int r = 0; r < MaxResources; r++) {Need[p][r] = Max[p][r] - Allocation[p][r];}}}void checkSafe() {int finish[MaxProcs] = {0};int k, j;for (k = 0; k < MaxProcs; k++) {safeSeq[k] = -1;}while (count < MaxProcs) {for (k = 0; k < MaxProcs; k++) {if (finish[k] == 0) {for (j = 0; j < MaxResources; j++) {if (Need[k][j] > Work[j]) {break;}}if (j == MaxResources) {for (j = 0; j < MaxResources; j++) {Work[j] += Allocation[k][j];safeSeq[count++] = k;finish[k] = 1;}}}}}if (count == MaxProcs) {printf("系统是安全的\n");} else {printf("系统是不安全的\n");}}```。
java银行家算法代码实现

java银行家算法代码实现=================一、算法简介------银行家算法是一种用于避免系统发生死锁的算法,它通过分析系统资源分配情况,判断系统是否处于安全状态,从而避免死锁的发生。
Java银行家算法是一种基于Java语言的实现,它通过模拟系统资源分配情况,判断系统是否处于安全状态。
二、算法实现------以下是一个简单的Java银行家算法代码实现:```javapublicclassBankerAlgorithm{//资源数量和最大需求量privateint[]resource=newint[10];//例如:包括x,y,z三种资源,分别对应i-x1-x2-z...-xi-yi-zi...privateint[]maxDemand=newint[10];privateint[]available=newint[10];//当前可用资源数量privateint[]allocation=newint[10];//当前已分配资源数量privateint[]need=newint[10];//当前进程需求量privateint[]saved=newint[10];//已保存的安全序列中最后一个进程的资源需求量privateint[]process=newint[5];//进程集合,包括进程编号和进程所需资源量privateint[]processMax=newint[5];//进程最大需求量集合privateint[]systemSafe=0;//系统是否处于安全状态的标志位privateinttotalSystemSafe=0;//总共是否有足够资源可以安全运行的标志位//初始化资源分配信息publicvoidinitialize(int[][]allocationMatrix){for(inti=0;i<allocationMatrix.length;i++){process[i]=allocationMatrix[i][0];//进程编号processMax[i]=allocationMatrix[i][1];//进程最大需求量available[i]=allocationMatrix[i][2];//当前可用资源数量need[i]=allocationMatrix[i][3];//当前进程需求量maxDemand[i]=allocationMatrix[i][4];//当前进程最大需求量}systemSafe=true;//系统默认处于安全状态totalSystemSafe=true;//总共是否有足够资源可以安全运行的标志位默认设置为true}//检查系统是否处于安全状态,并返回检查结果和可能的执行序列(从开始到结束)publicboolean[]checkAndPrintSafePath(){intcurrentSystemSafe=false;//检查后的系统是否处于安全状态的标志位boolean[]safePath=newboolean[process.length];//安全序列for(inti=0;i<process.length;i++){if(need[i]<=available[i]){//如果当前进程需要的资源小于等于当前可用资源数量,则可以继续执行下去safePath[i]=true;//将当前进程标记为已执行过,并加入到安全序列中available[i]-=need[i];//将当前可用资源数量减去当前进程的已分配量,表示系统多出来的资源数量为已分配的减去需求的currentSystemSafe=true;//将当前系统的安全状态标记为true,因为已经有至少一个进程能够执行下去了}else{//如果当前进程需要的资源大于当前可用资源数量,则需要检查系统是否有足够的资源可以继续执行下去intavailableSum=0;//系统剩余的可用资源数量之和for(intj=0;j<process.length;j++){//将所有可用资源的数量累加起来availableSum+=available[j];}if(availableSum>=processMax[i]){//如果系统剩余的可用资源数量之和大于等于当前进程的最大需求量,则系统可以继续执行下去,否则需要重新分配资源并返回结果重新开始执行安全序列为null;如果为空说明不满足要求否则输出一个安全的执行序列,开始输出可执行的进程数以及所分配的资源和后续的系统安全状态标记等信息totalSystemSafe=false;//将当前系统安全状态的标志位置为false,因为此时不满足安全状态的要求,需要重新开始执行程序,且此次循环的完整性和执行性需要考虑已经完成过的安全序列重新考虑这些因素的修改可能会被重用)确保安全性序列不再更改);再次输出完整的信息需要重新考虑这些因素以确保安全性序列不再更改)并返回结果;如果为true则说明系统已经处于安全状态并输出一个安全的执行序列;如果为false则说明。
银行家算法java代码

银行家算法java代码银行家算法是一种用于避免死锁的算法,它可以保证系统在分配资源时不会陷入死锁状态。
在操作系统中,银行家算法被广泛应用于进程调度和资源管理中。
本文将介绍银行家算法的原理和实现,并提供Java代码示例。
一、银行家算法原理银行家算法是基于资源分配图的理论基础上发展而来的。
资源分配图是描述进程和资源之间关系的一种图形表示方法。
在资源分配图中,每个进程和每个资源都表示为一个节点,进程需要的资源和已经被占用的资源之间连接一条边。
银行家算法通过模拟进程请求和释放资源的过程来判断是否会出现死锁。
当一个进程请求某些资源时,如果系统能够满足其请求,则该进程可以继续执行;否则,该进程必须等待直到有足够的资源可用。
当一个进程释放掉已经占用的某些资源时,系统会将这些资源重新分配给其他需要它们的进程。
为了避免死锁,银行家算法采取了预防措施:在分配任何一个新任务之前,先检查该任务所需求各类资料是否超过了系统现有的资料总量,如果超过了,则不予分配。
否则,再检查该任务所需求各类资料是否超过了系统现有的未分配资料总量,如果超过了,则不予分配。
二、银行家算法实现银行家算法的实现需要考虑以下几个方面:1.资源分配图的表示方法:可以使用邻接矩阵或邻接表来表示资源分配图。
2.进程请求和释放资源的模拟:可以使用数组来存储进程占用和需要的资源数量,并通过对数组的修改来模拟进程请求和释放资源的过程。
3.死锁检测:可以使用安全序列或银行家算法来判断是否会出现死锁。
下面是一个基于银行家算法实现的简单Java代码示例:public class BankerAlgorithm {// 进程数private int n;// 资源数private int m;// 各进程已占用资源数量private int[][] allocation;// 各进程尚需资源数量private int[][] need;// 系统剩余可用资源数量private int[] available;/*** 构造函数* @param n 进程数* @param m 资源数* @param allocation 各进程已占用资源数量* @param need 各进程尚需资源数量* @param available 系统剩余可用资源数量*/public BankerAlgorithm(int n, int m, int[][] allocation, int[][] need, int[] available) {this.n = n;this.m = m;this.allocation = allocation;this.need = need;this.available = available;}/*** 模拟进程请求资源* @param pid 进程ID* @param request 请求的资源数量* @return 是否满足请求*/public boolean requestResources(int pid, int[] request) { // 检查请求是否超过进程所需的资源数量for (int i = 0; i < m; i++) {if (request[i] > need[pid][i]) {return false;}}// 检查请求是否超过系统剩余的资源数量for (int i = 0; i < m; i++) {if (request[i] > available[i]) {return false;}}// 模拟进程占用资源的过程for (int i = 0; i < m; i++) {available[i] -= request[i];allocation[pid][i] += request[i];need[pid][i] -= request[i];}return true;}/*** 模拟进程释放资源* @param pid 进程ID* @param release 释放的资源数量*/public void releaseResources(int pid, int[] release) { // 模拟进程释放资源的过程for (int i = 0; i < m; i++) {available[i] += release[i];allocation[pid][i] -= release[i];need[pid][i] += release[i];}}/*** 判断系统是否安全* @return 是否安全*/public boolean isSafe() {// 初始化工作数组int[] work = new int[m];for (int i = 0; i < m; i++) {work[i] = available[i];}boolean[] finish = new boolean[n]; for (int i = 0; i < n; i++) {finish[i] = false;}// 查找可用的进程int count = 0;while (count < n) {boolean found = false;for (int i = 0; i < n; i++) {if (!finish[i]) {boolean canRun = true;for (int j = 0; j < m; j++) { if (need[i][j] > work[j]) { canRun = false;break;}}if (canRun) {finish[i] = true;found = true;count++;for (int j = 0; j < m; j++) {work[j] += allocation[i][j];}}}}if (!found) {return false;}}return true;}}三、总结银行家算法是一种重要的避免死锁的算法,它可以在系统分配资源时避免出现死锁状态。
c语言的银行家算法

c语言的银行家算法银行家算法是一种用于避免计算机系统发生死锁的算法,它被广泛应用于操作系统和数据库中。
然而,你知道吗,银行家算法还可以用于许多其他场合,例如在计算机科学和工程的其他领域中。
银行家算法的基本思想是通过保持一定的资源余量来避免死锁。
当一个进程需要申请资源时,银行家算法将根据现有资源的可用量以及未来的资源需求来决定是否批准该申请。
如果申请被批准,则资源余量减少;如果申请被拒绝,则系统需要重新考虑资源分配。
下面,我们将以C语言为例,演示如何实现银行家算法。
请注意,我们在此只提供一个简单的示例,实际应用中的银行家算法可能需要考虑更多的因素和更复杂的逻辑。
```c#include <stdio.h>#include <stdlib.h>// 定义资源类型和数量typedef enum {RESOURCE_TYPE1,RESOURCE_TYPE2,NUM_RESOURCES} ResourceType;const int RESOURCE_COUNT = 10; // 总资源数量const int MAX_REQUESTS = 10; // 最大请求数量// 进程状态和所需资源typedef struct Process {int id; // 进程IDint requested[NUM_RESOURCES]; // 已请求的资源数量int need[NUM_RESOURCES]; // 当前需要的资源数量int available[NUM_RESOURCES]; // 当前可用资源数量} Process;// 银行家算法函数int bankerAlgorithm(Process processes[], int n) {// ...省略具体实现...// 这里只是简单地返回一个标志位,表示是否成功避免死锁 return 0; // 成功避免死锁,否则返回非零值表示出现问题}int main() {// 初始化进程及其所需资源Process processes[] = {{1, {1, 0}, {2, 3}, {3, 4}}, // Process 1: 需要1个类型1的资源,2个类型2的资源{2, {3, 2}, {3, 2}, {3, 0}}, // Process 2: 需要2个类型1的资源,0个类型2的资源// 其他进程...};int n = sizeof(processes) / sizeof(Process);// 调用银行家算法函数进行资源分配决策int result = bankerAlgorithm(processes, n);if (result == 0) {printf("系统成功避免了死锁!\n");} else {printf("系统出现了问题,未能避免死锁!\n");}return 0;}```以上就是一个简单的C语言实现银行家算法的示例。
银行家算法python实现代码

银行家算法python实现代码以下是银行家算法的Python实现代码:def banker_algorithm(available, max_resources, allocated_resources, need_resources):n_resources = len(available)n_processes = len(max_resources)safe_sequence = []work = available.copy()finish = [False] * n_processeswhile False in finish:is_safe = Falsefor i in range(n_processes):if not finish[i] and all(need_resources[i][j] <= work[j] for j in range(n_resources)):work = [work[j] + allocated_resources[i][j] for j in range(n_resources)]finish[i] = Trueis_safe = Truesafe_sequence.append(i)if not is_safe:return Nonereturn safe_sequence该函数的参数如下:- available: 一个列表,表示可用的各类资源数量- max_resources: 一个二维列表,max_resources[i][j]表示进程i请求第j类资源的最大数量- allocated_resources: 一个二维列表,allocated_resources[i][j]表示进程i 已分配第j类资源的数量- need_resources: 一个二维列表,need_resources[i][j]表示进程i还需要第j 类资源的数量返回值为一个列表,表示安全的执行顺序,如果不存在安全的执行顺序,则返回None。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
银行家算法的模拟实现(实验三)一、设计目的1、了解多道程序系统中,多个进程并发执行的资源分配。
2、掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。
3、掌握预防死锁的方法,系统安全状态的基本概念。
4、掌握银行家算法,了解资源在进程并发执行中的资源分配策略。
5、理解死锁避免在当前计算机系统不常使用的原因。
二、设计任务①在Windows7系统的VS环境下运行程序;②通过最有代表性的避免死锁的算法(Dijkstra)的银行家算法程序实现来理解进程并发中的资源分配,死锁避免在死锁解决中的可行性;③设计程序在自动、手动方式下运行,理解银行家算法的实质。
三、设计内容与步骤A、银行家算法设计的知识准备。
1、死锁概念。
在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。
所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
2、关于死锁的一些结论:参与死锁的进程最少是两个(两个以上进程才会出现死锁)参与死锁的进程至少有两个已经占有资源参与死锁的所有进程都在等待资源参与死锁的进程是当前系统中所有进程的子集注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。
3、资源分类。
永久性资源:可以被多个进程多次使用(可再用资源)可抢占资源不可抢占资源临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等(可消耗性资源)“申请--分配--使用--释放”模式4、产生死锁的四个必要条件:互斥使用(资源独占)、不可强占(不可剥夺)、请求和保持(部分分配,占有申请)、循环等待。
1) 互斥使用(资源独占)一个资源每次只能给一个进程使用2) 不可强占(不可剥夺)资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放3) 请求和保持(部分分配,占有申请)一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)4) 循环等待存在一个进程等待队列{P1 , P2 , … , Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路5、死锁的解决方案5.1 产生死锁的例子申请不同类型资源产生死锁P1:…申请打印机申请扫描仪使用释放打印机释放扫描仪…P2:…申请扫描仪申请打印机使用释放打印机释放扫描仪…申请同类资源产生死锁(如内存)设有资源R,R有m个分配单位,由n个进程P1,P2,…,Pn(n > m)共享。
假设每个进程对R的申请和释放符合下列原则:* 一次只能申请一个单位* 满足总申请后才能使用* 使用完后一次性释放m=2,n=3资源分配不当导致死锁产生5.2死锁预防:定义:在系统设计时确定资源分配算法,保证不发生死锁。
具体的做法是破坏产生死锁的四个必要条件之一①破坏“不可剥夺”条件在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请②破坏“请求和保持”条件要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配③破坏“循环等待”条件采用资源有序分配法:把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配6.安全状态与不安全状态安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…Pn,则系统处于安全状态。
一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和,系统处于安全状态(安全状态一定是没有死锁发生的)不安全状态:不存在一个安全序列,不安全状态一定导致死锁。
B、银行家算法一、银行家算法中的数据结构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]二、银行家算法设Requesti是进程Pi的请求向量。
如果Requesti[j]=k,表示进程只需要k个Rj类型的资源。
当Pi发出资源请求后,系统按下述步骤进行检查:(1)如果Requesti[j]<=Need[i,j],则转向步骤2;否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Requesti[j]<=Available[j] ,则转向步骤3;否则,表示系统中尚无足够的资源,Pi必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available[j]:=Available[j]-Requesti[j];Allocation[i,j]:=Allocation[i,j]+Requesti[j];Need[i,j]:=Need[i,j]-Requesti[j];(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
三、安全性算法系统所执行的安全性算法可描述如下:(1)设置两个向量①、工作向量Work。
它表示系统可提供给进程继续运行所需要的各类资源数目,它含有m个元素,执行安全算法开始时,Work = Available。
②、Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]:=false ;当有足够资源分配给进程时,令Finish[i]:=true。
(2)从进程集合中找到一个能满足下述条件的进程:①、Finish[i]=false; ②、Need[i,j]<=Work[j];如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work[j]:=Work[i]+Allocation[i,j];Finish[i]:=true;goto step 2;(4)如果所有进程的Finish[i]:=true,则表示系统处于安全状态;否则,系统处于不安全状态。
四、银行家算法之例假定系统中有五个进程:{P0,P1,P2,P3,P4}和三种类型的资源{A,B,C},每一种资源的数量分别为10、5、7,在T0时刻的资源分配情况如下图所示。
资源情况进程(1)T0时刻的安全性:(2)利用安全性算法对T0时刻的资源分配情况进行分析可知,在T0时刻存在着一个安全序列{P1,P3,P4,P2,P0},故系统是安全的。
(2) P1请求资源:P1发出请求向量Request1(1,0,2),系统按银行家算法进行检查:①Request1(1,0,2)<=Need1(1,2,2)②Request1(1,0,2)<=Available1(3,3,2)③系统先假定可为P1分配资源,并修改Available,Allocation1和Need1向量,由此形成资源变化情况如图1中的圆括号所示。
④再利用安全性算法检查此时系统是否安全。
如图3所示。
资源情况进程由所进行的安全性检查得知,可以找到一个安全序列{P1,P3,P4,P2,P0}。
因此系统是安全的,可以立即将P1所申请的资源分配给它。
(3) P4请求资源:P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:①Request4(3,3,0)≤Need4(4,3,1);②Request4(3,3,0)不小于等于Available(2,3,0),让P4等待。
系统相应如图:(4) P0请求资源:P0发出请求向量Request0(0,2,0),系统按银行家算法进行检查。
①Request0(0,2,0) ≤Need0(7,4,3);②Request0(0,2,0) ≤Available(2,3,0);故可将资源分配给它,但将会出现死锁情况系统反应如下:(5)进行安全性检查:可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。
(6)程序代码:详情见压缩文件中Banker_Problem.cpp四、测试与评价1、程序运行及结果测评:在自动、手动方式下都能正确得出结果,但在自动模式下,当值MY_MAX增大时,计算时间长,增加了系统的开销,这也就说明了在实际系统中不常用银行家算法――死锁避免在死锁解决中的这一原因。
2、程序框架测评:主要使用了函数将每个模块分开,便于理解。
但由于,程序设计了自动实现模式,导致程序显得过长。
每个模块之间的信息交换主要通过全局变量平实现,从这个角度讲,模块的划分并不严格。
对于自动与手动这两种工作方式,解题思路是冗余的,但程序却为了避免之间的干扰冗余设计了函数,因而各个函数内聚度不高,功能也还有相容点,所以在函数设计也不十分合理。
尽管如此,本设计严格从银行家算法出发,能很好地帮助读者理解银行家算法在多进程并行为死锁避免采取的资源分配、安全性检测的策略。
特别,在自动方式下,资源分配利用第一次安全检测的结果避免了后继执行进程的不确定,有效地解决了自动请求的过重盲目的特点。
当然,这部分有违银行家算法,但并没有增加额外的空间开销,还减少了时间上的开销,个人觉得是成功的。
3、设计特点①数据结构:数组;②全局变量③在自动方式下,采用do{}while(条件)以保证进程能够推进。