死锁的避免--银行家算法

合集下载

预防死锁的三种方法

预防死锁的三种方法

预防死锁的三种方法在计算机科学中,死锁是指两个或多个进程无限期地等待对方持有的资源,从而导致程序无法继续执行的情况。

为了有效预防死锁的发生,我们可以采取以下三种方法:1. 银行家算法。

银行家算法是一种死锁避免的方法,它通过动态地分配资源,以避免进程进入不安全状态,从而避免死锁的发生。

在银行家算法中,系统会维护一个资源分配表和一个进程的最大需求表,通过比较系统当前的资源分配情况和进程的最大需求来判断是否可以分配资源,从而避免死锁的发生。

2. 死锁检测与恢复。

死锁检测与恢复是一种死锁解决的方法,它通过周期性地检测系统中是否存在死锁,并在检测到死锁时采取相应的措施来解除死锁。

常见的死锁检测与恢复方法包括资源分配图算法和银行家算法。

通过这些方法,系统可以及时地检测到死锁的发生,并采取相应的措施来解除死锁,从而保证系统的正常运行。

3. 资源分配策略优化。

资源分配策略的优化是预防死锁的另一种重要方法。

通过合理地设计资源分配策略,可以最大程度地减少死锁的发生。

例如,可以采用资源有序分配的策略,通过规定资源的申请顺序,来避免进程因资源争夺而导致死锁的发生。

另外,还可以采用资源动态分配的策略,通过动态地分配资源,来避免资源的过度占用,从而减少死锁的发生。

综上所述,通过银行家算法、死锁检测与恢复以及资源分配策略优化这三种方法,我们可以有效地预防死锁的发生,保证系统的正常运行。

在实际应用中,我们可以根据具体的情况选择合适的方法,以最大程度地减少死锁的发生,保证系统的稳定性和可靠性。

希望本文所介绍的方法能够对大家有所帮助,谢谢阅读!。

避免死锁的一个著名算法

避免死锁的一个著名算法

避免死锁的一个著名算法
说到避免死锁的一个著名算法,莫过于银行家算法了。

银行家算法是一种提出同步计算机系统使用银行家算法来处理资源分配问题的著名算法。

银行家算法既可以解决死锁问题,又可以解决资源限制问题(系统中资源总数较少)。

在处理资源分配问题时,银行家算法表现出了自动的反应,能够很好的处理系统状态的变更,以及资源的释放,进而避免死锁的出现。

具体来说,银行家算法一般采用一个多维表(有时候也称之为请求表)作为管理系统中资源的平台,表中包括进程名、机器名和资源名三个维度,以及每一种资源所分配的最大数量和已经已请求的数量两个量的统计。

在资源请求时,银行家算法会查看请求表内所有资源的满足情况,即该请求是否符合系统所拥有的资源的实际情况,以及是否会导致系统产生死锁,如果不会则可以满足请求,如果会则不予满足。

最后,要总结一点就是,银行家算法是一种经典的死锁避免算法,有效地避免了死锁带来的资源浪费,并且具有安全性和稳定性,在处理多进程系统中资源占用和释放问题时,表现出了极大的优势。

利用银行家算法避免死锁

利用银行家算法避免死锁

12
利用银行家算法避免死锁
(3)安全性算法 安全性算法执行步骤如下: ⅰ. 初始化设置工作向量Work[m]表示 系统可提供的各类资源数目,用以保 护原数据结构有关值。Work = Available,设置完成标志向量 Finish[n]。Finish[i] = false 表示i进程 尚末完成,如值为true则表示进程i已 完成。 ⅱ.从进程集合n中找到一个能满足下述 二个条件: Finish[i] = false和 Necdi≤Work,如找到则执行步骤ⅲ, 如找不到同时满足以上二条件的进程 则执行步骤ⅳ。
3
死锁的预防(Deadlock Prevention)
预防死锁的方法是破坏四个产生死锁的必要条件之一。 破坏互斥条件

