操作系统课程设计实验报告用C实现银行家算法文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]操作系统实验报告(2)学院:计算机科学与技术学院班级:计091学号:姓名:时间:2011/12/30目录1.实验名称 (3)2.实验目的 (3)3.实验内容 (3)4.实验要求 (3)5.实验原理 (3)6.实验环境 (4)7.实验设计 (4)数据结构设计 (4)算法设计 (6)功能模块设计 (7)8.实验运行结果 (8)9.实验心得 (9)附录:源代码(部分) (9)一、实验名称:用C++实现银行家算法二、实验目的:通过自己编程来实现银行家算法,进一步理解银行家算法的概念及含义,提高对银行家算法的认识,同时提高自己的动手实践能力。
各种死锁防止方法能够阻止发生死锁,但必然会降低系统的并发性并导致低效的资源利用率。
死锁避免却与此相反,通过合适的资源分配算法确保不会出现进程循环等待链,从而避免死锁。
本实验旨在了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生。
三、实验内容:利用C++,实现银行家算法四、实验要求:1.完成银行家算法的设计2.设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。
五、实验原理:系统中的所有进程放入进程集合,在安全状态下系统收到进程的资源请求后,先把资源试探性的分配给它。
之后,系统将剩下的可用资源和进程集合中的其他进程还需要的资源数作比较,找出剩余资源能够满足的最大需求量的进程,从而保证进程运行完毕并归还全部资源。
这时,把这个进程从进程集合中删除,归还其所占用的所有资源,系统的剩余资源则更多,反复执行上述步骤。
最后,检查进程集合,若为空则表明本次申请可行,系统处于安全状态,可以真正执行本次分配,否则,本次资源分配暂不实施,让申请资源的进程等待。
银行家算法是一种最有代表性的避免的算法。
在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
为实现银行家算法,系统必须设置若干。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全序列是指一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。
不安全状态不一定导致死锁。
我们可以把看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
六、实验环境:Win-7系统Visual C++七、实验设计:1.数据结构设计定义结构体:struct Process0, 0, 0);}}};class DataInit法设计class FindSafeListdb->available); db->p[db->ruler[i]].currentAvail)) db->p[db->ruler[i-1]].currentAvail);db->p[db->ruler[i-1]].allocation);db->p[db->ruler[i]].currentAvail)){ return false; }db->sum)){ return false; }}return true; laim_allocation)){ return 1; }Source s(db->p[i].allocation); db->ask);db->p[i].(db->ask);if(!exsitSafeList(db)) db->ask);db->p[i].(db->ask);return 2;}db->(0,0,0); 能模块设计class Data0, 0, 0);}}};class DataInitr1,r2,r3);cout<<'p'<<i<<" max allocation(claim[R1,R2,R3]): ";r1,r2,r3);r1=db->p[i].>p[i].;p[i].;r3=db->p[i].>p[i].;db->p[i].(r1, r2, r3);}}};class Displaylaim);cout<<"\t\t";displaySource(p[i].allocation);cout<<endl;}cout<<endl;}void displaySafeList(Data *db) urrentAvail);cout<<" ";displaySource(db->p[db->ruler[i]].claim);cout<<" ";displaySource(db->p[db->ruler[i]].allocation);cout<<" ";displaySource(db->p[db->ruler[i]].claim_allocation);cout<<" true";cout<<endl;}}void displayAskResult(Data *db,int n) db->available); db->p[db->ruler[i]].currentAvail)) db->p[db->ruler[i-1]].currentAvail);db->p[db->ruler[i-1]].allocation);db->p[db->ruler[i]].currentAvail)){ return false; }db->sum)){ return false; }}return true; laim_allocation)){ return 1; }Source s(db->p[i].allocation); db->ask);db->p[i].(db->ask);if(!exsitSafeList(db)) db->ask);db->p[i].(db->ask);return 2;}db->(0,0,0); //找到安全序列,将请求资源置零,返回3return 3;}};void main(){Data *db;db=new Data;if(!db){ cout<<"error!no enough memory space!"; return; }DataInit dataInit;(db); //设置进程个数(db); //设置系统总资源量(db); //设置当前系统可获得资源量(db); //设置t0时刻进程基本状态Display display;FindSafeList findSafeList;int r1=0,r2=0,r3=0;int c;db->(r1,r2,r3); //设置请求资源为0,即无请求c=(db,0); //寻找安全序列,返回结果if(c!=3){ cout<<"t0时刻的进程组不存在安全序列!\n"; return; }int choice=1;int pi;while(choice){cout<<"\n 选择操作:\n 1 查看进程情况\n 2 请求分配资源\n 0 退出\n ";cin>>choice;switch(choice){case 1:{cout<<"当前资源量available[R1,R2,R3]:\n ";(db->available);cout<<endl;cout<<"\n当前进程资源分配情况p[i][R1,R2,R3]: \n";cout<<" 进程\tclaim\t\tallocation\n";(db->p,db->pLength);break;}case 2:{cout<<"输入请求资源进程序号:";cin>>pi;cout<<"输入请求资源(R1,R2,R3): (0,0,0)表示当前进程组无请求 \n";cin>>r1>>r2>>r3;db->(r1,r2,r3);c=(db,pi);(db,c);cout<<endl;break;}case 0:{ break; }default:{ cout<<"input error!try again!\n"; break; } }}}。