一、实验目的:
观察死锁发生的现象,了解死锁发生的原因。掌握如何判断死锁发生的方法。 二、实验分析:
死锁现象是操作系统各个进程竞争系统中有限的资源引起的。如果随机给进程分配资源,就可能发生死锁,因此就应有办法检测死锁的发生。本次实验中采用“银行家算法”判断死锁的发生。 三、实验设计:
本实验设计一个3个并发进程共享3种系统资源且每种系统资源有10个的系统。系统能显示各种进程的进展情况以及检察是否有错误和死锁现象产生。
四、算法说明:
“银行家算法”。按每个进程的申请数量给各个进程试探性分配资源,看能否到一个序列使各个进程都能正常运行结束。若能,则不会发生死锁;若不能,则会发生死锁。
五、程序使用说明:
1、本程序用于检测错误和是否会发生死锁。系统有3个进程竞争3种系统资源,每种资源有10个。
2、输入各个进程的最大需求资源数目数组max[3]和已经得到的资源数目数组alloc [3],系统计算出各个进程还应申请的资源数目数组need[3]。
3、若进程最大需求数大于系统资源数(10),则出错;若进程申请的资源数目大于其需要的最大资源数目,则出错。
起重机在线
银行家算法的具体实现程序:
#include <stdio.h>
#define R 10
#define P 10
int SafeCheck(int n,int m,int Max[P][R],int Allocation[P][R],int Available[R],int Need[P][R]){
int p,i,j, safeque[P],Work[R],Finish[P]={0},t=0,flag;
printf("当前的工作向量为:");
for(j=0;j<m;j++){
Work[j]=Available[j];printf("%d,",Work[j]);
}//设置Work向量
while(t<n){
//开始寻可分配的进程
for(i=0;i<n;i++){
if(Finish[i]==1) flag=0;//跳过已分配结束的进程
else flag=1;
if(flag){
p=i;
for(j=0;j<m;j++)
if(Need[p][j]>Work[j]) { p=-1; break; }
}
if(p==i)
{ printf("到一个可分配的进程P%d!\n",p); break;}
}//顺序循环查可分配资源的进程
if(p!=-1){
毛细管数safeque[t++]=p;//入栈保护
Finish[p]=1;//标志该进程结束
printf("当前的工作向量为:");
for(j=0;j<m;j++){
Work[j]+=Allocation[p][j];
printf("%d,",Work[j]);
}
p=-1; //清空当前进程号,以便下一次寻出新的进程
}//到可分配资源的进程,并重设空气加温器Work向量
else { printf("不到一个可分配的进程!终止检查!"); break; }
}
if(t==n){
printf("系统存在一个安全序列:");
for(t=0;t<n;t++)
printf("P%d->",safeque[t]);
printf("\n");
return 1;
}
else {printf("系统不安全!会产生死锁!\n"); return 0;}
}
void main(){
int Available[R],Max[P][R],Allocation[P][R],Need[P][R];
int i,n,m,j,p,Request[R];
int safe1,safe2;//设置第一次检查与第二次检查正确与否的观察变量
printf("输入进程总数:");
手动甘蔗榨汁机
scanf("%d",&n);
printf("输入资源类数:");
scanf("%d",&m);
printf("系统中R0--R%d类资源可利用数(空格隔开):",m-1);
for(i=0;i<m;i++){
scanf("%d",&Available[i]);
}
for(i=0;i<n;i++){
printf("P%d进程的每类资源的分配情况如下:\n",i);
printf("\tR0--R%d类资源最大数(空格隔开):",m-1);
for(j=0;j<m;j++){
scanf("%d",&Max[i][j]);
}
printf("\tR0--R%d类资源已分配(空格隔开):",m-1);
for(j=0;j<m;j++){
scanf("%d",&Allocation[i][j]);
Need[i][j]=Max[i][j]-Allocation[i][j];
}
张力计算
printf("\tR0--R%d类资源需求数(空格隔开):",m-1);
for(j=0;j<m;j++){
printf("%d ",Need[i][j]);
}
printf("\n");
}//初始化进程的资源分配表
printf("——————-第一次安全性检查——————\n");
safe1=SafeCheck(n,m,Max,Allocation,Available,Need);
if(safe1){
printf("输入请求请求进程P的进程号:");
scanf("%d",&p);
printf("输入请求的R0--R%d各类资源数(空格隔开):",m-1);
for(j=0;j<m;j++){
scanf("%d",&Request[j]);
if(Request[j]>Need[p][j]){
printf("所请求的该资源数大于该进程所需求的最大值!终止请求!");
safe1=0;break;
}
if(Request[j]>Available[j]){
printf("辊道窑所请求的该资源数大于系统中所拥有的最大值!终止请求!");
safe1=0;break;
}
}
}//第一次安全检查系统安全后判断请求向量的正确性