答:安全序列不唯一的问题
(2)在安全性算法中,为什么不用变量Available,而又定义一个临时变量work? 答:在安全性算法中,用一个临时变量是为了防止在该时刻不安全的情况下破坏数据的原值,如果不用临时变量work,而是直接用Available变量,那么如果该状态是不安全的,那么进行安全性算法的时候,会对Available进行修改的,破坏了原来的数值。如果该状态是安全的话,直接用Available也没有问题,用work临时变量让程序更全面,更符合算法的要求。
【参考代码】
部分参考代码如下: #include
#define M 3 //资源的种类数 #define N 5 //进程的个数
void output(int iMax[N][M],int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]); 输出格式
bool safety(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]); bool banker(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]);
void main() { int i,j; //当前可用每类资源的资源数 int iAvailable[M]={3,3,2}; //系统中N个进程中的每一个进程对M类资源的最大需求 int iMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //iNeed[N][M]每一个进程尚需的各类资源数 //iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数 int iNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //进程名 char cName[N]={'a','b','c','d','e'}; bool bExitFlag=true; //退出标记 char ch; //接收选择是否继续提出申请时传进来的值 bool bSafe; //存放安全与否的标志 //计算iNeed[N][M]的值 for(i=0;i 16 //统一的 output(iMax,iAllocation,iNeed,iAvailable,cName); //判断当前状态是否安全 bSafe=safety(iAllocation,iNeed,iAvailable,cName); //是否继续提出申请 while(bExitFlag) { cout<<\继续提出申请?\\ny为是;n为否。\\n\ cin>>ch; switch(ch) { case 'y': //cout<<\调用银行家算法\ bSafe=banker(iAllocation,iNeed,iAvailable,cName); if (bSafe) //安全,则输出变化后的数据 output(iMax,iAllocation,iNeed,iAvailable,cName); break; case 'n': cout<<\退出。\\n\ bExitFlag=false; break; default: cout<<\输入有误,请重新输入:\\n\ } } } //输出 void output(int iMax[N][M],int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]) { int i,j; cout<<\ Max \\tAllocation\\t Need \\t Available\ cout<<\ B C\\tA B C\\tA B C\\t A B C\ for(i=0;i 17 cout< //安全性算法,进行安全性检查;安全返回true,并且输出安全序列,不安全返回false,并输出不安全的提示; bool safety(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]) { } //定位ch对应的进程名在数组中的位置 //没找见返回-1,否则返回数组下标 int locate(char cName[N],char ch) { int i; for(i=0;i if (cName[i]==ch) //找到 return i; //未找到 return -1; } //提出申请,返回提出申请的进程名对应的下标 int request(char cName[N],int iRequest[M]) { int i,loc; char ch; bool bFlag=true; //判断输入的进程名是否有误 while(bFlag) { //输出进程名 for(i=0;i cout< 18 cout<<\输入提出资源申请的进程名:\\n\ cin>>ch; //定位ch对应的进程名在进程名数组中的位置 loc=locate(cName,ch); //没找到,重新输入 if (loc==-1) cout<<\您输入的进程名有误!请重新输入\ //找到,退出循环 else bFlag=false; } //输入提出申请的资源数 cout<<\输入申请各类资源的数量:\\n\for(i=0;i //返回提出申请的进程名对应的下标 return loc; } bool banker(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]) { } 【参考界面】 19 【实验总结】 本次操作系统的三次实验课主要围绕“Linux进程创建与进程通信”和“银行家算法”进行。第一、二节课,根据题目要求和自己的理解编代码,并结合老师给的参考代码在Linux系统虚拟机上实验,大体上顺利地做出正确的实验结果。第三节课,参照实验指导书开始银行家算法的实验,所编写的程序实现了银行家算法的功能,并在其基础上考虑了输出显示的格式等问题。通过查询资料、与同学讨论、多次调试解决了大部分问题,收获非常大。掌握了进程产生死锁原因,为什么要避免死锁以及银行家算法的数据结构,算法的执行过程,加深了对银行家算法的理解。 20