《操作系统专题实训》.docx
- 文档编号:11904286
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:14
- 大小:90.70KB
《操作系统专题实训》.docx
《《操作系统专题实训》.docx》由会员分享,可在线阅读,更多相关《《操作系统专题实训》.docx(14页珍藏版)》请在冰豆网上搜索。
《操作系统专题实训》
《操作系统专题实训》
课程设计报告
设计题目:
银行家算法实现
学号:
2008100822
姓名:
钟帅
专业:
计算机科学与技术
班级:
08计算机科学与技术网络班
(一)设计目的
资源分配拒绝策略,又称为银行家算法,是一种可以有效避免死锁的重要方法。
设计试验,让我们从银行家算法的实现更加深刻的理解和掌握这种算法,当然通过理解银行家算法的同时,也可以加深我们对死锁和死锁避免的方法的了解。
为了实现银行家算法,我们需要编写一个模拟资源分配的程序,观察死锁的产生,最后利用银行家算法避免死锁。
(二)设计要求
银行家算法是为了避免死锁,我们根据银行家算法的基本思路,编写一个程序,可以观察到死锁的产生,这时我们应用简单的银行家算法程序来有效的避免死锁的产生。
(三)设计内容和步骤
内容:
银行家算法是一种最有代表性的避免死锁的算法。
在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
作为一种死锁避免策略,该策略能确保系统中进程和资源总是处于安全状态,当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态,如果是,同意这个请求;如果不是,阻塞该进程直到同意该请求仍然是安全的。
步骤:
1.运行程序。
2.输入资源总类数和资源总数,初始化.
3.输入进程数。
4.依次输入各进程最大需求量。
5.初始化进程需求量的矩阵。
6.输入进程的资源请求量。
7.调用银行家算法完成分配。
(四)算法描述
银行家算法在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
设进程cusneed提出请求REQUEST[i],则银行家算法按如下规则进行判断。
(1)如果REQUEST[cusneed][i]<=NEED[cusneed][i],则转
(2);否则,出错。
(2)如果REQUEST[cusneed][i]<=AVAILABLE[cusneed][i],则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
(五)程序设计
#include
#include
#defineFALSE0
#defineTRUE1
#defineW10//最大进程数W=10
#defineR20//最大资源总数R=20
intM;
intN;
intALL_RESOURCE[W];
intAVAILABLE[R];//可利用资源向量
intMAX[W][R];//最大需求矩阵
intALLOCATION[W][R];//分配矩阵
intNEED[W][R];//需求矩阵
intRequest[R];//进程请求向量
voidinputdata();//数据输入
voidshowdata();//数据显示
voidchangdata(intk);//进程请求资源数据改变
voidrestoredata(intk);//数据恢复
intchksec(ints);//系统安全性的检测
intchkmax(ints);//检测最大需求
voidbank();//检测分配的资源是否合理
voidmain()
{inti,j;
inputdata();
for(i=0;i {j=chksec(i); if(j==0)break; } if(i>=M) cout<<"错误提示: 经安全性检查发现,系统的初始状态不安全\n"< else {cout<<"提示: 经安全性检查发现,系统的初始状态安全! "< bank(); } } voidinputdata() {inti=0,j=0,p; cout<<"请输入总进程数: "< do{ cin>>M; if(M>W)cout< "< }while(M>W); cout< cout<<"请输入资源的种类数: "< do{cin>>N; if(N>R) cout< "< cout< cout<<"请依次输入各类资源的总数量,即设置向量all_resource: "< for(i=0;i cout< cout<<"请依次输入各进程所需要的最大资源数量,即设置矩阵max: "< for(i=0;i { for(j=0;j { do{cin>>MAX[i][j]; if(MAX[i][j]>ALL_RESOURCE[j]) cout< "< } } cout< cout<<"请依次输入各进程已经占据的各类资源数量,即设置矩阵allocation: "< for(i=0;i { for(j=0;j { do{cin>>ALLOCATION[i][j]; if(ALLOCATION[i][j]>MAX[i][j]) cout< "< }while(ALLOCATION[i][j]>MAX[i][j]); } } cout< for(i=0;i for(j=0;j NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; for(j=0;j {p=ALL_RESOURCE[j]; for(i=0;i {p=p-ALLOCATION[i][j]; AVAILABLE[j]=p; if(AVAILABLE[j]<0) AVAILABLE[j]=0; } } } voidshowdata() {inti,j; cout<<"各种资源的总数量,即向量all_resource为: "< cout<<""; for(j=0;j cout<<"资源"< "< cout< cout<<"当前系统中各类资源的可用数量,即向量available为: "< cout<<""; for(j=0;j cout<<"资源"< "< cout< cout<<"各进程还需要的资源数量,即矩阵need为: "< for(i=0;i {cout<<"进程P"< "; for(j=0;j cout< cout< } cout< cout<<"各进程已经得到的资源量,即矩阵allocation为: "< for(i=0;i {cout<<"进程P"< "; for(j=0;j cout< cout< }cout< } voidchangdata(intk) {intj; for(j=0;j { AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j]; } } voidrestoredata(intk) { intj; for(j=0;j {AVAILABLE[j]=AVAILABLE[j]+Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j]; } } intchksec(ints) { intWORK,FINISH[W]; inti,j,k=0; for(i=0;i FINISH[i]=FALSE; for(j=0;j {WORK=AVAILABLE[j]; i=s; do {if(FINISH[i]==FALSE&&NEED[i][j]<=WORK) { WORK=WORK+ALLOCATION[i][j]; FINISH[i]=TRUE; i=0; }else {i++; } }while(i for(i=0;i if(FINISH[i]==FALSE) {return1; } }return0; } intchkmax(ints) {intj,flag=0; for(j=0;j { if(MAX[s][j]==ALLOCATION[s][j]) {flag=1; AVAILABLE[j]=AVAILABLE[j]+MAX[s][j]; MAX[s][j]=0; } }returnflag; } voidbank() { inti=0,j=0; charflag='Y'; while(flag=='Y'||flag=='y') { i=-1; while(i<0||i>=M) {cout<<"请输入需申请资源的进程号(从P0到P"< ): "; cout<<"p"; cin>>i; if(i<0||i>=M) cout<<"输入的进程号不存在,重新输入! "< } cout<<"请输入进程P"< "< for(j=0;j {cout<<"资源"< "; cin>>Request[j]; if(Request[j]>NEED[i][j]) {cout<<"进程P"< "; cout<<"申请不合理,出错! 请重新选择! "< flag='N'; break; } else {if(Request[j]>AVAILABLE[j]) {cout<<"进程P"< "; cout<<"申请不合理,出错! 请重新选择! "< flag='N'; break; } } } if(flag=='Y'||flag=='y') {changdata(i); if(chksec(i)) {cout< cout<<"该分配会导致系统不安全本次资源申请不成功,不予分配"< cout< restoredata(i); } else {cout< cout<<"经安全性检查,系统安全,本次分配成功,且资源分配状况如下所示: "< cout< showdata(); if(chkmax(i)) {cout<<"在资源分配成功之后,由于该进程所需的某些资源的最大需求量已经满足,"< cout<<"因此在进程结束后系统将回收这些资源! "< cout<<"在资源收回之后,各进程的资源需求和分配情况如下所示: "< showdata(); } } } cout< cout<<"是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: "; cin>>flag;} } (六)执行结果 (七)实验心得 为期一周的操作系统实训到这结束了,这次实训我选择的题目是银行家算法的实现,银行家算法在书里是比较重要的内容,通过这次成功的完成银行家算法的实现使我更加深刻的理解和掌握了银行家算法,也清楚了银行家算法避免死锁的基本思路。 理论上的知识固然重要,但毕竟只是概念上的理解,而这次实训很好的弥补了这点,不仅让我们的基础理论知识更加牢靠,同时也锻炼了我们动手解决问题的能力。 在实现银行家算法编程时,遇到了很多困难,编译老是出错,通过网上搜寻资料参考和同学们一起讨论,请教老师,最终还是很好的解决了这些问题,最终很好的完成了这次实训,在这里我要谢谢老师和同学们的帮助。 这次实训让我收获很大,体会也很深,但成功的喜悦让我对今后操作系统的学习更有信心了,相信这次实训给我们所有的同学带来的帮助都是不菲的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统专题实训 操作系统 专题