一、实验名称
多资源银行家算法
二、问题描述
当某一进程提出资源的使用要求后,使得系统中一些进程处于无休止的阻塞状态,在无外力的作用下,这些进程永远也不能继续前进。这种现象称为死锁。为了避免死锁的发生,需要对当前进程的请求进行判断,给出一种最优的资源分配方式,这里提出了一种得到最佳分配方案的方法——银行家算法。
三、实验原理
把系统比作一个银行家,占有有限资金。银行家不可能满足所以借款人(进程)的最大需求量总和,但可以满足一部分借款人的借款要求。待这些人的借款归还后,又可把这笔资金借给他人。这样,当一借款人提出借款要求时,银行家就要进行计算,以决定是否借给他,看他是否会造成银行家的资金被借光而使资金无法运转。
四、实验内容
- 实验代码
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct text
{
int num; //项目数量
int flag; //超载
int w[4]; //资源总数
char r[100][100]; //已获得资源
int p[4]; //已用资源数
int s[4]; //剩余资源数
char q[100][100]; //需要资源数
}t;
void print()
{
int i,j;
cout<<"已用资源"<<endl;
cout<<"磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
for(i = 0 ; i < 4 ; i++)
{
cout<<t.p[i]<<"\t";
}
cout<<endl;
cout<<"剩余资源"<<endl;
cout<<"磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
for(i = 0 ; i < 4 ; i++)
{
cout<<t.s[i]<<"\t";
}
cout<<endl;
cout<<"已获得资源"<<endl;
cout<<"进程 \t 磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
for(i = 0 ; i < t.num ; i++)
{
for(j = 0 ; j < 5 ; j++)
{
cout<<t.r[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl;
cout<<endl<<"需要资源"<<endl;
cout<<"进程 \t 磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
for(i = 0 ; i < t.num ; i++)
{
for(j = 0 ; j < 5 ; j++)
{
cout<<t.q[i][j]<<"\t";
}
cout<<endl;
}
}
void print1(int n) //正在进行的项目
{
cout<<t.r[n][0]<<"\t";
}
void print2() //打印剩余资源
{
int i,j;
cout<<"已用资源"<<endl;
cout<<"磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
for(i = 0 ; i < 4 ; i++)
{
cout<<t.p[i]<<"\t";
}
cout<<endl;
cout<<"剩余资源"<<endl;
cout<<"磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
for(i = 0 ; i < 4 ; i++)
{
cout<<t.s[i]<<"\t";
}
}
void input()
{
int i,j;
int p,s;
t.flag = 0;
cout<<"请设置项目数量:"<<endl;
cin>>t.num; //项目数量
cout<<"input progream R:"<<endl;
cout<<"进程 \t 磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
for(i = 0 ; i < t.num ; i++)
{
for(j = 0 ; j <= 4 ; j++)
{
cin>>t.r[i][j]; //设置项目
t.q[i][0] = t.r[i][0];
}
}
for(i = 0 ; i < 4 ; i++)
{
p=0; //p 已用资源
for(j = 0 ; j < t.num ; j++)
{
p = p + t.r[j][i+1] -48 ;
}
t.p[i] = p; //已用资源数
s=t.w[i]; //剩余资源数
t.s[i] = s - t.p[i];
}
cout<<"input progream Q:"<<endl; //输入需要资源
for(i = 0 ; i < t.num ; i++)
{
for(j = 0 ; j < 5 ; j++)
{
cin>>t.q[i][j];
}
}
print();
}
void work()
{
int i,j,l;
int r,s,q;
int progream;
char q1,r1;
for(l=0;;l++)
{
for(i = 0; i < t.num; i++)
{
for(j = 0 ; j < 4 ; j++) //可用资源对比
{
q=t.q[i][j+1]-48; //q需要资源数
s=t.s[j];
if(s >= q)
{
t.flag++;
}
}
if(t.flag == 4) //项目可通过,标记项目位置
{
progream = i;
break;
}
t.flag=0;
}
if(t.flag != 4) //超载
{
cout<<endl<<"死锁"<<endl;
break;
}
if(t.flag == 4) //运行后释放资源
{
print1(progream);
for(i = 0; i < 4; i++)
{
r=t.r[progream][i+1]-48;
t.p[i] = t.p[i] - r;
s=t.w[i];
t.s[i] = s - t.p[i];
t.r[progream][i+1] = 0;
t.q[progream][i+1] = 0;
}
}
for(i = 1; i < t.num-progream; i++) //删除项目
{
for(j = 0 ; j < 4 ; j++)
{
q = t.q[progream+i][j+1];
r = t.r[progream+i][j+1];
t.r[progream+i-1][j+1] = r;
t.q[progream+i-1][j+1] = q;
}
}
for(i = 1; i < t.num-progream; i++)
{
for(j = 0 ; j < 4 ; j++)
{
q1 = t.q[progream+i][0];
r1 = t.r[progream+i][0];
t.r[progream+i-1][0] = r1;
t.q[progream+i-1][0] = q1;
}
}
t.flag=0;
t.num--;
if(t.num==0)
{
break;
}
}
}
int main()
{
t.w[0] = 6; //初始化
t.w[1] = 3;
t.w[2] = 4;
t.w[3] = 2;
t.p[0]=0;t.p[1]=0;t.p[2]=0;t.p[3]=0;
input();
cout<<"安全序列:"<<endl;
work();
}
- 运行结果