一.实验名称:死锁的检测与解除
二.实验目的:观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。 三.实验内容: 死锁的检测算法:
1.找出不再申请资源的进程,将它们所占的资源与系统中还剩余的资源加在一起作为“可分配的资源”,同时对这些进程置标志;
2.检测所有无标志的进程,找出一个所需资源量不超过“可分配的资源\"量的进程,将其所占用的资源添加到“可分配的资源”中,同时为该进程置标志;重复2)直到所有进程均有标志或无标志的进程的所需资源量均超过“可分配的资源”量;
3.若进程均有标志,说明系统当前不存在死锁;若存在无标志的进程,则表示系统当前已有死锁形成,这些无标志的进程就是一组处于死锁状态的进程。 死锁的解除:
当死锁检测程序检测到有死锁存在时,一般采用两种方式来解除死锁:
1.终止进程:终止一个或多个涉及死锁的进程的执行,收回它们所占的资源再分配。 2.抢夺资源:从涉及死锁的一个或几个进程中抢夺资源,把夺来的资源再分配给卷入死锁的其他进程,直到死锁解除. 四.实验代码:#include 〈iostream〉 { int i,j; using namespace std; cout〈〈\"请输入进程的数目:\"; #define mp 50 //最大进程数 cin〉〉m; #define mr 100 /最大资源数 cout〈〈\"请输入资源的种类:\"; int keyong[mr]; //可用资源数组 cin>>n; int MAX[mp][mr]; //最大需求矩阵 cout〈<”请输入每个进程最多所需的各资源int fenpei[mp][mr]; //分配矩阵 数,按照\"< } cout<〈\"请输入各个资源现有的数目:”〈 { cin>〉keyong[i]; } cout<〈\"剩余需求矩阵:”< for(i=0;i for(i=0;i〈m;i++) { if(FINISH[i]==true) { continue; } else { for(j=0;j〈n;j++) { if(need[i][j]〉Work[j]) { break; } } if(j==n) { FINISH[i]=true; for(k=0;k〈n;k++) { Work[k]+=fenpei[i][k]; //进程i执行完后回收资源} p[l++]=i; i=—1; } else } } if(l==m) { cout<〈”系统是安全的”〈〈endl; cout〈<”安全序列:”〈〈endl; for(i=0;i cout〈〈\"-—〉\"; } } cout<〈\"\"< while(i〈m&&FINISH[i]==false) //寻找没执行的 { for(j=0;j〈n;j++) { keyong[j]+=fenpei[i][j]; //回收 fenpei[i][j]=0; } if(Safe()) cout<〈”死锁已解除”< Safe(); } 五.实验结果 输入 进程 1 2 3 4 5 已拥有资源数 (0。0。1.2) (2。0.0.0) (0.0.3.4) (0.3.3.2) 总需求资源数 (0.0.1。2。) (2。7。5。0) (6。6.5。6) (0。6.5.2) } (2。3。5。4) (4。3。5。6) 其中系统可用资源数 为 2 1 0 0 给进程3 分配资源数 0 1 0 0 六.实验心得: 加深理解了有关资源申请分配、检测以及避免死锁等概念,了解死锁和避免死锁的具体实施方法。死锁的解除实质上就是如何让释放资源的进程能够继续运行.为了解除死锁就要剥夺资源,此时,需要考虑一下几个问题 : 选择一个牺牲进程,即要剥夺哪个进程的哪些资源?剥夺的进程如何再次运行?.怎样保证不发生\"饿死”现象 ?“最小代价”,即最经济合算的算法,使得进程回退带来的开销最小。但是,”最小开销”是很不精确的,进程重新运行的开销包括很多因素: 进程的优先级、该进程使用的资源种类和数量?为完成任务,进程还需要多少资源?有多少进程要被撤销、该进程被重新启动运行的次数。。只有综合考虑各个进程之间的关系,跟资源的关系,才能搞好的解除死锁。避免系统出错。 3 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务