《2022年银行家算法实验报告》由会员分享,可在线阅读,更多相关《2022年银行家算法实验报告(11页珍藏版)》请在金锄头文库上搜索。
1、操作系统课程综合性实验报告:学号:2016 年11 月 20 日实验题目进程调度算法程序设计一、实验目的通过对安全性算法和银行家算法的模拟,进一步理解资源分配的基本概念,加深对资源申请,资源分配银行家算法以及系统是否能分配安全性算法资源的理解。二、设备与环境1. 硬件设备: PC 机一台2. 软件环境:安装Windows 操作系统或者Linux 操作系统,并安装相关的程序开发环境,如 C C+Java 等编程语言环境。三、实验内容用 C 语言或其它语言,如Java实现对资源的资源申请与分配;一银行家算法bank()函数 :进程 i 发出请求资源申请,(1)如果 Request j=needi,
2、j, 转向步骤 (2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。(2)如果: Request ij=availablei,j,转向步骤 (3),否则表示尚无足够资源,进程i 需等待。(3)假设以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:Availablei,j= Availablei,j- Request j;Allocationij= Allocationij+ Request j;needij= needij- Request j;(4)试分配后,执行安全性检查,调用check()函数检查此次资源分配后系统是否处于安全状态。假设安
3、全,才正式将资源分配给进程。否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。(5)用 dowhile 循环语句实现输入字符y/n 判断是否继续进行资源申请。二安全性算法safe()函数 : (1)设置两个向量:工作向量Work,它表示系统可提供应进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available 。 工作向量Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finishi=false ;当有足够的资源分配给进程时,精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 1
4、1 页第 1 页再令 Finishi=true 。(2)在进程中查找符合以下条件的进程:条件 1: Finishi=false ; 条件 2: needij=Workj 假设找到,则执行步骤(3)否则,执行步骤(4) (3)当进程获得资源后, 可顺利执行, 直至完成, 并释放出分配给它的资源,故应执行:Workj= Workj+ Allocationij; Finishi=true ; goto step (2);(4)如果所有的Finishi=true 都满足,则表示系统处于安全状态,否则,处于不安全状态。四、实验结果及分析1.实验设计说明按 0 由用户输入,按1 由系统提供数据2.实验代码
5、#include #include #include #define max_process 50 /最大进程数#define max_resource 100/ 最大资源数#define false 0 #define true 1 int availablemax_resource=3,3,2;/可利用资源向量int maxmax_processmax_resource=7,5,3,3,2,2,9,0,2,2,2,2,4,3,3;/最大需求矩阵int allocationmax_processmax_resource=0,1,0,2,0,0,3,0,2,2,1,1,0,0,2;/分配矩阵i
6、nt needmax_processmax_resource;/ 需求矩阵int requestmax_processmax_resource;/ 进程需要资源数int finishmax_process; int m=5,n=3; void init(); int safe(); void bank(); void init2(); void print(); void print2(); void main() int i; printf( 请输入测试数据,按0 由用户输入测试数据,按1 由系统提供测试数据:n); scanf(%d,&i); 精选学习资料 - - - - - - - -
7、- 名师归纳总结 - - - - - - -第 2 页,共 11 页第 2 页switch(i) case 0: init(); break; case 1: init2(); break; print(); safe(); bank(); void init() int i,j; printf( 请输入进程数目:n); scanf(%d,&m); printf( 请输入资源种类数目:n); scanf(%d,&n); printf( 请按顺序输入系统中可利用的每种资源量:n); for(i=0;in;i+) scanf(%d,&availablei); printf( 请输入最大需求矩阵:n
8、); for (i=0;im;i+) for (j=0;jn;j+) scanf(%d,&maxij); printf( 请输入分配矩阵:n); for (i=0;im;i+) for (j=0;jn;j+) scanf(%d,&allocationij); for (i=0;im;i+) for (j=0;jn;j+) needij=maxij-allocationij; if(needij0) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 11 页第 3 页printf( 您输入的第 %d 个进程的 %d 个资源数据有错,请重新输
9、入n,i,j); void init2() int i,j; for (i=0;im;i+) for (j=0;jn;j+) needij=maxij-allocationij; void print() int i,j; printf( 最大需求矩阵如下:n); for(i=0;im;i+) printf(p%dt,i); for(j=0;jn;j+) printf(%dt,maxij); printf(n); printf( 分配矩阵如下:n); for(i=0;im;i+) printf(p%dt,i); for(j=0;jn;j+) printf(%dt,allocationij);
10、printf(n); printf( 需求矩阵如下:n); for(i=0;im;i+) printf(p%dt,i); for(j=0;jn;j+) printf(%dt,needij); printf(n); printf( 系统可提供资源如下:n); for(j=0;jn;j+) printf(%dt,availablej); printf(n); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 11 页第 4 页 int safe() int i,j,k=0,lm,p; int workn; for (i=0;in;i+) wo
11、rki=availablei; for (i=0;im;i+) finishi=false; for(i=0;im;i+) if(finishi=true) continue; else for(j=0;j workj)break; if(j=n) for(p=0;pn;p+) workp=workp+allocationip; finishi=true; lk=i; k+; i=-1; else continue; if(k=m) printf(n); printf(*此时刻资源分配情况*n); printf( 进 程| Work | Need | Allo | W+Allo | Finis
12、hn); for (i=0;in;i+) worki=availablei; for(i=0;im;i+) printf( p%d |,li); for(p=0;pn;p+) printf(%3d ,workp); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 11 页第 5 页printf(|); for(p=0;pn;p+) printf(%3d ,needlip); printf(|); for(p=0;pn;p+) printf(%3d ,allocationlip); printf(|); for(p=0;pn;p+) pr
13、intf(%3d ,allocationlip+workp); printf(|); printf( Turen); for(p=0;pn;p+) workp=workp+allocationlip; if(i=4) return true; else printf( 系统不安全 n); return false; void bank() int i,number; char answer; while(1) printf(n 请输入需申请资源的进程号第一个进程号为0 :n); scanf(%d,&number); printf( 请依次输入该进程所需申请的所有资源数目:n); for(i=0
14、;in;i+) scanf(%d,&requestnumberi); for(i=0;ineednumberi) printf( 申请的资源超过还需要的资源,请重新输入n); continue; if(requestnumberiavailablei) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 11 页第 6 页printf( 申请的资源超过所能提供的资源,请重新输入n); continue; for(i=0;in;i+) availablei=availablei-requestnumberi; allocationnumber
15、i=allocationnumberi+requestnumberi; neednumberi=neednumberi-requestnumberi; if(safe()printf(分配成功! n); else printf( 系统无法分配资源!n); for(i=0;in;i+) availablei=availablei+requestnumberi; allocationnumberi=allocationnumberi-requestnumberi; neednumberi=neednumberi+requestnumberi; printf( 是否继续申请资源?请答复(Y,N):n
16、); scanf(%c,&answer);/ 清楚回车符scanf(%c,&answer); if(answer=Y | answer=y) continue; else break; 3.实验结果精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 11 页第 7 页按 1 由系统提供数据,测试t0 时刻的安全性精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 11 页第 8 页按 0 由用户输入,测试t0 时刻的安全性精选学习资料 - - - - - - - - - 名师归纳总结 -
17、 - - - - - -第 9 页,共 11 页第 9 页输入进程号 4, 申请资源 (4,8,9),如下图,申请失败显示出失败原因, 无法分配资源,假设需继续分配选择Y或 y 输入进程号 1,申请资源 1,0,2 ,调用安全性算法假设符合安全性,找出安全序列并打印出此时系统资源分配情况,显示分配成功! 假设需继续分配输入Y或 y,输入其他退出程序4.实验结果分析如上5.实验心得教师评价评定项目A B C D 评定项目A B C D 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 11 页第 10 页算法正确界面美观,布局合理程序结构合理操作熟练语法、语义正确解析完整实验结果正确文字流畅报告标准题解正确其他:评价教师签名:年月日精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 11 页