欢迎来到天天文库
浏览记录
ID:42685243
大小:49.99 KB
页数:13页
时间:2019-09-20
《银行家算法C语言实现-课程设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、银行家算法C语言实现-课程设计编程模拟实现生产者---消费者问题一、实验目的与实验项目介绍银行家算法是最有代表性的避免死锁的算法,由于该算法能用于银行系统现金贷款的发放而得名。其实现思想是:允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。实验的目的 1.加深对死锁概念的理解2.能够利用银行家算法,有效避免死锁的发生,或检测死锁的存在。二、实验项目方案设计 1.定义银行家算法中的
2、数据结构available[],allocation[][],need[][]等利用定义的全局变量来进行函数间值的传递2.此实验通过3个函数实现,a:主函数(main),b:安全检测函数(check),c:输出函数(print).3.主函数(main)的实现:输入已知条件,利用安全检测函数检测已知的进程分配情况是否为安全状况。如果为安全,则输入需请求资源的进程号和所需资源数,否则结束主函数。reqi为进程i的请求向量。进行银行家算法:(1):如果reqi[j]>need[i][j]则认为出错,输出请求的资源数超过它所需的最大数;否则执行(2);(2):如果reqi[j]>a
3、vailable[i][j]则输出尚无足够的资源;否则执行(3)。(3):系统试探着把资源分配给进程i,并修改下面数据结构中的数值:available[j]:=available[j]-reqi[j];allocation[i][j]:=allocation[i][j]+reqi[j];need[i][j]:=need[i][j]-reqi[j];并且保存修改前的数值。(4):系统执行安全性算法。如果不安全则还原(3)中保存的available[j],allocation[i][j],need[i][j]的值.最后输入是否要继续,如继续则转至前面的输入请求资源的进程号,否则
4、退出。4.安全检测函数(check):(1)设置两个向量work和finish:work:=available,表示系统可提供给进程继续运行所需的各类资源数目;finish表示系统是否有足够的资源分配给进程,使之完成。开始时先做finish[i]:=false;当有足够资源分配给进程时,再令finish[i]:=true。(2)从进程集合中找到一个能满足下述条件的进程:a: finish[i]=false;b:need[i][j]<=work[j];若找到,执行(3),否则,执行(4)。(3):当进程i获得资源后,可顺利执行,直到完成,并释放出分配给它的资源,故应执行:wo
5、rk[j]:=work[j]+allocation[i,j];finish[i]:=true;a[v++]=i; (记录安全序列)gotostep2;(4):如果所有进程的finish[i]=true都满足,则表示系统处于安全状态,输出安全序列;否则,系统处于不安全状态。5.输出函数(print):利用循环体输出各进程号,已分配的资源数数,仍需要的资源数,剩余的可用资源数。三、实验实施步骤 1.在TC上新建一个文件,并保存为bank1,在编辑界面中输入以下代码:#defineM50intallocation[M][M],need[M][M],available[M];
6、 //定义全局变量 intn,m,r;main(){voidcheck(); voidprint(); inti,j,p=0,q=0; intreq[M],allocation1[M][M],need1[M][M],available1[M]; printf("Pleaseinputthesumofprocesses:"); scanf("%d",&n); //输入进程总数 printf("Pleaseinputthesumofkinds:"); scanf("%d",&m);
7、 //输入资源种类总数 printf("Pleaseinputtheknowncondition:"); printf("Allocation"); for(i=0;i
此文档下载收益归作者所有