操作系统 预防进程死锁的银行家算法 java版
避免死锁之银行家算法
避免死锁之银行家算法分类:Operating System2013-12-28 01:14 922人阅读评论(0) 收藏举报目录(?)[+]上篇博客中进程管理之死锁我们讲到了进程管理中死锁的各种问题,其中留下了死锁避免算法中著名的银行家算法没讲,下面就为大家详细解读。
1.安全序列讲银行家算法之前,我们首先引入安全序列的定义:所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{P1,P2,...,Pn}就是安全序列。
如果存在这样一个安全序列,则系统是安全的;如果系统不存在这样一个安全序列,则系统是不安全的。
安全序列{P1,P2,...,Pn}是这样组成的:若对于每一个进程Pi,它需要的附加资源可以被系统中当前可用资源加上所有进程Pj当前占有资源之和所满足,则{P1,P2,...,Pn}为一个安全序列,这时系统处于安全状态,不会进入死锁状态。
虽然存在安全序列时一定不会有死锁发生,但是系统进入不安全状态(四个死锁的必要条件同时发生)也未必会产生死锁。
当然,产生死锁后,系统一定处于不安全状态。
2.银行家算法(为了熟悉英语请原谅我借用wiki上的文字来描述)For the Banker's algorithm to work, it needs to know three things:∙How much of each resource each process could possibly request[CLAIMS]∙How much of each resource each process is currently holding[ALLOCATED]∙How much of each resource the system currently has available[AVAILABLE]Resources may be allocated to a process only if it satisfies the following conditions:∙request ≤ max, else set error condition as process has crossed maximum claim made by it.∙request ≤ available, else process waits until resources are available.Basic data structures to be maintained to implement the Banker's Algorithm:∙Available: A vector of length m indicates the number of available resources of each type. If Available[j] = k, there are kinstances of resource type Rj available.∙Max: An n×m matrix defines the maximum demand of each process. If Max[i,j] = k, then Pi may request at most k instances of resource type Rj.∙Allocation: An n×m matrix defines the number of resources of each type currently allocated to each process. If Allocation[i,j] = k, then process Pi is currently allocated k instance of resourcetype Rj.∙Need: An n×m matrix indicates the remaining resource need of each process. If Need[i,j] = k, then Pi may need k moreinstances of resource type Rj to complete task.Note: Need[i,j] = Max[i,j] - Allocation[i,j].∙银行家算法:设进程i提出请求Request[j],则银行家算法按如下规则进行判断。
操作系统银行家算法(避免死锁)实验报告
操作系统实验:银行家算法姓名:李天玮班级:软工1101 学号:201126630117 实验内容:在windows系统中实现银行家算法程序。
实现银行家算法所用的数据结构:假设有5个进程3类资源,则有如下数据结构:1.MAX[5,3] 5个进程对3类资源的最大需求量。
2.A V AILABLE[3]系统可用资源数。
3.ALLOCATION[5,3]5个进程已经得到3类资源的资源量。
4.NEED[5,3]5个进程还需要3类资源的资源量。
银行家算法:设进程1提出请求Request[N],则银行家算法按如下规则进行判断。
(1)如果Request[N]<=NEED[1,N],则转(2);否则,出错。
(2)如果Request[N]<=A V ALIABLE,则转(3);否则,出错。
(3)系统试探非配资源,修改相关数据。
A V ALIABLE=A V ALIABLE-REQUESTALLOCATION=ALLOCA TION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
安全性检查:(1)设置两个工作向量WORK=A V AILABLE;FINISH[M]=FALSE.(2)从晋城集合中找到一个满足下述条件的进程,FINISH[i]=FALSENEED<=WORK如找到,执行(3);否则,执行(4)。
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATIONFINISH[i]=TRUEGOTO(2)(4)如所有进程FINISH[M]=TRUE,则表示安全;否则系统不安全。
1.用init()函数对于数据的初始化关键代码:#define M 5#define N 3void init(){cout<<"请输入5个进程对3类资源最大资源需求量:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>MAX[i][j];}//cout<<endl;}cout<<"请输入系统可用的资哩源数:"<<endl;for(int j=0;j<N;j++){cin>>AVAILABLE[j];}cout<<"请输入5个进程已经-的到的3类资源的资源量:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>ALLOCATION[i][j];}//cout<<endl;}cout<<"请?输?入?5个?进?程ì还1需è要癮3类え?资哩?源′的?资哩?源′量?:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>NEED[i][j];}//cout<<endl;}}// Stack around the variable 'AVAILABLE' was corrupted.显示数据详细信息进行测试输入一号进程号,并给需要申请资源设定为{1,0,2}检验错误输入时候的报错信息检验当再次申请0号资源并申请资源数目为{0,2,0}时,系统提示系统不安全申请不成功。
操作系统 预防进程死锁的银行家算法 java版
实验三预防进程死锁的银行家算法1、实验目的通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
2、试验内容问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。
假设系统中有n个进程P1, … ,P n,有m类可分配的资源R1, … ,R m,在T0时刻,进程P i分配到的j类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。
3、程序要求:1)判断当前状态是否安全,如果安全给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后系统是否安全。
3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全,输出安全的进程序列,不安全则提示信息。
4、需求分析(1) 输入的形式和输入值的范围输入进程的数目输入资源的种类每个进程最多所需的各类资源数(Max[i][j])每个进程已经分配的各类资源数(Allocation[i][j])各个资源现有的数目(Available[][])(2) 输出的形式如果安全,输出安全的进程序列,不安全则提示信息。
(3)测试用例5、调试分析通过本次实验可知,用银行家算法避免死锁就是在资源所能承受范围内给需要资源的进程分派所需资源,在分派资源时若请求资源超出所需资源或超出可得资源,则不合条件,则让当前进程等待换下一个进程,若可利用资源已经满足任何一个进程所需,则系统不安全并且系统不分配资源;在安全性检验时,若可利用资源已经满足任何一个进程所需,则系统不安全并且系统不分配资源。
免死锁属于事先预防的策略,在资源的动态分配过程中用某种方法去防止系统进入不安全状态,从而避免死锁发生。
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;}}三、总结银行家算法是一种重要的避免死锁的算法,它可以在系统分配资源时避免出现死锁状态。
操作系统课设(模拟实现银行家算法实现死锁避免)
计算机与信息工程系《计算机系统与系统软件》课程设计报告题目:模拟实现银行家算法实现死锁避免专业:信息管理与信息系统班级:信管082班学号:姓名:指导老师:2010年9 月9 日一、实验题目模拟实现银行家算法实现死锁避免二、目的:1、了解进程产生死锁的原因,了解为什么要进行死锁的避免。
2、掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。
三、内容:模拟实现银行家算法实现死锁避免。
要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。
四、实验提示:1、整个银行家算法的思路。
先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。
2、算法用到的主要数据结构和C语言说明。
(1)、可利用资源向量INT A V AILABLE[M] M为资源的类型。
(2)、最大需求矩阵INT MAX[N][M] N为进程的数量。
(3)、已分配矩阵INT ALLOCA TION[N][M](4)、还需求矩阵INT NEED[N][N](5)、申请各类资源数量int Request[x]; //(6)、工作向量int Work[x];(7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是3、银行家算法(主程序)(1)、系统初始化。
输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等(2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。
(3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。
如果条件不符则提示重新输入,即不允许索取大于需求量(4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=A V ALIABLE[I,J]。
银行家算法例题具体步骤
银行家算法例题具体步骤
银行家算法是一种避免死锁的著名算法,主要应用于避免操作系统中的死锁问题。
以下是使用银行家算法解决死锁问题的一个具体例子:假设系统中有三种类型的资源(A、B、C)和五个进程(P1,P2,P3,P4,P5),A资源的数量是17,B资源的数量是6,C资源的数量为19。
首先,我们需要确定各进程对各类资源的最大需求量。
在这个例子中,我们已经知道P1需要(0、0、6),P2需要(1、0、0),P3需要(0、1、2),P4需要(3、4、7),P5需要(0、3、5)。
然后,我们需要计算每个进程已分配的资源向量和当前资源剩余向量。
这些向量通常可以通过系统当前的资源分配情况进行计算。
接下来,我们需要判断系统当前是否处于安全状态。
如果系统处于安全状态,则意味着系统能够满足所有进程的请求而不会发生死锁。
否则,系统处于不安全状态,需要采取措施避免死锁的发生。
具体来说,我们可以使用银行家算法来计算安全序列。
安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
在这个例子中,存在一个安全序列:P1-P3-P2-P4-P5。
这意味着按照这个序列执行进程是安全的,不会发生死锁。
如果系统处于不安全状态,则需要重新调整资源分配或者采取其他措施来避免死锁的发生。
需要注意的是,银行家算法是一种理论上的算法,实际应用中还需要
考虑其他因素,比如资源的动态分配和请求的实时性等。
因此,在实际应用中需要根据具体情况进行调整和改进。
计算机操作系统课程设计(JAVA语言)计算机操作系统银行家算法实现
操作系统课程设计报告题目:银行家算法的设计与实现院(系):计算机科学与工程学院专业:信息对抗专业班级:班学生:学号:指导教师:2011年12月基于计算机操作系统银行家算法实现摘要此次课程设计的主要内容是模拟实现资源分配。
同时要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生具体用银行家算法实现资源分配。
要求如下:(1) 设计一个3个并发进程共享3类不同资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2) 设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3) 确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程占用:第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源:第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
通过这个算法可用解决生活中的实际问题,如银行贷款等. 通过对这个算法的设计,让学生能够对书本知识有更深的理解,在操作和其它方面有更高的提升.关键词:死锁;安全状态;安全序列;银行家算法;安全性检查目录1 概述 (3)1.1设计目的 (3)1.2开发环境 (3)2 需求分析 (4)2.1死锁概念 (4)2.2死锁的结论 (4)2.3资源分类 (4)2.4产生死锁的必要条件 (4)2.5死锁的解决方案 (4)2.5.1产生死锁的例子 (4)2.5.2死锁预防 (5)2.5.3安全状态与不安全状态 (5)3 数据结构分析设计 (6)3.1可利用资源向量矩阵available[ ] (6)3.2最大需求矩阵max[ ][ ] (6)3.3分配矩阵allocation[ ][ ] (6)3.4需求矩阵need[ ][ ] (6)4 算法的实现 (7)4.1初始化 (7)4.2银行家算法 (7)4.3安全性检查算法 (7)4.4各算法流程图 (8)5 测试与实例分析 (10)6 心得体会 (14)7.参考文献与源程序清单(附录) (15)1概述1.1设计目的银行家算法是一种最有代表性的避免死锁的算法。
银行家死锁避免算法模拟实现(Java)
**大学计算机学院实验报告册院系名称:计算机科学学院课程名称:操作系统实验学期2009 年至2010 年第二学期专业班级:计算机科学和技术2008级1班姓名:HORACE 学号:20081***** 指导教师:**老师实验最终成绩:实验报告须知1.学生填写实验报告应按规范填写,填写格式见由任课老师给出的实验报告样本;2.学生应填写的内容包括:封面相关栏目、第一页中‘本学期(年)开设实验课程情况一览表’中的实验名称、学时数;每次报告中的实验性质、同组人姓名、实验日期、以及实验报告中的一至五项;3.教师填写内容为:实验评价、每次报告成绩、第一页中‘本学期(年)开设实验课程情况一览表’中成绩、及封面的实验最终成绩;4.学生实验结束后,教师应对学生实验结果进行核实,学生方可离开实验室。
5、实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。
6.本实验册应妥善保管,本课程实验结束后应交回实验室。
实验报告(7)实验名称死锁避免算法实现同组人姓名实验性质□基本操作●设计性□综合性□验证性实验日期2010-05-10 实验成绩教师评价:实验预习□实验操作□实验结果□实验报告□其它□教师签名:一、实验目的及要求(1)了解操作系统如何处理死锁(2)通过编写程序掌握如何利用银行家算法来实现死锁的避免。
二、实验内容(1)用熟悉的计算机编程语言编写一实现计算机资源动态分配的程序。
(2)要求接收用户输入数据,利用银行家算法来判断该次请求能否分配。
(3)掌握操作系统是如何在资源的动态分配过程中防止系统死锁的发生。
三、主要设备及软件PC、WindowsXP操作系统、MyEclipse Java编译环境四、实验流程、操作步骤或核心代码、算法片段本人以Java语言模拟实现银行家避免死锁算法,其中分别把银行家算法和安全性检测算法封装在不同的类中,即class Banker和class SafeTest,最终在主类中创建Banker类对象进行测试。
Java语言的银行家算法
操作系统课程设计(一号黑体加粗)银行家算法模拟(小二黑体加粗)院系:小二黑体加粗班级:学号:姓名:同组者:时间:目录(小二黑体加粗)一、题目 (3)二、设计目的 (3)三、总体设计思想概述 (3)四、设计要求 (3)五、设计方案 (3)六、说明 (4)七、流程图 (5)八、运行结果 (5)九、源程序 (7)十、总结 (12)十一、参考文献 (12)一、题目:(标题2,即三号黑体加粗)银行家算法模拟。
二、设计目的:通过此课程设计,进行的一次全面的综合训练,使之更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
三、总体设计思想概述:安全状态下系统不会进入死锁,不安全状态可能进入死锁。
在进行资源分配之前,先计算分配的安全性,判断是否为安全状态。
四、设计要求:银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
设计完成后,要求写出一份详细的设计报告。
五、设计方案:编制银行家算法通用程序,并检测所给状态的系统安全性。
1)银行家算法中的数据结构假设有n个进程m类资源,则有如下数据结构:可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
Available[j]=K,则表示系统中现有Rj 类资源K个。
最大需求矩阵Max。
这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
分配矩阵Allocation。
这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
2.操作系统试验--死锁的避免——银行家算法
操作系统实验二死锁的避免——银行家算法一、实验目的银行家算法是避免死锁的一种重要算法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
二、实验要求:编制程序, 依据银行家算法判定本次分配是否安全。
三.算法所用數據結構讲解1.数据结构假设有m个进程N类资源,则有如下数据结构MAX[M*N] M个进程对N 类资源的最大需求量;A V AILABEL[N] 系统可用资源数;ALLOCATION[M*N] M个进程已得到N 类资源的资源量;NEED[M*N] M个进程还需要N 类资源的资源量;2.行家算法设进程I 提出请求Request[N],则(1)若Request[N]<= NEED[I,N],则转(2);否则出错。
(2)若NEED[I,N] <= A V AILABEL[N],则转3;否则出错。
3.安全性检查(1)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false; ②Needi≤Work.如找到,执行步骤(2);否则执行步骤(3)。
(2)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故执行:Work:=Work+Allocation; Finish[i]:=true; Goto step1;(3)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
四.实验报告要求1.写出实验目的2。
写出实验要求3。
写出实验内容(包括算法,程序流程图及部分实验结果)4.实验总结与体会附:#include "stdio.h"#define M 5 /*总进程数*/#define N 3 /*总资源数*/#define FALSE 0#define TRUE 1/*M个进程对N类资源最大资源需求量*/int MAX[M][N]= {{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系统可用资源数*/int A V AILABLE[N]={3,3,2};/* M个进程已经得到N类资源的资源量*/int ALLOCATION[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};/* M个进程还需要N类资源的资源量*/int NEED[M][N]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};int Request[N]={0,0,0};int i=0,j=0;void main(){char flag='Y';void showdata();void changdata(int);void rstordata(int);int chkerr(int);showdata();while (flag=='Y'||flag=='y'){printf("输入申请资源的进程号(0~4):");scanf("%d",&i);while (i<0||i>=M){printf("输入的进程号不存在,请重输入申请资源的进程号(0~4):");scanf("%d",&i);}for(j=0;j<N;j++){printf("申请资源%d :",j);scanf("%d",&Request[j]);if (Request[j]>NEED[i][j]){printf("进程%d申请的资源数大于进程%d还需要%d类资源的资源量!",i,i,j);printf("申请不合理,出错!请重新选择\n");exit(0);}else{if (Request[j]>A V AILABLE[j]){printf("进程%d 申请的资源数大于系统可用%d类资源的资源量!",i,j);printf("本次分配不成功。
操作系统银行家解决死锁问题
银行家算法解决死锁一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。
本实验的目的在于了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生。
二、实验设计思路设Request i 是进程Pi 的请求向量。
Request i (j)=k表示进程Pi请求分配Rj类资源k个。
当Pi发出资源请求后,系统按下述步骤进行检查:1、如果Request i ≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。
2、如果Request i ≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。
3、系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值:Available = Available - Request iAllocation i= Allocation i+ Request iNeed i= Need i - Request i4、系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
如果安全才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
三、运行结果1、在程序运行中,程序中已经输入初值:int MaxAvailable[m]={10,5,7}; //每类资源的个数int Max[n][m]={1,5,3,3,2,4,1,0,2,2,2,2,0,3,2};// 每个进程需要的每类资源最大需求个数int Allocation[n][m]={0,1,0,1,0,0,3,0,2,2,1,1,0,0,2};// 已分配给每个进程的每类资源个数int Available[m];int Need[n][m]; //每个进程还需要的每类资源数经过银行家算法和安全性算法,输出运行成功的进程号。
2、在调整输入初值后:int MaxAvailable[m]={10,5,7};int Max[n][m]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,9};int Allocation[n][m]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};int Available[m];int Need[n][m];运行结果为三、源代码:#include <iostream>#include <cstdlib>using namespace std;const int m=3; //资源类数const int n=5; //进程个数int MaxAvailable[m]={10,5,7}; //每类资源的个数int Max[n][m]={1,5,3,3,2,4,1,0,2,2,2,2,0,3,2};// 每个进程需要的每类资源最大需求个数int Allocation[n][m]={0,1,0,1,0,0,3,0,2,2,1,1,0,0,2};// 已分配给每个进程的每类资源个数int Available[m];int Need[n][m]; //每个进程还需要的每类资源数struct Request{int p; //进程int k[m]; //请求资源};bool safe() //安全性算法,判断是否安全{int Work[m]; //系统可分配资源for(int i=0;i<m;i++){Work[i]=Available[i];}bool Finish[n]; //运行结束否for(i=0;i<n;i++)Finish[i]=false;for(int iy=0;iy<n;iy++){for(i=0;i<n;i++){if(!Finish[i]){for(int j=0;j<m;j++){if(Need[i][j]>Work[j]) //需求大于系统资源数,跳出{break;}}if(j==m) //m个资源都满足所需{for(int ix=0;ix<m;ix++){Work[ix]+=Allocation[i][ix];}Finish[i]=true;cout<< "[ " <<i << "] \n" << " --> ";break;}}}}for(i=0;i<n;i++){if(!Finish[i])break;}if(i<n) //存在危险{cout<< "危险" <<endl;return false;}elsereturn true;}void bank(Request r) //银行家算法{int i;int j;for(i=0;i<n;i++)for(j=0;j<m;j++){Need[i][j]=Max[i][j]-Allocation[i][j];} //进程需求资源矩阵for(i=0;i<m;i++){Available[i]=MaxAvailable[i];}for(i=0;i<n;i++)for(j=0;j<m;j++){Available[j]-=Allocation[i][j];}for(i=0;i<m;i++){if(r.k[i]>Need[r.p][i]) //如果请求>所需,跳出{break;}}if(i <m){cout<< "Your request over need! " <<endl;exit(1);}else{for(i=0;i<m;i++){if(r.k[i]> Available[i]) //请求>可以使用的break;}if(i<m){cout<< "Process[ " <<r.p << "] Wait! " <<endl;} //等待else //尝试分配{for(i=0;i<m;i++){Available[i]-=r.k[i];Allocation[r.p][i]+=r.k[i];Need[r.p][i]-=r.k[i];}if(!safe()) //判断分配是否安全,如果不安全,撤销分配{for(i=0;i<m;i++){Available[i]+=r.k[i];Allocation[r.p][i]-=r.k[i];Need[r.p][i]+=r.k[i];}cout<< "系统处于不安全状态" <<endl;}else //如果安全,分配成功{cout << "系统处于安全状态" <<endl;}}}}void main(){Request r;r.p=1; //默认资源标记为1int request[m]={1,0,2}; //默认请求资源for(int i=0;i<m;i++){r.k[i]=request[i];}bank(r);}。
系统避免死锁的银行家算法课程设计
泰山医学院操作系统课程设计题目:银行家算法院(部)系信息工程学院所学专业信息管理与信息系统年级、班级学号学生姓名指导教师姓名1、概述一、设计目的1、了解多道程序系统中,多个进程并发执行的资源分配。
2、掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。
3、掌握预防死锁的方法,系统安全状态的基本概念。
4、掌握银行家算法,了解资源在进程并发执行中的资源分配策略。
5、理解死锁避免在当前计算机系统不常使用的原因二、开发环境2、需求分析避免多道程序系统中程序的死锁。
一、死锁概念:在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。
所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
二、关于死锁的一些结论:Ø参与死锁的进程最少是两个(两个以上进程才会出现死锁)Ø参与死锁的进程至少有两个已经占有资源Ø参与死锁的所有进程都在等待资源Ø参与死锁的进程是当前系统中所有进程的子集注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。
三、资源分类:永久性资源:可以被多个进程多次使用(可再用资源)l 可抢占资源l 不可抢占资源临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等(可消耗性资源)“申请--分配--使用--释放”模式四、产生死锁的四个必要条件: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)共享。
银行家算法(操作系统)
银行家算法(操作系统)银行家算法(操作系统)一、概述银行家算法是一种用于避免进程死锁的资源分配算法。
在多进程并发执行的系统中,进程需要申请和释放资源,而银行家算法可以通过判断资源申请是否会导致系统陷入死锁状态,从而保证系统的安全性和可靠性。
二、系统资源1. 资源类型系统中的资源可以分为不同类型,比如A、B、C等。
每种资源类型都有固定的数量,例如A类型资源有10个。
不同资源类型之间是独立的,即没有关联性。
2. 可用资源在系统中,每种资源类型都有一定数量的可用资源。
初始情况下,可用资源数目应该与系统中实际可用资源数目相对应。
3. 进程资源申请和释放进程可以通过申请资源来执行运算或操作。
如果系统能够满足进程的资源需求,则满足其资源请求,否则,该进程必须等待直到所需资源变得可用。
当进程完成了对资源的操作后,必须释放这些资源,以便其他进程可以使用。
三、银行家算法原理1. 数据结构银行家算法通过维护以下数据结构来判断系统是否处于安全状态:- Avlable: 一维数组,表示每种资源类型的可用数量。
- Max: 二维数组,表示每个进程对每种资源类型的最大需求量。
- Allocation: 二维数组,表示每个进程已经分配到的资源数量。
- Need: 二维数组,表示每个进程还需要的资源数量。
2. 安全状态系统处于安全状态的条件是:存在一个安全序列,使得该序列中每个进程的资源需求能够被满足。
3. 安全检查银行家算法通过进行安全检查来判断系统是否处于安全状态。
检查过程包括以下步骤:- 初始化Work为Avlable。
- 找到一个进程i,使得Need[i] <= Work。
如果这样的进程不存在,则转到步骤5。
- 分配资源给进程i。
- 执行资源分配后的安全性检查,即临时修改Work和Allocation。
- 如果系统处于安全状态,则转到步骤2;否则,继续进行步骤5。
- 如果所有进程都获得了所需的资源,则系统处于安全状态;否则,系统处于不安全状态。
(操作系统)银行家算法
(操作系统)银行家算法解析银行家算法(09信管一班 2009970037 许可成)摘要:银行家算法是操作系统中采用避免死锁策略来解决死锁问题的一种算法。
本文以银行家算法为主线,从银行家算法的起源,命名,再到算法的流程,深入解析了银行家算法的根本原理。
关键字:银行家算法,数据结构,死锁避免。
在操作系统中,有一个重要的东西,就是进程,可以说,进程直接关系到了运行的效率,然而,有一个问题也随之产生,那就是死锁问题:多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,那么就会导致死锁的发生,也就是进程不能实现同步。
死锁在操作系统中,是一个重要的概念,它不仅在操作系统中有提到,在数据库,以及只要涉及到并发操作的,几乎都提到了这个问题了……很多人为了解决死锁的困扰,也想出了很多办法,其中著名的就“有银行家算法”,以及“安全性检查算法”等等著名算法,这里,我盟就详细的说一下银行家算法。
银行家通过发放贷款而获取利润,要获取利润必须按时收㈦贷款本金和利息,即贷款企业要按时还本付息,而tI有各企业能不断获得所需资金最终完成项目才能还本付息。
要避免的情况是:在某个时刻,备并行推进项目的企业均得到了一部分贷款,要使项目顺利推进还需要贷款,而银行家已经没有多余资金,从而导致各企业问循环等待埘方释放其占有的资金而使项目中断,造成一种僵滞局面,银行家冈收不回贷款而破产。
操作系统的资源分配类似于银行家贷款。
操作系统就像一个银行家,系统临界资源就像银行家的贷款本金,并发进程就像需要贷款的企业。
冈此可把银行家规避风险的算法引入操作系统的资源分配,解决资源分配中的死锁问题。
这就是银行家算法这一名称的由来。
在操作系统的资源分配问题中要解决的是:一组并发进程{P1,P2,⋯,Pn}共享一组临界资源{R1,R2,⋯,Rm},Ri指一类资源。
;'前,有一个进程Pi向操作系统提出了资源请求Requesta=(rl,r2,⋯,rm)。
操作系统银行家算法的java编程实现
/*死锁避免与死锁检测模拟程序【银行家算法】网络工程06-3班学号:310609040308*/import java.util.*;public class TestTheBanker {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);TheBanker tb = new TheBanker();tb.deadlockAvoidance();//死锁避免int gate = 1;while(gate!=0){tb.deadlockDetection();//死锁检测System.out.println("如果您要继续分配资源请输入\"1\",退出请输入\"0\"");System.out.print("您输入的值为:");gate = scanner.nextInt();System.out.println();}System.out.println("使用愉快!期待您下次使用!");}}class TheBanker{int m;int n;int[][] max;int[][] maxbak;//备份用int[][] allocation;int[][] allocationbak;//备份用int[][] need;int[][] needbak;//备份用int[] available;int[] availablebak;//备份用public TheBanker(){Scanner s = new Scanner(System.in);System.out.println("初始化==============");System.out.print("请依次输入系统中的【进程数】和【资源类型数】:"); m = s.nextInt();n = s.nextInt();max =new int[m][n];maxbak = new int[m][n];allocation = new int[m][n];allocationbak = new int[m][n];need = new int[m][n];needbak = new int[m][n];available = new int[n];availablebak = new int[n];for(int i=0;i<max.length;i++){//初始化向量MAX、ALLOCATION、NEED、AVAILABLESystem.out.print("请依次输入第" + i + "进程的各资源数:");for(int j=0;j<max[i].length;j++){max[i][j] = s.nextInt();maxbak[i][j] = max[i][j];}}for(int i=0;i<allocation.length;i++){System.out.print("请依次输入第" + i + "进程中已分配资源的数量:");for(int j=0;j<allocation[i].length;j++){allocation[i][j] = s.nextInt();allocationbak[i][j] = allocation[i][j];}}for(int i=0;i<need.length;i++){for(int j=0;j<need[i].length;j++){need[i][j] = max[i][j] - allocation[i][j];needbak[i][j] = need[i][j];}}for(int i=0;i<available.length;i++){System.out.print("请输入系统中第" + i + "种资源的剩余量:");available[i] = s.nextInt();availablebak[i] = available[i];}System.out.println("初始化结果=============");System.out.println(" MAX ALLOCATION N EED AVAILABLE");for(int i=0;i<m;i++){System.out.print("P" + i + ": ");for(int j=0;j<n;j++){if(max[i][j]>9){//如果是两位数,控制格式,在数字前少输出一个" "。
操作系统实验报告-利用银行家算法避免死锁
计算机操作系统实验报告题目利用银行家算法避免死锁一、实验目的:1、加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
2、要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。
二、实验内容:用银行家算法实现资源分配:设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。
进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。
三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:(1)设置两个向量①工作向量Work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。
【Java并发基础】死锁
【Java并发基础】死锁前⾔我们使⽤加锁机制来保证线程安全,但是如果过度地使⽤加锁,则可能会导致死锁。
下⾯将介绍关于死锁的相关知识以及我们在编写程序时如何预防死锁。
什么是死锁学习操作系统时,给出死锁的定义为两个或两个以上的线程在执⾏过程中,由于竞争资源⽽造成的⼀种阻塞的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。
简化⼀点说就是:⼀组相互竞争资源的线程因为互相等待,导致“永久”阻塞的现象。
下⾯我们通过⼀个转账例⼦来深⼊理解死锁。
class Account {private int balance;// 转账void transfer(Account target, int amt){if (this.balance > amt) {this.balance -= amt;target.balance += amt;}}}为了使以上转账⽅法transfer()不存在并发问题,很快地我们可以想使⽤Java的synchronized修饰transfer⽅法,于是代码如下:class Account {private int balance;// 转账synchronized void transfer(Account target, int amt){if (this.balance > amt) {this.balance -= amt;target.balance += amt;}}}需要注意,这⾥我们使⽤的内置锁是this,这把锁虽然可以保护我们⾃⼰的balance,却不可以保护target的balance。
使⽤我们上⼀篇介绍的锁模型来描绘这个代码就是下⾯这样:(图来⾃参考[1])更具体来说,假设有 A、B、C 三个账户,余额都是 200 元,我们⽤两个线程分别执⾏两个转账操作:账户 A 转给账户 B 100 元,账户 B 转给账户 C 100 元,最后我们期望的结果应该是账户 A 的余额是 100 元,账户 B 的余额是 200 元,账户 C 的余额是 300 元。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三预防进程死锁的银行家算法1、实验目的通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
2、试验内容问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。
假设系统中有n个进程P1, … ,P n,有m类可分配的资源R1, … ,R m,在T0时刻,进程P i分配到的j类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。
3、程序要求:1)判断当前状态是否安全,如果安全给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后系统是否安全。
3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全,输出安全的进程序列,不安全则提示信息。
4、需求分析(1) 输入的形式和输入值的范围输入进程的数目输入资源的种类每个进程最多所需的各类资源数(Max[i][j])每个进程已经分配的各类资源数(Allocation[i][j])各个资源现有的数目(Available[][])(2) 输出的形式如果安全,输出安全的进程序列,不安全则提示信息。
(3)测试用例5、调试分析通过本次实验可知,用银行家算法避免死锁就是在资源所能承受范围内给需要资源的进程分派所需资源,在分派资源时若请求资源超出所需资源或超出可得资源,则不合条件,则让当前进程等待换下一个进程,若可利用资源已经满足任何一个进程所需,则系统不安全并且系统不分配资源;在安全性检验时,若可利用资源已经满足任何一个进程所需,则系统不安全并且系统不分配资源。
免死锁属于事先预防的策略,在资源的动态分配过程中用某种方法去防止系统进入不安全状态,从而避免死锁发生。
6、测试结果输入进程数,资源数,最大需求矩阵,分配矩阵,可利用资源向量,对进程的资源请求向量输出:7、附录(java)package experiment;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.Scanner;public class C_Bank {// 允许的最大进程数private static int MaxNumber = 100;// 真正的进程数public static int realNum;// ???????????public static int l=0;// 资源的种类public static int resourceKind;// 可利用资源数组private static int Available[] = new int[MaxNumber];// 最大需求矩阵private static int Max[][] = new int[MaxNumber][MaxNumber];// 已分配矩阵private static int Allocation[][] = new int[MaxNumber][MaxNumber];// 需求矩阵private static int Need[][] = new int[MaxNumber][MaxNumber];// 请求向量private static int Request[][] = new int[MaxNumber][MaxNumber];// 表示系统是否有足够的资源分配给进程private static boolean Finish[] = new boolean[MaxNumber];//当前可利用资源private static int Work[] = new int[MaxNumber];// 安全序列private static int p[] = new int[MaxNumber];//for循环中使用private static int i;private static int j;private static int k;public static Scanner stdin;public static void main(String args[]) throws FileNotFoundException { // 输入realNum,resourceKind,Max[i][j],Allocation[i][j],Allocation[i][j],获得Need[i][j] input();// 安全性算法//safe();//进程请求request();}public static void input() throws FileNotFoundException {BufferedInputStream in = new BufferedInputStream(new FileInputStream( "./file/03"));System.setIn(in);stdin = new Scanner(System.in);// 输入进程的数目realNum = stdin.nextInt();// 输入资源的种类resourceKind = stdin.nextInt();// 输入每个进程最多所需的各类资源数(Max[i][j])for (i = 0; i < realNum; i++) {for (j = 0; j < resourceKind; j++) {Max[i][j] = stdin.nextInt();}}// 输入每个进程已经分配的各类资源数(Allocation[i][j]),并获得Need[i][j]for (i = 0; i < realNum; i++) {for (j = 0; j < resourceKind; j++) {Allocation[i][j] = stdin.nextInt();Need[i][j] = Max[i][j] - Allocation[i][j];}}// 请输入各个资源现有的数目for (i = 0; i < resourceKind; i++)Available[i] = stdin.nextInt();}// 安全性算法public static boolean safe(){//Work[]赋初值for(i=0 ; i<resourceKind ; i++){Work[i]=Available[i];}//Finish[]赋初值for(i=0 ; i<realNum ; i++){Finish[i]=false;}for(i=0 ; i<realNum ; i++){if(Finish[i] == true){continue;}else{for(j=0 ; j<resourceKind ; j++){if(Need[i][j]>Work[j])break;}if(j==resourceKind) //满足了Need[][]<=Work[][]{Finish[i]=true;for(k=0 ; k<resourceKind ; k++){Work[k] = Work[k] + Allocation[i][k];}p[l++]=i;i=-1;}else{continue;}}if(l==realNum){ //Finish[]都是true,输出安全序列System.out.println("系统是安全的");System.out.println("系统安全序列是:");for(i=0;i<l;i++){System.out.print(p[i]);if(i != l-1)System.out.print("-->");}System.out.print("\n");return true;}}return false;}//进程请求public static void request(){//输入要申请的资源的进程号(第一个进程号为0,第二个进程号为1,以此类推)k = stdin.nextInt();//输入进程所请求的各个资源的数量for(i=0 ; i<resourceKind ; i++){Request[k][i] = stdin.nextInt();}for(i=0 ; i<resourceKind ; i++){if(Request[k][i] > Need[k][i]){System.out.println("所请求资源超过进程的需求量!");;return ;}if(Request[k][i] > Available[i]){System.out.println("所请求资源数量超过系统所有的资源数!");return ;}}for(i=0 ; i<resourceKind ; i++){Available[i] -= Request[k][i];Allocation[k][i] += Request[k][i];Need[k][i] -= Request[k][i];}if(safe()){System.out.println("同意分配请求~~~");}else{System.out.println("SORRY~~~~~你的请求被拒绝~~~");for(i=0 ; i<resourceKind ; i++){Available[i] = Available[i] + Request[k][i];Allocation[k][i] = Allocation[k][i] - Request[k][i];Need[k][i] = Need[k][i] + Request[k][i];}}for(i=0 ; i<realNum ; i++){Finish[i]=false;}}}。