实验二 死锁的避免_第1页
实验二 死锁的避免_第2页
实验二 死锁的避免_第3页
实验二 死锁的避免_第4页
实验二 死锁的避免_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验二 死锁的避免班级: 学号: 姓名: 1 实验内容模拟进程的资源分配算法2.实验目的为了了解系统的资源分配情况,假定系统的任何一种资源在任一时刻只能被一个进程使用。任何进程已经占用的资源只能由进程自己释放,而不能由其他进程抢占。当进程申请的资源不能满足时,必须等待。因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。编写模拟系统进行资源调度的程序,采用银行家算法,有效地避免死锁的产生。模拟进程的资源分配算法,了解死锁的产生和避免的方法。3.实验设计3.1 数据结构设计使用银行家算法过程中,当某个进程提出资源请求时,假定系统先分配给它,之后用系统安全性检查算法对

2、系统进行安全性检查。若系统安全,则假定分配变成真的分配,若系统不安全,假定分配作废,让进程等待。void judge()/利用银行家算法对申请资源对进行判定 char ch; int i=0,j=0;ch='y'cout<<"请输入需要资源的进程号(0-"<<N-1<<"):" cin>>i;/输入须申请的进程号 cout<<"请输入进程 "<<i<<" 申请的资源:"<<endl; for(j=0;j&

3、lt;M;j+) cout<<namej<<":" cin>>Requestj;/需要申请的资源 for (j=0;j<M;j+) if(Requestj>Needij|Requestj>Avaliablej)/判断申请是否大于需求和可分配的资源数目 cout<<"进程 "<<i<<"申请的资源不符合要求" cout<<" 无法分配!"<<endl; ch='n' break; if(c

4、h='y') resource_allocation(i);/根据进程需求量变换资源 show();/根据进程需求量显示变换后的资源 safe();/根据进程需求量进行银行家算法判断 在进行系统安全性检查时,第一步,把各进程的剩余资源量与系统的剩余资源量进行比较,检查系统剩余资源量是否可供分配,若是,进行第二步,若不是,进行第三步。第二步,将资源分配给当前进程,此时,该进程已获得所需的所有资源量,标记该进程为TRUE,并将它占有资源归还系统,继续进行第一步的操作。第三步,检查是否所有资源都标记为TRUE,若是,则系统安全,否则,系统不安全。int safe()/安全性算法 in

5、t i,j,k=0,m,apply,Finish100; int flag=0; still0=Avaliable0; still1=Avaliable1; still2=Avaliable2; for(i=0;i<N;i+) apply=0; for(j=0;j<M;j+) if(Finishi=False&&Needij<=stillj) apply+; if(apply=M) for(m=0;m<M;m+) stillm=stillm+Allocationim;/变分配数 Finishi=True; safequeuek=i; i=-1; k+;

6、flag+; for(i=0;i<N;i+) if(Finishi=False) cout<<"安全序列不存在!"<<endl;/不成功,系统不安全 return -1; cout<<"系统安全"<<endl;/如果安全,输出成功 cout<<"分配的序列:" for(i=0;i<N;i+)/输出运行进程数组 cout<<safequeuei; if(i<N-1) cout<<"->" cout<<

7、;endl; return 0; 3.2 求解方法 在安全状态下系统收到进程资源请求后,先把资源试探性地分配给它。现在,系统将剩余资源和其他进程还需要的资源数进行比较,找出剩余资源量能满足最大需求量的进程,从而保证进程运行完毕并把资源归还系统。这时,将该进程标记为TRUE,在安全序列中添加该进程,归还其占有的所有资源,反复执行以上步骤。最后,检查进程的标记,若都为TRUE,则系统安全,输出安全序列,若有进程标记为FALSE,则系统不安全。程序结构如下:4.实验结果1.系统资源设置界面2.进程数目、最大需求量、已分配资源数的设置界面3.主菜单界面4.输入1,进行资源的分配5. 输入2,进行资源的

8、增加6.输入3,进行资源的删除7.输入4,增加作业8.输入5,退出菜单5.实验体会 银行家算法能通过对资源的合理分配确保系统不会出现循环等待链,从而有效地避免死锁的问题。通过对某个实际问题的解决,生动形象地向我们展示了对于一系列作业的调度方法。银行家算法和其他死锁防止方法相比,提高了系统的并发性,并且一定程度上提高了系统的资源利用率。总的说来,对资源的合适分配可以防止和避免死锁的发生,但是一定程度上限制了进程对系统资源的充分共享附 源程序#include<iostream> #include<cstring> #include<cstdio> using n

9、amespace std;#define False 0 #define True 1 int M=100;/系统拥有的最大资源数int N=100;/系统运行的最多进程数char name100;/资源名int Max100100;/各进程所需各类资源的最大需求 int Avaliable100;/系统可用资源 int Allocation100100;/系统已分配资源 int Need100100;/还需要资源 int Request100;/请求资源向量 int safequeue100;/存放安全序列 int still100;/存放系统可提供资源 void show()/显示资源矩阵

