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