1、操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。银行家算法是一种最具代表性的避免死锁的算法。要解释银行家算法,必须先解释操作系统的安全状态和不安全状态。安全状态:如果存在一个由系统中所有进程构成的安全序列P1,Pn,
2、则系统处于安全状态。安全状态一定没有死锁发生。不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。安全序列:一个进程序列P1,Pn是安全的,如果对于每个进程Pi(0in),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj(ji)当前占有资源量之和。先对系统从源文件中读取的数据进行安全性判断,然后对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,不大于系统可利用的资源。若请求合法,则进行试分配,最后对试分配状态调用安全性算法进行安全性检查。若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。五、详细设计1、初始化由用户输入数据,分别对可利用资源向量矩阵AVAILABL
3、E、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。2、银行家算法在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。设进程cusneed提出请求REQUEST i,则银行家算法按如下规则进行判断。(1)如果REQUEST cusneed i= NEEDcusneedi,则转(2);否则,出错。(2)如果REQUEST cusneed i= AVAILABLEcusneedi,则转
4、(3);(3)系统试探分配资源,修改相关数据: AVAILABLEi-=REQUESTcusneedi; ALLOCATIONcusneedi+=REQUESTcusneedi; NEEDcusneedi-=REQUESTcusneedi;(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。(5)对于某一进程i,若对所有的j,有NEEDij=0,则表此进程资源分配完毕,应将占用资源释放。3、安全性检查算法(1)设置两个工作向量Work=AVAILABLE;FINISH(2)从进程集合中找到一个满足下述条件的进程,FINISH=false;NEED=Wor
5、k;如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的进程Finish= true,则表示安全;否则系统不安全。4、流程图1、整体流程图2、判断系统的安全性Safe()六、运行结果1、系统不安全的输入(1)、本程序按下图建立.txt源文件,作为程序的初始化输入(2)执行程序,读取源文件,并判断T0时刻所得结果:2.系统安全的输入(3)T0时刻的安全序列(4)不合理的分配输入P1进程Request(2 2 1)与输入P2进程Request(2 2 2)所得请求结果:(5
6、)合理的分配1.存在安全序列:调用Request()函数,测试该函数的可行性,如输入P1进程Request(0 1 2),所得结果:2、不存在安全序列输入P0进程Request(0 2 0),所得结果:七、心得体会本次实验让我对银行家算法和死锁都有了一定的理解。知道了在资源一定的条件下为了让多个进程都能使用资源完成任务,避免死锁的产生可以从一开始就对系统进行安全性检查来判断是否将资源分配给正在请求的进程。但是银行家算法会加大系统的开销。此外,存在以下疑问,在系统不分配进程所请求的资源的时候,是否会将此资源等待,直到拥有足够的资源的时候再来运行?进程会请求资源是指在执行的过程中只有拥有了足够数量
7、的资源才可以执行下去,但是资源有限,进程数又有足够多,我们期望所有进程都可以在最短的时间内执行完。也许可以这样理解。操作系统的基本特征就是并发和共享,系统允许多个进程并发执行,并且共享系统的软、硬件资源。为了最大限度的利用计算机资源,操作系统应采用动态分配的策略,但是这样就容易因资源不足、分配不当而引起“死锁”。本次课程设计就是用银行家算法来避免“死锁”。该算法就是一个资源分配过程,使分配序列不会产生死锁。此算法的中心思想就是,每次分配后总存在着一个进程,如果让它单独的运行下去,必然可以获得它所需要的全部资源,而它结束后可以归还这类资源以满足其他申请者的需要。另外,我知道了在程序进行编写之前,
8、先对程序的要求进行分析,弄清楚程序所需要的功能,然后将每个功能分成一个功能模块即调用函数来实现,无需过多的画蛇添足。8、参考资料【1】计算机操作系统(第三版) 汤小丹、梁红兵、汤子瀛、哲凤屏等 西安电子科技大学出版社 2007-05【2】 C+ Primer中文版(第4版) (美)Stanley B. Lippman等 著 李师贤 等 译. 人民邮电出版社, 2006-03-01【3】 C+ Primer习题解答(第4版) 蒋爱军,李师贤,梅晓勇著 人民邮电出版社 2007-02-01【4】 现代操作系统(原书第3版)塔嫩鲍姆 (Tanenbaum.A.S),陈向群,马洪兵著 机械工业出版社
9、2009-07-01【5】计算机操作系统教程 张尧学,史美林,张高 清华大学出版社 2006-10-01【6】 数据结构(STL框架) 王晓东著 清华大学出版社 2009-09-01【7】计算机操作系统(第三版) 汤子瀛等 西安电子科技大学出版社 2007-05【8】操作系统实验教程基于windows和Linux 秦明等 清华大学出版社 2010-09-01附: 源程序#includestdio.hstdlib.h#define M 10 /最大进程数#define N 3 /系统所拥有的资源类型int MaxMN;/进程对各类资源的最大需求int AllocationMN;/系统已为进程所分
10、配的各类资源数int NeedMN;/运行进程尚需的各类资源数int WorkN;/运行进程时系统所拥有的资源数bool finishM;/表示系统是否有足够的资源分配给进程int AvailableN;/系统可利用的资源数int n_pro=0;/进程的数目int flagM=-1;/用于标记安全序列int Readfile();/从磁盘读文件int Safe1(int flag,int n,int t);/输出所有安全状态void show();int Safe();/判断系统是否处于安全状态int Request();/请求资源分配函数void show() printf( t%-9st
11、%-9st%-9sn,MAXAllocationNeed); tA B CtA B CtA B Cn for(int i=0;in_pro;i+) printf(p%dt%d%4d%4dt,i,Maxi0,Maxi1,Maxi2);%d%4d%4dt,Allocationi0,Allocationi1,Allocationi2);%d%4d%4dn,Needi0,Needi1,Needi2); 系统可利用资源数:n tAtBtCnt%dt%dt%dn,Available0,Available1,Available2);int Readfile()/从磁盘读文件 int i=0,j=0;/i表进
12、程,j表资源 ifstream inFile; /文件 in(test.txt /打开输入文件,按照规定的格式提取线程等信息 for(j=0;j Availablej; in();系统最大资源数: inFile n_pro;当前进程的数目:%dn,n_pro); while(i Maxij; Allocationij; Needij = Maxij - Allocationij; Availablej -= Allocationij; i+; Workj = Availablej;显示初始化资源分配表: show(); return 0;int Safe()/判断系统是否是安全的 int te
13、mpn=n_pro; int i=0,j=0,t=0; for(i=0; finishi=false; while(tempn) for(i=0; if(!finishi) int tp=0;/注释部分用于调试程序/ printf(%dt%d%4d%4dt,i,Work0,Work1,Work2); tp=(Work0=Needi0) & (Work1=Needi1) & (Work2=Needi2); if(tp) finishi=true; for(int j=0; Workj += Allocationij; flagt=i;/ printf(%dtflag%d=%d,i,t,flagt
14、);system(pauseprintf(t+; break; tempn-; if(finishi = false) printf(系统不安全,不存在安全序列nreturn -1;系统是安全的,存在安全序列: Safe1(flag,n_pro,0);int Safe1(int flag,int n,int t) int p,i,j,k; /p为标记 int tempN;/临时数组n; int tp=0; tp=(Work0 if(tp) for(j=0; Workj += Allocationij; flagt=i; p=1; else continue; for(int j=0;t; if
15、(flagt=flagj) for(j=0; Workj -= Allocationij; p=0;break; if(p=1) if(t=n-1) for(k=0;kk+) printf(p%-5d,flagk); printf( else for(k=0; tempk = Workk - Allocationik; Safe1(flag,n,t+1); Workk =tempk; int Request()/进程提出请求后,判断系统能否将资源分配给它 int rq;/下标 int RequestN;请输入需要请求的进程号(04): scanf(%d,&rq);请输入需要请求的资源数(A B
16、 C):%d%d%dRequest0,&Request1,&Request2); if(Needrq0 Request0 | Needrq1 Request1 | Needrq2 Request2)进程p%d申请的资源大于它所需要的资源n分配不合理,不予分配nn,rq); return -1; if(Available0 Request0 | Available1 Request1 | Available2 Request2) 进程p%d申请的资源大于系统现在可利用的资源n分配不合理,不予分配nn for(int j=0; Availablej -= Requestj; Allocationr
17、qj += Requestj; Needrqj -= Requestj;假定系统可为p%d分配,分配后的资源分配表: for(int k=0; Workk = Availablek; if(Safe() 系统进入不安全状态,不予分配nn Availablej += Requestj; Allocationrqj -= Requestj; Needrqj += Requestj;此刻的资源分配表为: show(); else 系统是安全的,以上序列是此刻所存在的安全序列!系统已分配p%d所申请的资源!nnint main() system(color 0Bn 银行家算法 n 学号: n 班级: n 姓名:n从磁盘读取源文件n Readfile();T0时刻的安全性: if(Safe() return -1; while(1) Request();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1