银行家算法实现_第1页
银行家算法实现_第2页
银行家算法实现_第3页
银行家算法实现_第4页
银行家算法实现_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安文理学院软件学院计算机操作系统设计题目:银行家算法的实现学生学号:专业班级:学生姓名:学生成绩:

目录1.摘要 32.设计思想 43.系统分析 43.1整个银行家算法的思路 43.2算法用到的主要数据结构和C++语言说明 43.2.1可利用资源向量 43.2.2最大需求矩阵 43.2.3已分配矩阵 43.2.4还需求矩阵 53.2.5申请各类资源数量 53.3银行家算法主程序 53.3.1系统初始化 53.3.2安全性算法 53.3.3检索用户 53.3.4检查用户请求 53.3.5进行资源的预分配 53.3.6系统调用安全性检查算法 53.4安全性检查算法 53.4.1设置两个临时变量 53.4.2在进程中查找符合以下条件的进程 63.4.3如果查找成功则存储安全序列并进行资源的模拟回收 64.函数调用关系 74.1程序流程图 74.2程序模块划分 84.2.1字符判断模块 84.2.2程序初始化模块 84.2.3当前安全性检查模块 84.2.4银行家算法模块 84.2.5显示分配模块 85.数据结构分析 85.1定义全局变量 85.2函数声明 95.3主函数结构 95.4各模块含义 105.4.1整个银行家算法的思路 105.4.2算法用到的主要数据结构和C语言说明 105.4.3银行家算法 105.4.4安全性检查算法 106.程序测试结果 127.心得体会 148.主要参考文献 15附录:部分源程序代码 161.摘要银行家算法是一种最有代表性的避免死锁的算法,在避免死锁方法中允许进程动态的申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。所以通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。关键词:资源,分配,死锁,状态2.设计思想我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。为保证资金的安全,银行家规定:(1)当一个顾客对资金的最大需求量不超过银行家现有的资金是就可接纳该顾客;(2)顾客可以分期贷款,但贷款的总数不能超过最大需求量;(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;(4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源是,要测试该进程对资源的最大需求量,如果系统现存的资金可以满足它的最大需求量,则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占有的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过了最大需求量则拒绝分配资源,若没有则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要延迟分配。3.系统分析3.1整个银行家算法的思路先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。3.2算法用到的主要数据结构和C++语言说明3.2.1可利用资源向量intAvailable[M]M为资源的类型。3.2.2最大需求矩阵intMax[N][M]N为进程的数量。3.2.3已分配矩阵intAllocation[N][M]3.2.4还需求矩阵intNeed[N][N]3.2.5申请各类资源数量intRequest[x];intWork[x];intFinish[y];//是否有足够的资源分配给进程,0为否,非0为是3.3银行家算法主程序3.3.1系统初始化调用函数chushihua(),输入进程数量,资源种类,各资源可用数量,各进程已分配、最大需求各资源数量等3.3.2安全性算法调用函safe()检查当前资源分配状态。3.3.3检索用户用bank()函数,输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。3.3.4检查用户请求检查用户请求是否小于还需求量,条件是K<=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量。检查用户的请求是否小于系统中的可利用资源数量,条件是K<=AVALIABLE[I,J]。如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句跳转)3.3.5进行资源的预分配AVALIBLE[I][J]=AVALIBLE[I][J]-K;ALLOCATION[I][J]=ALLOCATION[I][J]+K;NEED[I][J]=NEED[I][J]-K;3.3.6系统调用安全性检查算法safe()函数进行检查,如果检查不安全,则进行回收,进程资源申请失败进入等待。否则不用回收,并检查该进程是否已获得所有需要资源,如是则进行其拥有资源释放,语句如下:Available[j]=Available[j]+Allocation[k][j];Allocation[k][j]=0;3.4安全性检查算法3.4.1设置两个临时变量FINISH[N]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可设为1。WORK[M]记录模拟执行中资源的回收情况,初值为AVAILABLE[M]的值。3.4.2在进程中查找符合以下条件的进程条件1:FINISH[I]=0条件2:NEED[I][J]〈=WORK[J]3.4.3如果查找成功则存储安全序列并进行资源的模拟回收FINISH[I]=1WORK[J]=WORK[J]+ALLOCATION[I][J];4.函数调用关系4.1程序流程图开始开始请输入资源数请输入各类资源可利用的数请输入当前资源可利用的数量请输入当前可分配的资源数量请输入当前已分配的资源数请输入进程对资源的最大需求数量Max≤资源数提示错误系统当前状态统计结束4.2程序模块划分4.2.1字符判断模块判断输入的字符是否为数字,如果不是则提示出错并重新输入,主要处理输入为非数字时程序出现运行错误现象。此模块功能由数字判断函数(intshuzi(intsz);)实现。4.2.2程序初始化模块用于程序开始进行初始化输入数据:进程数量、资源种类、各种资源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。此模块功能在系统初始化函数(voidchushihua();)中实现。4.2.3当前安全性检查模块用于判断当前状态安全性,根据不同地方的调用提示处理不同,在安全性算函数(voidsafe();)中实现。4.2.4银行家算法模块进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程,在银行家算法函数(voidbank();)中实现。4.2.5显示分配模块显示当前资源分配详细情况,包括:各种资源的总数量(all)、系统目前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量,在显示分配情况函数(voidshowdata();)中实现。4.2.6签名模块:用于程序结束时显示程序版权声明签名等,在签名函数(voidsign();)中实现。5.数据结构分析5.1定义全局变量constintx=50,y=100;//定义常量,便于修改intAvailable[x];//各种资源可利用的数量intAllocation[y][y];//各进程当前已分配的资源数量intMax[y][y];//各进程对各类资源的最大需求数intNeed[y][y];//还需求矩阵intRequest[x];//申请各类资源的数量intWork[x];//工作向量,表系统可提供给进程运行所需各类资源数量intFinish[y];//表系统是否有足够的资源分配给进程,0为否,1为是intp[y];//存储安全序列inti,j;//全局变量,主要用于循环语句中intn,m;//n为进程的数量,m为资源种类数intl=0,counter=0;5.2函数声明intshuzi(intsz);//数字判断函数,还可使用voidshuzi(int&sz);方式voidchushihua();//系统初始化函数voidsafe();//安全性算法函数voidbank();//银行家算法函数voidshowdata();//函数showdata,输出当前资源分配情况voidsign();//签名函数5.3主函数结构intmain(){system("color06f");//设置当前窗口的背景色和前景色cout<<……//显示程序开始提示信息chushihua();//初始化函数调用cout<<endl<<endl;showdata();//输出初始化后的状态//===判断当前状态的安全性===safe();//安全性算法函数调用if(l<n){cout<<"\n当前状态不安全,无法申请,程序退出!!!!!"<<endl;cout<<endl;system("pause");sign();//调用签名函数return0;//break;}else{inti;//局部变量l=0;cout<<"\n安全的状态!!!"<<endl;cout<<"安全序列为:";cout<<endl<<"进程"<<"("<<p[0]<<")";//输出安全序列,考虑显示格式,先输出第一个for(i=1;i<n;i++){cout<<"==>>"<<"进程"<<"("<<p[i]<<")";}for(i=0;i<n;i++)Finish[i]=0;//所有进程置为未分配状态cout<<endl<<endl;}bank();//银行家算法函数调用return0;}5.4各模块含义5.4.1整个银行家算法的思路先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。5.4.2算法用到的主要数据结构和C语言说明(1)可利用资源向量INTAVAILABLE[M]M为资源的类型;(2)最大需求矩阵INTMAX[N][M]N为进程的数量;(3)已分配矩阵INTALLOCATION[N][M];(4)还需求矩阵INTNEED[N][N];(5)申请各类资源数量intRequest[x];(6)工作向量intWork[x]。(7)intFinish[y];//表示系统是否有足够的资源分配给进程,0为否,非0为是5.4.3银行家算法(1)系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等。(2)输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。(3)检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量。(4)检查用户的请求是否小于系统中的可利用资源数量,条件是K<=AVALIABLE[I,J]。如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句)。(5)进行资源的预分配,语句如下:AVALIBLE[I][J]=AVALIBLE[I][J]-K; ALLOCATION[I][J]=ALLOCATION[I][J]+K; NEED[I][J]=NEED[I][J]-K;(6)系统调用安全性检查算法(safe()函数)进行检查,如果检查通过,则不回收,否则进行回收,进程资源申请失败进入等待。5.4.4安全性检查算法(1)设置两个临时变量FINISH[N]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行束,则可设为1,也可设其它非零值以表示执行的先后次序。WORK[M]记录模拟执行中资源的回收情况,初值为AVAILABLE[M]的值。(2)在进程中查找符合以下条件的进程条件1:FINISH[I]=0条件2:NEED[I][J]〈=WORK[J].(3)如果查找成功则进行资源的模拟回收,语句如下WORK[J]=WORK[J]+ALLOCATION[I][J];FINISH[I]=1或查找到的顺序号.(4)、如果查找不成功,则检查所有进程的FINISH[],如果有一个为0,则系统不为0,返回不成功标志。否则返回成功标志。6.程序测试结果程序调试图如下所示:显示资源最大需求数界面资源管理界面需要资源数量界面7.心得体会在设计此程序的过程中,我遇到过许多问题,也学到了很多东西。本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。在算法的数据结构设计上考虑了很长时间。在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,综合这些算法思想和自己的思路对程序做了很好的设计方式,对一些算法的优越性等也作了一些考虑。此外考虑最多的就是异常错误处理的设计。一个好的程序必须能在各种环境下都有其相应的处理方式,至少能应对一些常见的可能发生的错误。比如一般的要求输入为数字时,如果输入了一个非数字字符,程序就会立即出错无法继续运行,本程序针对这个问题设计了一个shuzi();函数进行处理,处理方式为:接受键盘输入的字符为字符串,然后对字符串的每个字符进行判断是否为数字,如果有非数字字符出现则提示出错并要求重新输入。又如在判断是否继续时要求输入Y/N时,按一般的方式,如果输入为多个字符,则多余的字符会保存在缓冲区,到下次要求输入时输入而导致出错,对此问题设计处理方式为接受输入字符保存为串然后只取其首字符进行判断。还有很多类似的错误处理。还有在设置程序的显示优化时,发现暂停函数在不同的情况下执行顺序不同,如此等等。在课程设计过程中遇到了许多问题,也向同宿舍的同学做了一些请教一起讨论,也因此从他们身上学到了许多东西。8.主要参考文献1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.2.王清,李光明.《计算机操作系统》.冶金工业出版社.3.孙钟秀等.\o"操作系统教程"操作系统教程.高等教育出版社4.曾明.

\o"Linux操作系统应用教程"Linux操作系统应用教程.陕西科学技术出版社.5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.6.孟静,

\o"操作系统教程--原理和实例分析"操作系统教程--原理和实例分析.高等教育出版社7.周长林,\o"计算机操作系统教程"计算机操作系统教程.高等教育出版社8.张尧学,\o"计算机操作系统教程"计算机操作系统教程,清华大学出版社9.任满杰,\o"操作系统原理实用教程"操作系统原理实用教程,电子工业出版社附录:部分源程序代码#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>//===定义全局变量===constintx=50,y=100;//定义常量,便于修改intAvailable[x];//各种资源可利用的数量intAllocation[y][y];//各进程当前已分配的资源数量intMax[y][y];//各进程对各类资源的最大需求数intNeed[y][y];//还需求矩阵intRequest[x];//申请各类资源的数量intWork[x];//工作向量,表示系统可提供给进程继续运行所需的各类资源数量intFinish[y];//表示系统是否有足够的资源分配给进程,0为否,非0为是intp[y];//存储安全序列inti,j;intn,m;//n为进程的数量,m为资源种类数intl=0,counter=0;//函数声明intshuzi(intsz);//数字判断函数或者使用voidshuzi(int&sz);方式voidchushihua();//系统初始化函数voidsafe();//安全性算法函数voidbank();//银行家算法函数voidshowdata();//函数showdata,输出当前资源分配情况voidsign();//签名函数//===数字判断函数===intshuzi(intsz){//输入数据并判断是否为数字char*temp;temp=newchar;//临时指针,存放输入字符intlen;//存储取字符的长度sz=0;//清零chars;//do{//输入赌注,只能输入数字//gets(temp);//getline(cin,temp)cin>>temp;len=strlen(temp);//取字符长度for(inti=0;i<len;i++){s=*(temp+i);if(s<'0'||s>'9'){cout<<"请输入数字\n\n";cout<<"请重新输入:";break;}}}while(s<'0'||s>'9');for(inti=0;i<len;i++){//输入字符串转化为整形数字intt=1;for(intj=1;j<len-i;j++)t*=10;sz+=(*(temp+i)-48)*t;}returnsz;}//===系统初始化函数===voidchushihua(){//===系统初始化输入===cout<<"%%程序开始,系统初始化输入%%"<<endl;//<<endlcout<<"==============================================================="<<endl<<endl;cout<<"请输入进程的数量:";//从此开始输入有关数据n=shuzi(n);cout<<"请输入资源种类数:";m=shuzi(m);cout<<endl<<endl<<"请输入各种资源可利用的数量("<<m<<"种):"<<endl;cout<<endl;for(j=0;j<m;j++){cout<<"输入资源"<<j<<"可利用的数量Available["<<j<<"]:";Available[j]=shuzi(Available[j]);Work[j]=Available[j];//初始化Work[j]//cout<<endl;}//system("cls");//清屏cout<<endl;cout<<"请输入各进程当前已分配的资源数量Allocation["<<n<<"]["<<m<<"]:"<<endl<<endl;for(i=0;i<n;i++){for(j=0;j<m;j++){cout<<"请输入进程"<<i<<"当前已分配的资源"<<j<<"数量:";Allocation[i][j]=shuzi(Allocation[i][j]);//cout<<endl;}cout<<endl;Finish[i]=0;//初始化Finish[i]//break;}cout<<endl<<endl;cout<<"请输入各进程对各类资源的最大需求数Max["<<n<<"]["<<m<<"]:"<<endl<<endl;for(i=0;i<n;i++){for(j=0;j<m;j++){cout<<"请输入进程"<<i<<"对资源"<<j<<"的最大需求数:";Max[i][j]=shuzi(Max[i][j]);if(Max[i][j]>=Allocation[i][j])//Need[i][j]=Max[i][j]-Allocation[i][j];//计算还需求量elseNeed[i][j]=0;//最大需求量小于已分配量时还需求量为0,即此类资源已足够不需再申请}cout<<endl;}cout<<endl<<"%%初始化完成!%%"<<endl;}//===安全性算法函数===voidsafe(){l=0;for(i=0;i<n;){//i++if(Finish[i]==0){//寻找Finish[i]==0的进程条件一counter=0;//记数器/*算法一:for(j=0;j<m;j++){if(Work[j]>=Need[i][j])//可用大于等于需求counter=counter+1;//记数}if(counter==m){…*///算法二:for(j=0;j<m;j++)if(Work[j]>=Need[i][j]);//可用大于等于需求else{counter=1;break;}if(counter!=1){//进程的每类资源量都符合条件Work[j]>=Need[i][j]条件二p[l]=i;//存储安全序列Finish[i]=1;//标志为可分配for(j=0;j<m;j++){Work[j]=Work[j]+Allocation[i][j];//释放资源}l=l+1;//记数,当L=N时说明满足安全序列,即都符合条件Work[j]>=Need[i][j]i=-1;//从第一个进程开始继续寻找满足条件一二的进程}}i++;//for循环继续寻找}}//===显示分配情况函数===voidshowdata()//函数showdata,输出当前资源分配情况{inti,j;//局部变量intAll[y];//各种资源的总数量intl2;//局部变量l1,cout<<"==============================================================="<<endl<<endl;cout<<"%%系统当前状态如下:%%"<<endl<<endl;cout<<"%%各种资源的总数量(all):"<<endl;for(j=0;j<m;j++){cout<<"资源"<<j<<":";All[j]=Available[j];//初始化先赋值加上可利用量for(i=0;i<n;i++){All[j]+=Allocation[i][j];//再加上每个进程已分配量计算J类资源总量}cout<<All[j]<<"";if((j+1)%5==0)cout<<endl;//每行显示五个&&j!=0}cout<<endl<<endl;cout<<"%%系统目前各种资源可用的数为(available):"<<endl;for(j=0;j<m;j++){cout<<"资源"<<j<<":"<<Available[j]<<"";if((j+1)%5==0)cout<<endl;//每行最多显示五个&&j!=0}cout<<endl<<endl;cout<<"%%各进程已经得到的资源量(allocation):"<<endl;//l1=0;//归零for(i=0;i<=m/5;i++){//设计每行最多显示五种资源for(j=i*5;j<i*5+5&&j<m;j++)cout<<"资源"<<j;cout<<endl;for(l2=0;l2<n;l2++){cout<<"进程"<<l2<<":";for(j=i*5;j<i*5+5&&j<m;j++)cout<<Allocation[l2][j]<<"";cout<<endl;}}cout<<endl;cout<<"%%各进程还需要的资源量(need):"<<endl;//<<endl//l1=0;for(i=0;i<=m/5;i++){//设计每行显示五种资源for(j=i*5;j<i*5+5&&j<m;j++)cout<<"资源"<<j;cout<<endl;for(l2=0;l2<n;l2++){cout<<"进程"<<l2<<":";for(j=i*5;j<i*5+5&&j<m;j++)cout<<Need[l2][j]<<"";cout<<endl;}}cout<<endl;cout<<"==============================================================="<<endl;cout<<endl;system("pause");//暂停}//===签名函数===voidsign(){system("cls");//清屏cout<<endl<<endl<<endl<<endl<<endl<<endl;cout<<"\t\t========================================="<<endl;cout<<"\t\t=@@="<<endl;cout<<"\t\t=@谢谢你的使用@="<<endl;cout<<"\t\t=@@="<<endl;cout<<"\t\t========================================="<<endl;cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;//getch();//等待键盘输入,不返回任何值,用于设置程序运行界面system("pause");//暂停比较两种方式/*经过在不同的编辑器中调试发现,不同的调试器对函数执行的顺序有差别如在此处使用getch()和system("pause")函数时,在visualc++6.0中先执行此函数再显示,而在dev-c++中则按顺序执行对此问题我在很多地方搜索查找均未找到满意的答案,本次换用调试器才发现理解--4.29本次调试格式时,将换行命令"\n"改为endl时,发现system("pause")函数执行变为顺序执行,由此领悟到"\n"命令和system("pause")调用了一样系统函数,在调用的顺序上system("pause")优先所以它就先执行了查找了一下相关帮助:在OSTREAM.H中有这样的一个inline函数:inline_CRTIMPostream&__cdeclendl(ostream&_outs){return_outs<<'\n'<<flush;}也就是说endl=return_outs<<'\n'<<flush;endl除了写'\n'进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕,如果考虑效率就用'\n'*///cout<<"\t\t\t\t输入任意字符结束";//处理最后生成EXE程序执行问题//cin>>l;cout<<"\t\t\t";}//===银行家算法函数===voidbank(){cout<<"==============================================================="<<endl<<endl;cout<<"%%以下开始为进程进行资源分配申请%%"<<endl<<endl;//===申请资源===intk=0;//用于输入进程编号boolr=false;//初值为假,输入Y继续申请则置为真do{//输入请求cout<<"请输入申请资源的进程编号(输入0--"<<n-1<<"之间):";k=shuzi(k);cout<<endl;while(k>n-1){//输入异常处理cout<<endl<<"您输入了错误的进程号,请重新输入!"<<endl;cout<<endl<<"请输入申请资源的进程编号(输入0--"<<n-1<<"之间):";k=shuzi(k);cout<<endl;}cout<<endl<<"请输入该进程申请各类资源的数量:"<<endl;for(j=0;j<m;j++){do{//do……while循环判断申请输入的情况cout<<"进程"<<k<<"申请资源["<<j<<"]的数量:";Request[j]=shuzi(Request[j]);cout<<endl;if(Request[j]>Need[k][j]){//申请大于需求量时出错,提示重新输入(贷款数目不允许超过需求数目)cout<<"申请大于需要量!!!"<<endl;cout<<"您申请资源"<<j<<"的数量为"<<Request[j]<<",大于进程"<<k<<"对该资源需求量"<<Need[k][j]<<"。"<<endl;cout<<"请重新输入!!!"<<endl;}else//先判断是否申请大于需求量,再判断是否申请大于可利用量if(Request[j]>Available[j]){//申请大于可利用量,应该阻塞等待?……???cout<<"\n没有那么多资源,目前可利用资源"<<j<<"数量为"<<Available[j]<<",本次申请不成功,进程等待!!!"<<endl;Finish[k]=0;//该进程等待gotoppp;//goto语句跳转,结束本次申请}}while(Request[j]>Need[k][j]);//Request[j]>Available[j]||}//改变Avilable、Allocation、Need的值for(j=0;j<m;j++){Available[j]=Available[j]-Request[j];Allocation[k][j]=Allocation[k][j]+Request[j];Need[k][j]=Need[k][j]-Request[j];Work[j]=Available[j];}//判断当前状态的安全性safe();//调用安全性算法函数if(l<n){l=0;cout<<"\n当前状态不安全,不予分配!!!!!!"<<endl;//恢复数据for(j=0;j<m;j++){Available[j]=Available[j]+Request[j];Allocation[k][j]=Allocation[k][j]-Request[j];Need[k][j]=Need[k][j]+Request[j];Work[j]=Available[j];}for(i=0;i<n;i++)Finish[i]=0;//进程置为未分配状态}else{//system("cls");l=0;cout<<"\n申请资源成功!!!"<<endl;//===========================================/*//如果该进程所有需要的资源都已申请到,即NEED[k][j]均为零,则进程可以执行,执行完后需释放其所有拥有的资源//算法一:for(j=0;j<m;j++)if(Need[k][j]==0)l=l+1;if(l==m){//此处借用l做下计数器for(j=0;j<m;j++){//释放该进程的所有资源Available[j]=Available[j]+Max[k][j];Allocation[k][j]=0;}}l=0;//归零*///算法二:(相对第一种算法节省时间)for(j=0;j<m;j++){if(Need[k][j]==0);else{//有一种资源还没全部申请到,则该进程不可执行,不能释放拥有的资源l=1;//置l为1,作为判断标志break;}}if(l!=1){//进程可以执行,则释放该进程的所有资源for(j=0;j<m;j++){Available[j]=Available[j]+Allocation[k][j];Allocation[k][j]=0;}co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论