互斥使用是资源本身特征所决定的。使用硬软件结合 可改变资源本身特性,例如采用SPOOLing技术可将“ 独享” 打印机改变为“共享”的打印机。
破坏不可抢占条件
如果一个进程的申请没有实现,它要释放所有占 有的资源 破坏请求和保持条件
7 5
3 0 2 7 2 1 1
0 0 2
6 0 0
0 1 1 4 3 1
⑤ 7 5
② 5 3 2 ③ 7 4 3 7 7
The system is in a safe state since the sequence 16
(2) P1 Request (1,0,2)
检查Request1(1,0,2)≤Need1(1,2,2), (that is
13
利用银行家算法避免死锁-4
当进程Pi获得资源后可顺利执行直到完 成,并释放出分配给它的资源,表示如下:
ⅲ.
work = work+Allocationi ; Finish[i]=true ;转 执行步骤 ⅱ 。

避免死锁的一个著名算法

避免死锁的一个著名算法

避免死锁的一个著名算法:银行家算法死锁的避免,不是严格地限制死锁的必要条件,而是在系统运行过程中小心地避免死锁的最终发生。

最著名的死锁避免算法是银行家算法。

银行家算法是一种最有代表性的避免死锁的算法。

又被称为“资源分配拒绝”法在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

为实现银行家算法,系统必须设置若干数据结构。

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

银行家算法:设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];(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

银行家算法避免死锁的研究与实现1

银行家算法避免死锁的研究与实现1

银行家算法避免死锁的研究及实现学号:姓名:专业:目录1 死锁............................................. 错误!未指定书签。

1.1 什么是死锁.................................. 错误!未指定书签。

1.2 产生死锁的原因.............................. 错误!未指定书签。

1.2.1 竞争系统资源 ........................... 错误!未指定书签。

1.2.2 进程的推进不当 ......................... 错误!未指定书签。

1.3 产生死锁的必要条件........................ 错误!未指定书签。

1.4 解决死锁的基本方法 .......................... 错误!未指定书签。

1.4.1 预防死锁.................................. 错误!未指定书签。

1.4.2 避免死锁.................................. 错误!未指定书签。

1.4.3 死锁检测.................................. 错误!未指定书签。

1.4.4 死锁的恢复错误!未指定书签。

2 银行家算法....................................... 错误!未指定书签。

2.1 关于银行家算法.............................. 错误!未指定书签。

3 程序实现......................................... 错误!未指定书签。

3.1 程序说明.................................... 错误!未指定书签。

3.2 程序源代码.................................. 错误!未指定书签。

避免死锁的算法

避免死锁的算法

避免死锁的算法1. 引言在多线程或并发环境下,死锁是一个常见的问题。

死锁指的是多个线程或进程因为互相等待对方释放资源而无法继续执行的情况。

死锁会导致程序的停止响应,严重影响系统的稳定性和性能。

因此,设计避免死锁的算法是非常重要的。

本文将介绍几种常见的避免死锁的算法,包括资源分级、银行家算法、死锁预防和死锁检测与恢复等。

我们将深入探讨每种算法的原理、优缺点以及适用场景,以帮助读者更好地理解和应用这些算法。

2. 资源分级资源分级是一种简单而直观的避免死锁的算法。

该算法通过给每个资源分配一个优先级,要求线程按照升序的顺序请求资源。

当一个线程请求一个资源时,如果该资源的优先级高于当前线程所拥有的资源的最高优先级,则允许分配该资源;否则,线程需要释放已拥有的资源,直到满足请求资源的条件。

资源分级算法的优点是简单易懂,容易实现。

它可以有效避免死锁,因为线程只能按照特定的顺序请求资源,从而避免了循环等待的情况。

然而,资源分级算法也存在一些缺点。

首先,它需要事先确定每个资源的优先级,这对于大规模系统来说可能是一个挑战。

其次,如果一个线程持有多个资源,那么它在等待其他资源时需要释放已拥有的资源,这可能导致资源的频繁分配和释放,影响系统的性能。

资源分级算法适用于资源之间存在优先级关系的场景,例如操作系统中的进程调度和资源管理。

3. 银行家算法银行家算法是一种经典的避免死锁的算法,它基于资源的动态分配和回收。

该算法通过预先计算系统中的资源分配情况,判断是否存在安全序列,从而避免死锁的发生。

银行家算法的核心思想是避免分配资源后系统进入不安全状态。

它通过维护一个状态向量来跟踪系统中每个进程的资源需求和可用资源数目。

当一个进程请求资源时,银行家算法会先检查系统是否有足够的资源满足该请求,如果有,则分配资源;否则,进程需要等待。

当一个进程释放资源时,银行家算法会重新计算系统中的资源分配情况,并检查是否存在安全序列。

如果存在安全序列,则继续分配资源;否则,进程需要等待。

预防死锁的三种方法

预防死锁的三种方法
第一种方法是通过破坏死锁产生的四个必要条件之一来预防死锁。

死锁产生的四个必要条件是互斥条件、请求与保持条件、不剥夺条件和循环等待条件。

破坏其中任何一个条件都可以预防死锁。

比如,我们可以通过实现资源的共享来破坏不剥夺条件,或者通过资源的有序分配来破坏循环等待条件。

这种方法的优点是简单易行,但是需要对系统进行全面的改造,成本较高。

第二种方法是使用银行家算法来预防死锁。

银行家算法是由艾兹格·迪杰斯特拉于1965年提出的一种死锁避免算法。

它通过动态地分配资源,根据系统的当前状态来判断是否能满足进程的资源请求,从而避免死锁的发生。

银行家算法的优点是能够有效地避免死锁,并且不需要对系统进行大规模的改造。

但是它需要提前知道每个进程的最大资源需求,这在实际应用中可能会存在一定的困难。

第三种方法是使用超时机制来预防死锁。

超时机制是指当进程在一定时间内无法获得所需的资源时,就放弃对资源的请求,并释放已经获得的资源,从而避免死锁的发生。

这种方法的优点是简单易行,而且不需要对系统进行大规模的改造。

但是它可能会导致资源的浪费,因此需要合理地设置超时时间。

综上所述,预防死锁是非常重要的。

我们可以通过破坏死锁产生的必要条件、使用银行家算法或者使用超时机制来预防死锁的发生。

不同的方法适用于不同的场景,我们可以根据实际情况选择合适的方法来预防死锁的发生,从而保证系统的稳定运行。

希望本文对您有所帮助。

死锁避免与银行家算法

一、【实验目的】1.理解并掌握死锁有关概念;2.理解并掌握银行家算法;3.掌握进程安全性检查的方法及资源分配的方法。

二、【实验任务】任务描述:编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。

某系统有A、B、C、D四类资源共5个进程(P0、P1、P2、P3、P4)共享,各进程对现在系统中A、B、C、D四类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:①现在系统是否处于安全状态?②如果现在进程P1提出资源请求(0、4、2、0),系统能否满足它的请求?任务梳理:1.死锁:在操作系统中,“死锁”用于描述资源分配时,进程互相抢占资源,又因为需求的资源被别的进程抢占,只好互相等待,以至于等待循环中的所有进程均无法正常运行的情况。

死锁形成需要四个条件,这四个条件缺少一个,就不会形成死锁。

死锁的四个条件:1)互斥条件即对于某资源在一段时间内仅允许一个进程占有使用。

