银行家算法实验报告(共11页).doc
精选优质文档-倾情为你奉上南华大学计算机学院实验报告 ( 2018学年春季学期 )课程名称 操作系统实验名称 银行家算法姓名学号专业网络工程班级1班地点教师曹军一、实验题目: 系统中有 m 个同类资源被 n 个进程共享,每个进程对资源的最大需求数分别为 S1, S2,Sn,且 Max(Si)<=m, (i=1,2,n)。进程可以动态地申请资源和释放资源。编写一个程序, 实现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当的信息。二、实验目的: 当系统的总资源数 m 小于或等于所有进程对资源的最大需求 S n n i i =1 时,就可能产生 死锁。死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁的一个著名 算法,该算法是在能确保系统处于安全状态时才把资源分配给申请者。通过本实验进一步理解死锁的概念,并选择一个算法来避免死锁。 进一步理解利用银行家算法避免死锁的问题; 在了解和掌握银行家算法。理解和掌握安全序列、安全性算法。三、实验内容及要求:1、设计进程对各类资源最大申请表示及初值的确定。2、设定系统提供资源的初始状况。3、设定每次某个进程对各类资源的申请表示。4、编制程序,依据银行家算法,决定其资源申请是否得到满足。5、显示资源申请和分配时的变化情况。四、实验过程:程序要求:1. 判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。2. 对于下一个时刻T1,某个进程Pk会提出请求Request(R1, ,Rm),判断分配给P k进程请求的资源之后是否安全。如果安全,给出安全序列;如果不安全给出理由。3. 输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置)。4. 输出:如果安全输出安全的进程序列,不安全提示信息。进程调度的实现过程:1. 变量初始化;2. 接收用户输入n,m,(输入或者默认的)Allocationij,Need ij;3. 按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;4. 如果安全,提示用户输入下一时刻进程Pk的资源请求Request(R1, ,Rm);5. 如果不安全或者无新请求则退出。源代码:#include <stdio.h>#include <iostream>#include <iomanip>#include <fstream>#include <windows.h>using namespace std;#define MaxNumber 20static int n;static int m;static int AvailableMaxNumber;static int MaxMaxNumberMaxNumber;static int AllocationMaxNumberMaxNumber;static int NeedMaxNumberMaxNumber;static int RequestMaxNumber;static int SafeOrderMaxNumber;static bool FinishMaxNumber;static bool isDisplayAvaliable = true;static char sourceName = 'A','B','C','D','E','F','G','H','I','J','K' /资源名称void input();bool isSystemSafe();void bankerAlgorithm();void display();int main() input(); bankerAlgorithm(); system("pause"); return 0;void input() /int n=6; /int m=3; ifstream inData; inData.open("C:/476.txt"); /读取数据 inData>>n; inData>>m; for (int i=0;i<m;i+) inData>>Availablei; for (int i=0;i<n;i+) for (int j=0;j<m;j+) inData>>Allocationij; for (int i=0;i<n;i+) for (int j=0;j<m;j+) inData>>Needij; for (int i=0;i<n;i+) for (int j=0;j<m;j+) Maxij = Needij + Allocationij; cout<<"*程序开始*"<<endl; display();bool isSystemSafe() int workMaxNumber; for (int i=0;i<m;i+) /m是资源个数A,B,C worki = Availablei; for (int i=0;i<n;i+) /n是进程个数 Finishi = false; SafeOrderi = -1; /初始化安全序列 int FinishNumebr = 0; int isSafe; int i =0,j; while(i<n) isSafe = 0; for(j = 0;j<m;j+) if (Finishi=false && Needij<=workj) isSafe+; else break; if (isSafe = m) /当且仅当进程对应的所有资源的数量都满足的时候才成立 Finishi = true; SafeOrderFinishNumebr = i; FinishNumebr+; for (j = 0;j<m;j+) workj += Allocationij; i=0; /找到满足条件的进程后,从头开始再进行寻找 else i+; if (FinishNumebr=n) cout<<"*Safe!*"<<endl; cout<<"对应的安全序列为:"<<endl; cout<<"P"<<SafeOrder0; for (int i=1;i<n;i+) cout<<"->"<<"P"<<SafeOrderi ; cout<<endl; return true; cout<<"*unSafe!*"<<endl; return false;void bankerAlgorithm() int chooseProcess; char isContinue; while(true) /设置两个布尔变量:判别请求向量是等待还是系统已经不再分配新的资源 bool isRequestNeedOK = true; bool isRequestAvailableOK = true; cout<<"请输入要申请资源的进程号(注意:第一个进程为0号,第二个进程为1号,以此类推!)"<<endl<<"chooseProcess=" cin>>chooseProcess; cout<<"请输入进程所请求的各类资源的数量:(A B C)"<<endl; for (int i=0;i<m;i+) cin>>Requesti; /输入错误判断 for (int i=0;i<m;i+) if (Requesti>NeedchooseProcessi) cout<<"*当前运行结果*"<<endl; cout<<"您输入的请求进程所对应的资源数量超过最大需求量,请重新输入!"<<endl; / cout<<"*"<<endl; isRequestNeedOK = false; continue; if (Requesti>Availablei) cout<<"*当前运行结果*"<<endl; cout<<"您输入的请求进程的资源数量超过系统所供给的最大资源数量pi必须等待,请重新输入!"<<endl; / cout<<"*"<<endl; isRequestAvailableOK = false; continue; for (int j = 0;j<m;j+) Availablej -=Requestj; AllocationchooseProcessj += Requestj; NeedchooseProcessj -= Requestj; cout<<"*"<<endl; if (!isSystemSafe() /如何不满足系统安全性算法,将本次试探作废,恢复到原来的值 for (int j = 0;j<m;j+) Availablej +=Requestj; AllocationchooseProcessj -= Requestj; NeedchooseProcessj += Requestj; /当请求向量Request满足和Need、Available的关系时,证明系统已不能再分配资源 if (isRequestAvailableOK&&isRequestNeedOK) cout<<"*当前运行结果*"<<endl; cout<<"当前可利用资源已经不能满足任何进程的需求,故系统进入不安全状态,系统不分配资源!"<<endl; cout<<"*"<<endl; cout<<"尝试根据p(i)发出的请求向量后的资源情况:"<<endl; display(); cout<<"*"<<endl; cout<<"是否继续输入请求变量request进行测试,是(Y),否(N)"<<endl; cout<<"isContinue = " cin>>isContinue; if (isContinue='Y'|isContinue='y') /input();/实现多次请求(保留上一次请求的状态) continue; else if (isContinue='N'|isContinue='n') cout<<"*程序结束*"<<endl; break; void display() char processName = '1','2','3','4','5','6' cout<<"-"<<endl; cout<<"当前进程个数为 n = "<<n<<endl; cout<<"当前资源个数为 m = "<<m<<endl; cout<<"系统可利用资源数情况如下:"<<endl; for (int i=0;i<m;i+) cout<<setw(5)<<sourceNamei<<" " cout<<endl; cout<<setw(5)<<Available0<<" " cout<<setw(5)<<Available1<<" " cout<<setw(5)<<Available2<<" "<<endl; cout<<"-"<<endl; cout<<"processName" cout<<setw(10)<<"Max"<<" " cout<<setw(15)<<"Allocation"<<" " cout<<setw(10)<<"Need"<<" " if (isDisplayAvaliable) cout<<setw(15)<<"available" cout<<endl; cout<<setw(15); for (int i=0;i<m;i+) cout<<sourceNamei<<setw(3); cout<<setw(5); for (int i=0;i<m;i+) cout<<sourceNamei<<setw(3); cout<<setw(10); for (int i=0;i<m;i+) cout<<sourceNamei<<setw(3); if (isDisplayAvaliable) cout<<setw(5); for (int i=0;i<m;i+) cout<<sourceNamei<<setw(3); cout<<endl; /设置矩阵输出形式 bool OnlyOneLineAvaliable = true; /Avaliable数组只输出第一行 for (int i=0;i<n;i+) cout<<setw(5)<<"P"<<processNamei; cout<<setw(10); for (int j = 0;j<m;j+) cout<<Maxij<<setw(3); cout<<setw(5); for (int j = 0;j<m;j+) cout<<Allocationij<<setw(3); cout<<setw(10); for (int j = 0;j<m;j+) cout<<Needij<<setw(3); if (isDisplayAvaliable&&OnlyOneLineAvaliable) cout<<setw(5); for (int i=0;i<m;i+) cout<<Availablei<<setw(3); OnlyOneLineAvaliable = false; cout<<endl; 五、实验结果:六、实验总结: 通过本次实验,我慢慢了了解到银行家算法这个问题,对这个问题有了自己的认识和了解。通过实验的操作实践,去真正搞懂课本上的知识有一种豁然开朗的感觉。所以说实践出真知。专心-专注-专业