10、 int i,j; cout<<"系统可用的资源Avaliable:"<<endl; for( i=0;i<M;i+) cout<<namei<<" " cout<<endl; for(j=0;j<M;j+) cout<<Avaliablej<<" "/输出系统中可用的资源数目 cout<<endl; cout<<" Max Allocation Need"<<endl; cout&l

11、t;<"进程名 " for(j=0;j<3;j+) for(i=0;i<M;i+) cout<<namei<<" " cout<<" " cout<<endl; for(i=0;i<N;i+) cout<<" "<<i<<" " for(j=0;j<M;j+) cout<<Maxij<<" " cout<<" &quo

12、t; for(j=0;j<M;j+) cout<<Allocationij<<" " cout<<" " for(j=0;j<M;j+) cout<<Needij<<" " cout<<endl; int resource_allocation(int i)/资源分配 for(int j=0;j<N;j+) Avaliablej=Avaliablej-Requestj; Allocationij=Allocationij+Requestj; Ne

13、edij=Needij-Requestj; return 1; int safe()/安全性检查 int i,j,k=0,m,apply,Finish100; int flag=0; still0=Avaliable0; still1=Avaliable1; still2=Avaliable2; for(i=0;i<N;i+) apply=0; for(j=0;j<M;j+) if(Finishi=False&&Needij<=stillj) apply+; if(apply=M) for(m=0;m<M;m+) stillm=stillm+Alloca

14、tionim;/变分配数 Finishi=True; safequeuek=i; i=-1; k+; flag+; for(i=0;i<N;i+) if(Finishi=False) cout<<"安全序列不存在!"<<endl;/不成功,系统不安全 return -1; cout<<"系统安全"<<endl;/如果安全,输出成功 cout<<"分配的序列:" for(i=0;i<N;i+)/输出运行进程数组 cout<<safequeuei; if(

15、i<N-1) cout<<"->" cout<<endl; return 0; void judge()/利用银行家算法对申请资源对进行判定 char ch; int i=0,j=0;ch='y'cout<<"请输入需要资源的进程号(0-"<<N-1<<"):" cin>>i;/输入须申请的进程号 cout<<"请输入进程 "<<i<<" 申请的资源:"<

16、<endl; for(j=0;j<M;j+) cout<<namej<<":" cin>>Requestj;/需要申请的资源 for (j=0;j<M;j+) if(Requestj>Needij|Requestj>Avaliablej)/判断申请是否大于需求和可分配的资源数目 cout<<"进程 "<<i<<"申请的资源不符合要求" cout<<" 无法分配!"<<endl; ch=

17、9;n' break; if(ch='y') resource_allocation(i);/根据进程需求量变换资源 show();/根据进程需求量显示变换后的资源 safe();/根据进程需求量进行银行家算法判断 void addresources()/增加资源int n,flag; cout<<"请输入需要添加资源种类的数量:" cin>>n; flag=M; M=M+n; for(int i=0;i<n;i+) cout<<"名称:" cin>>nameflag; cou

18、t<<"数量:" cin>>Avaliableflag+; show(); safe(); void delresources()/删除资源char ming; int i,flag=1; cout<<"请输入需要删除的资源名称:" do cin>>ming; for(i=0;i<M;i+) if(ming=namei) flag=0; break; if(i=M) cout<<"该资源不存在,请重新输入:" while(flag); for(int j=i;j<

19、M-1;j+) namej=namej+1; Avaliablej=Avaliablej+1; M=M-1; show(); safe(); void addprocess()/增加作业int flag=N; N=N+1; cout<<"请输入该作业的最打需求量Max"<<endl;for(int i=0;i<M;i+) cout<<namei<<":" cin>>Maxflagi; Needflagi=Maxflagi-Allocationflagi; show(); safe(); i

20、nt main()/主函数 int i,j,number,choice,m,n,flag; char ming; cout<<"输入系统可供资源种类的数量:" cin>>n; M=n; for(i=0;i<n;i+) cout<<"资源"<<i+1<<"的名称:" cin>>ming; namei=ming; cout<<"资源的数量:" cin>>number; Avaliablei=number; cout&l

21、t;<endl; cout<<"输入作业的数量:" cin>>m; N=m; cout<<"输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)Max:"<<endl; for(i=0;i<m;i+) for(j=0;j<n;j+) cin>>Maxij; do flag=0; cout<<"输入已经分配给各进程的资源量("<<m<<"*"<<n<<"矩阵)Allocation:"<<endl; for(i=0;i<m;i+) for(j=0;j<n;j+) cin>>Allocationij; if(Allocationij>Maxij) flag=1;Needij=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论