2)占有且等待条件/请求和保持条件在进程已经占有一个或多个资源的情况下,若它仍申请新的资源,在等待获得新的资源时,进程仍会继续占有旧有资源,不会主动释放。

3)不可抢占条件直到占有该资源的进程使用完毕之前,其他任何进程均不应该强行抢占该资源。

4)循环等待条件若干个进程之间形成了一个等待循环。

2.安全状态若针对目前资源分配情况,系统可以找到某种次序为进程分配资源,使得所有进程能够依次运行成功,则称系统此时的分配状态是安全的,分配资源的次序称为“安全序列”。

安全状态时系统中无死锁,所以所有避免死锁的算法都尽可能地使系统进入安全状态。

值得注意的是,即使是安全状态下的系统,如果资源分配不当,仍然可以使系统变为不安全状态。

3.银行家算法1)设计思想在系统中,进程发起一项资源分配请求,由系统检查是否可以满足该分配请求,若可以,应暂时满足该请求,并查看此时系统是否仍是安全状态。

2)程序流程图可以分为三个功能模块,第一个模块检查需求是否可以被满足,第二个模块检查系统是否安全,第三个模块是主程序,通过调用前两个模块实现资源分配或请求驳回。

死锁的避免 银行家算法

四、 安全性算法 1.设置两个向量。
Work:它表示系统可提供给进程继续运行的各类资源数目,它包含 m 个元素,开始执行 安全性算法时,Work = Available。
Finish:它表示系统是否有足够的资源分配给进程,使之运行完成,开始 Finish[i]=false; 当有足够资源分配给进程 i 时,令 Finish[i]=true;
void Read_Available_list(); void Read_Max_list(); void Read_Allocation_list(); void PrintInfo(); void Read_Request(); void Allocate_Source(); void Recover_TryAllocate(); int Test_Safty(); void RunBanker();
*//
//*
*//
//* 本程序需要预先设置三个文件:Available_list.txt, Max_list.txt, Allocation_list.txt
*//
//* 各文件格式如下:
*//
//* Available_list.txt
*//
//* 3
//表示共有 3 类资源
*//
//* 10 5 7 //表示各类资源的初始可用个数,即 Available[0]=10, Available[1]=5
//读入最大需求矩阵 Max void Read_Max_list() {
FILE *fp; if((fp=fopen("Max_list.txt","r"))==NULL) {
cout<<"错误,文件打不开,请检查文件名"<<endl; exit(0); }

