源
work[0]+=allocation[n][0]; //进程执行后释放出分配给它的资
}
work[1]+=allocation[n][1]; work[2]+=allocation[n][2];
finish[n]=\变为1以示该进程完成本次分 k++;
for (m=0;m<5;m++) //判断是否所有进程分配资源完成 {
if (strcmp(finish[m],\{ } else
if (m==4) //此处m=4表示所有数组finish的所有元素都为ture {
printf(\找到安全序列P%d->P%d->P%d->P%d->P%d,系统是安printf(\找不到安全序列,系统处于不安全状态。\\n\return 0; //找不到安全序列,结束check函数,返回0
全的\\n\ }
void main() //主程序开始 {
start();
for (;j==0;) //确认输入数据的正确性,若输入错误,重新输入 { } return 1;
}
j=1;
outputsafe(); //输出安全序列的资源分配表
}
input();
printf(\以下为进程资源情况,请确认其是否正确:\\n\output();
printf(\数据是否无误:\\n正确:输入1\\n错误:输入0\\n请输入:\scanf(\
printf(\数据确认无误,算法继续。\\n\
if (check()==0) //若check函数返回值为0,表示输入的初始数据找不到
安全序列,无法进行下一步,程序结束
{ }
for(;j==1;) //当有多个进程请求资源时,循环开始 {
printf(\请输入请求资源的进程i(0、1、2、3、4):\ //输入发出请求向end(); exit(0);
量的进程及请求向量
scanf(\
printf(\请输入进程P%d的请求向量Request%d:\for(n=0;n<3;n++) for
scanf(\
(;request[i][0]>need[i][0]
||
request[i][1]>need[i][1]
||
request[i][2]>need[i][2];) //若请求向量大于需求资源,则认为是输入错误,要求重新输入
{
printf(\数据输入有误,请重试!\\n请输入进程P%d的请求向量
Request%d:\
}
for(n=0;n<3;n++)
scanf(\
if(request[i][0]<=available[0] && request[i][1]<=available[1] &&
request[i][2]<=available[2]) //判断系统是否有足够资源提供分配
{ } else
printf(\系统没有足够的资源,进程P%d需要等待。\\n\printf(\系统正在为进程P%d分配资源……\\n\change(); //分配资源 j=0;
if (j==0) //j=0表示系统有足够资源分配的情况 {
printf(\当前系统资源情况如下:\\n\ //输出分配资源后的系统资源
分配情况
}
printf(\是否还有进程请求资源?\\n是:输入1\\n否:输入0\\n请输入:\scanf(\ //若还有进程请求资源,j=1,之前的for循环条件
output();
if(check()==0) //若找不到安全系列,则之前的资源分配无效 { }
printf(\本次资源分配作废,恢复原来的资源分配状态。\\n\for (m=0;m<3;m++) //恢复分配资源前的系统资源状态 { }
available[m]+=request[i][m]; allocation[i][m]-=request[i][m]; need[i][m]+=request[i][m];
output(); //输出系统资源状态
满足
}
end();
} 结果分析
三、 实验总结及心得体会
多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地进
程,不至发生死锁。银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。