预防进程死锁的银行家算法

实验三预防进程死锁的银行家算法一、【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。

二、【实验内容】问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。

假设系统中有n个进程P1, … ,P n,有m类可分配的资源R1, … ,R m,在T0时刻,进程P i分配到的j 类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。

三、【实验要求】程序要求:1)判断当前状态是否安全,如果安全给出安全序列;如果不安全给出理由。

2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后系统是否安全。

3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全,输出安全的进程序列,不安全则提示信息。

实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int Available[MaxNumber];int Max[MaxNumber][MaxNumber];int Allocation[MaxNumber][MaxNumber];int Need[MaxNumber][MaxNumber];int Request[MaxNumber];int SafeOrder[MaxNumber];2)进程调度的实现过程如下:变量初始化;接收用户输入n,m,(输入或者默认的)Allocation ij,Need ij;按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;如果安全,提示用户输入下一时刻进程P k的资源请求Request(R1, … ,R m);如果不安全或者无新请求则退出。

四、【实验代码】#include<iostream>using namespace std;#define MaxNumber 100int Available[MaxNumber];//可利用资源int Max[MaxNumber][MaxNumber];//最大需求矩阵int Allocation[MaxNumber][MaxNumber];//分配矩阵int Need[MaxNumber][MaxNumber];//需求矩阵int Request[MaxNumber];//请求资源int SafeOrder[MaxNumber];//安全序列int ProcessNumber;int TypeNumber;bool Finish[MaxNumber];int Work[MaxNumber];int i,j,go=1;void init();bool bank();bool IsSafe();void init(){cout<<"请输入进程的个数:";cin>>ProcessNumber;cout<<"请输入资源种类的个数:";cin>>TypeNumber;for(i=0;i<ProcessNumber;i++){cout<<endl<<"P"<<i<<"已经分配:";for(j=0;j<TypeNumber;j++){cin>>Allocation[i][j];}cout<<"P"<<i<<"还需分配:";for(j=0;j<TypeNumber;j++){cin>>Need[i][j];Max[i][j]=Allocation[i][j]+Need[i][j];}}cout<<"请输入各类可利用资源个数:";for(j=0;j<TypeNumber;j++){cin>>Available[j];}}bool bank(){cout<<"请输入请求资源下标:";cin>>i;cout<<"P"<<i<<"请求各类资源数分别是:";for(j=0;j<TypeNumber;j++){cin>>Request[j];if(Request[j]>Need[i][j]){cout<<"请求资源超过其需要这类资源的最大值,请求失败";return false;}else if(Request[j]>Available[j]){cout<<"没有足够的资源,P"<<i<<"必须等待";return false;}}//银行家算法for(j=0;j<TypeNumber;j++){Available[j]=Available[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j];Need[i][j]=Need[i][j]-Request[j];}return true;}bool IsSafe(){for(i=0;i<ProcessNumber;i++){Finish[i]=false;}for(j=0;j<TypeNumber;j++){Work[j]=Available[j];}int flag=0,k=0;//flag用来控制while循环,使得每个进程都能重新检测到while(flag!=-1){for(i=0;i<ProcessNumber;i++){flag=-1;if(Finish[i]==false){for(j=0;j<TypeNumber;j++){if(Need[i][j]>Work[j])break;}if(j==TypeNumber){for(j=0;j<TypeNumber;j++){Work[j]=Work[j]+Allocation[i][j];Finish[i]=true;}SafeOrder[k]=i;//入安全序列k++;flag=1;//再次进行进程循环break;}}}}for(i=0;i<ProcessNumber;i++){if(Finish[i]==true&&i==ProcessNumber-1){cout<<"系统处于安全状态,存在一个安全序列是:{";for(i=0;i<ProcessNumber;i++)cout<<"P"<<SafeOrder[i]<<",";cout<<"}"<<endl;return true;}else if(Finish[i]==false){cout<<"系统进入不安全状态"<<endl;return false;}}}void main(){init();if(IsSafe()){while(go==1){cout<<endl<<"是否继续为进程分配资源(Y/N): ";char a;cin>>a;if(a=='Y'||a=='y'){if(bank()){if(IsSafe())cout<<"系统处于安全状态,请求成功"<<endl;else{cout<<"请求失败"<<endl;break;}}}else if(a=='N'||a=='n'){cout<<"没有进程请求资源"<<endl;break;}}}elsecout<<"该请求不安全,没有安全序列"<<endl; }五、【实验结果】。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三死锁的避免――银行家算法一、实验目的1.掌握死锁产生的原因。

2.掌握银行家算法。

3.能使用高级语言模拟实现银行家算法。

二、相关数据结构1.可利用资源向量Available ,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。

其数值随该类资源的分配和回收而动态地改变。

如果Available[j]=k,标是系统中现有j类资源k 个。

2.最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。

如果Max[i][j]=k,表示进程i需要j类资源的最大数目为k。

3.分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前分配到每一个进程的资源数。

如果Allocation[i][j]=k,表示进程i当前已经分到j类资源的数目为k个。

Allocation[i]表示进程i的分配向量。

4.需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。

如果Need[i][j]=k,表示进程i还需要j类资源k个,才能完成其任务。

Need[i]表示进程i的需求向量。

上述三个矩阵间存在关系:Need[i][j]=Max[i][j]-Allocation[i][j];三、银行家算法Request是进程i的请求向量。

Request[j]=k表示进程i请求分配j类资源k个。

当进程i发出资源请求后,系统按下述步骤进行检查:1.如果Request ≤Need[i],则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。

2.如果Request ≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足进程i 的申请,进程i必须等待。

3.系统试探性地把资源分配给进程i,并修改下面数据结构中的数值:Available = Available - RequestAllocation[i]= Allocation[i]+ RequestNeed[i]= Need[i]- Request4.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

如果安全才正式将资源分配给进程i,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程i等待。

四、安全性算法1.设置两个向量。

Work:它表示系统可提供给进程继续运行的各类资源数目,它包含m个元素,开始执行安全性算法时,Work = Available。

Finish:它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish[i]=false;当有足够资源分配给进程i时,令Finish[i]=true;2.从进程集合中找到一个能满足下述条件的进程。

Finish[i]= = false;Need[i]≤work;如找到则执行步骤3;否则,执行步骤4;3.当进程i获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行Work = work + Allocation[i]Finish[i]=true;转向步骤2;4.若所有进程的Finish[i]都为true,则表示系统处于安全状态;否则,系统处于不安全状态。

五、实验内容设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。

系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;程序框架已经给出(见附件),要求将安全性算法补充完整。

源程序代码://************************************************************************ *********************////* 实验三死锁的避免――银行家算法*////**////* 本程序需要预先设置三个文件:Available_list.txt,Max_list.txt,Allocation_list.txt *////* 各文件格式如下:*////* Available_list.txt*////* 3 //表示共有3类资源*////* 10 5 7 //表示各类资源的初始可用个数,即Available[0]=10, Available[1]=5 *////**////**////* Max_list.txt*////* 5 //表示共有5个进程*////* 7 5 3 //表示各个进程需要各类资源的最大数目,即Max[0][0]=7, Max[0][1]=5*////* 3 2 2*////* 9 0 2*////* 2 2 2*////* 4 3 3*////**////**////* Allocation_list.txt*////* 0 1 0 //表示各个进程已分配各类资源的数目,即Allocation[0][0]=0, Allocation[0][1]=1 *////* 2 0 0*////* 3 0 2*////* 2 1 1*////* 0 0 2*////**////**////************************************************************************ *********************//#include <iostream.h>#include <stdio.h>#include <windows.h>#define MAX_PROCESS 32 //最大进程数#define MAX_RESOURCE 64 //最大资源类别int PROCESS_NUM; //实际总进程数int RESOURCE_NUM; //实际资源类别数int Available[MAX_RESOURCE]; //可利用资源向量int Max[MAX_PROCESS][MAX_RESOURCE]; //最大需求矩阵int Allocation[MAX_PROCESS][MAX_RESOURCE]; //分配矩阵int Need[MAX_PROCESS][MAX_RESOURCE]; //需求矩阵int Request_PROCESS; //发出请求的进程int Request_RESOURCE_NEMBER[MAX_RESOURCE]; //请求资源数void Read_Available_list(); //读入可用资源Availablevoid Read_Max_list(); //读入最大需求矩阵Maxvoid Read_Allocation_list(); //读入已分配矩阵Allocationvoid PrintInfo(); //打印各数据结构信息void Read_Request(); //输入请求向量void Allocate_Source(); //开始正式分配资源(修改Allocation_list.txt)void Recover_TryAllocate(); //恢复试分配前状态int Test_Safty(); //安全性检测void RunBanker(); //执行银行家算法//读入可用资源Availablevoid Read_Available_list(){FILE *fp;if((fp=fopen("Available_list.txt","r"))==NULL){cout<<"错误,文件打不开,请检查文件名"<<endl;exit(0);}fscanf(fp,"%d",&RESOURCE_NUM);int i=0;while(!feof(fp)){fscanf(fp,"%d",&Available[i]);i++;}fclose(fp);}//读入最大需求矩阵Maxvoid Read_Max_list(){FILE *fp;if((fp=fopen("Max_list.txt","r"))==NULL){cout<<"错误,文件打不开,请检查文件名"<<endl;exit(0);}fscanf(fp,"%d",&PROCESS_NUM);for(int i=0;i<PROCESS_NUM;i++)for(int j=0;j<RESOURCE_NUM;j++)fscanf(fp,"%d",&Max[i][j]);fclose(fp);}//读入已分配矩阵Allocationvoid Read_Allocation_list(){FILE *fp;if((fp=fopen("Allocation_list.txt","r"))==NULL){cout<<"错误,文件打不开,请检查文件名"<<endl;exit(0);}for(int i=0;i<PROCESS_NUM;i++)for(int j=0;j<RESOURCE_NUM;j++)fscanf(fp,"%d",&Allocation[i][j]);fclose(fp);}//设置需求矩阵Needvoid Set_Need_Available(){for(int i=0;i<PROCESS_NUM;i++)for(int j=0;j<RESOURCE_NUM;j++){Need[i][j]=Max[i][j]-Allocation[i][j];Available[j]=Available[j]-Allocation[i][j];}}//打印各数据结构信息void PrintInfo(){cout<<"进程个数:"<<PROCESS_NUM<<"\t"<<"资源个数:"<<RESOURCE_NUM<<endl;cout<<"可用资源向量Available:"<<endl;int i,j;for(i=0;i<RESOURCE_NUM;i++)cout<<Available[i]<<"\t";cout<<endl;cout<<"最大需求矩阵Max:"<<endl;for(i=0;i<PROCESS_NUM;i++){for(j=0;j<RESOURCE_NUM;j++)cout<<Max[i][j]<<"\t";cout<<endl;}cout<<"已分配矩阵Allocation:"<<endl;for(i=0;i<PROCESS_NUM;i++){for(j=0;j<RESOURCE_NUM;j++)cout<<Allocation[i][j]<<"\t";cout<<endl;}cout<<"需求矩阵Need:"<<endl;for(i=0;i<PROCESS_NUM;i++){for(j=0;j<RESOURCE_NUM;j++)cout<<Need[i][j]<<"\t";cout<<endl;}}//输入请求向量void Read_Request(){cout<<"输入发起请求的进程(0-"<<PROCESS_NUM-1<<"):";cin>>Request_PROCESS;cout<<"输入请求资源的数目:按照这样的格式输入x x x:";for(int i=0; i<RESOURCE_NUM; i++)cin>>Request_RESOURCE_NEMBER[i];}//开始正式分配资源(修改Allocation_list.txt)void Allocate_Source(){cout<<'\n'<<"开始给第"<<Request_PROCESS<<"个进程分配资源..."<<endl;FILE *fp;if((fp=fopen("Allocation_list.txt","w"))==NULL){cout<<"错误,文件打不开,请检查文件名"<<endl;exit(0);}for(int i=0;i<PROCESS_NUM;i++){for(int j=0;j<RESOURCE_NUM;j++)fprintf(fp,"%d ",Allocation[i][j]);fprintf(fp,"\n");}cout<<"分配完成,已更新Allocation_list.txt"<<endl;fclose(fp);}//恢复试分配前状态void Recover_TryAllocate(){for(int i=0;i<RESOURCE_NUM;i++){Available[i]=Available[i]+Request_RESOURCE_NEMBER[i];Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]-Request_RESOURC E_NEMBER[i];Need[Request_PROCESS][i]=Need[Request_PROCESS][i]+Request_RESOURCE_NEMB ER[i];}}//安全性检测//返回值:0:未通过安全性测试;1:通过安全性测试int Test_Safty(){cout<<'\n'<<"进入安全性检测!"<<endl;int i,j;int Work[MAX_RESOURCE]; //定义工作向量for(i=0;i<RESOURCE_NUM;i++){Work[i]=Available[i];}bool Finish[MAX_PROCESS]; //定义布尔向量for(i=0;i<PROCESS_NUM;i++)Finish[i]=false;int safe[MAX_RESOURCE]; //用于保存安全序列bool found=false; //判断在一轮查找中是否找到符合条件的进程int FinishCount=0; //找到满足条件的进程i的数目while(FinishCount<5){for(i=0;i<PROCESS_NUM;i++){if(Finish[i]==true) //检查是否满足条件Finish[i]==falsecontinue;bool HasResource=true;for(j=0;j<RESOURCE_NUM;j++) //检查是否满足条件Need[i]<=Work if(Need[i][j]>Work[j])HasResource=false;if(HasResource){for(j=0;j<RESOURCE_NUM;j++)Work[j]=Work[j]+Allocation[i][j];Finish[i]=true;safe[FinishCount]=i;FinishCount++;found=true;}}if(found){found=false;}elsebreak;}for(i=0;i<PROCESS_NUM;i++) //判断是否所有进程满足Finish[i]==true{if(Finish[i]==true)continue;else{cout<<"未通过安全性测试,不分配"<<endl;return 0;}}cout<<'\n'<<"找到一个安全序列:";for(i=0;i<PROCESS_NUM;i++) //打印安全序列{cout<<"P"<<safe[i];if(i!=PROCESS_NUM-1)cout<<"--->";}cout<<'\n'<<"已通过安全性测试!"<<endl;return 1;}void RunBanker(){ //执行银行家算法cout<<endl;cout<<"开始执行银行家算法..."<<endl;for(int i=0;i<RESOURCE_NUM;i++) //检查是否满足条件Request<=Need if(Request_RESOURCE_NEMBER[i]>Need[Request_PROCESS][i]){cout<<"\n第"<<Request_PROCESS<<"个进程请求资源不成功"<<endl;cout<<"原因:超出该进程尚需的资源的最大数量!"<<endl;return;}for(i=0;i<RESOURCE_NUM;i++) //检查是否满足条件Request<=Available if(Request_RESOURCE_NEMBER[i]>Available[i]){cout<<"\n第"<<Request_PROCESS<<"个进程请求资源不成功"<<endl;cout<<"原因:系统中无足够的资源!"<<endl;return;}else{//试分配,更新各相关数据结构Available[i]=Available[i]-Request_RESOURCE_NEMBER[i];Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]+Request_RESOURCE_N EMBER[i];Need[Request_PROCESS][i]=Need[Request_PROCESS][i]-Request_RESOURCE_NEMBER[i];}cout<<endl<<"试分配完成..."<<endl;if(Test_Safty()) //使用安全性算法检查,若满足,则正式分配Allocate_Source();else //否则恢复试分配前状态Recover_TryAllocate();}void main(){char c;Read_Available_list();Read_Max_list();Read_Allocation_list();Set_Need_Available();PrintInfo();while(1){Read_Request();RunBanker();cout<<"\n\n需要继续吗?(y-继续;n-终止)";cin>>c;if(c=='n')break;cout<<endl<<endl;PrintInfo();}}实验总结:上理论课时,老师上生动传神的演讲;上实验课时,老师不厌其烦为我们讲解,让我对银行家算法这一章节内容有了更深一层的认识和理解。

相关文档
最新文档