实验题目:用银行家算法和随机算法实现资源分配
实验原理:
银行家算法的分配资源是:当某个进程提出资源申请时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统剩余资源量是否由于进程的分配而导致系统死锁。若能,则让进程等待,否则,让进程的假分配变为真分配。
随机分配算法的分配原则:当进程申请资源时,如果进程现有资源数能满足进程的当前申请量,就把资源分配给进程,否则,让其等待。这样,随机算法可能引起死锁。
银行家代码:
#include<stdio.h>
//定义一个结构体
struct PCB{
char name[10];
int Max[3];
int Allocation[3];
int Need[3];
int label;
int finish;
int work[3];
int wAllocation[3];
};
int ss=1;
//判断进程是否满足系统需求
void Ready(PCB *p,int x,int *Available){
if(Available[0]-p[x].Need[0]>=0&&Available[1]-p[x].Need[1]>=0&&Available[2]-p[x].Need[2]>=0)
p[x].label=0;
else p[x].label=1;
}
//进程完成后资源释放
void add(PCB *p,int x,int *Available){
for(int i=0;i<3;i++){
p[x].work[i]=Available[i];
Available[i]+=p[x].Allocation[i];
p[x].wAllocation[i]=Available[i];
p[x].finish=ss++;
}
}
//对所有进程进行判断和资源处理
void start(PCB *p,int *Available){
for(int i=0;i<5;i++){
Ready(p,i,Available);
if(p[i].label==0&&p[i].finish==0)
add(p,i,Available);
}
}
//对进程按照结束时间进行排序
void sort(PCB *p){
PCB temp;
for(int i=0;i<4;i++)
for(int j=i;j<5;j++){
if(p[i].finish>p[j].finish){
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
//对结果进行输出,若无死锁,按照资源先后顺序输出
void print(PCB *p){
int temp=0;
for(int i=0;i<5;i++)
if(p[i].finish==0)
temp=1;
if(temp==0){
sort(p);
printf("\n安全序列为:\n");
for(int i=0;i<5;i++)
printf("%3s",p[i].name);
printf("\n");
printf("\n安全序列矩阵为:\n");
printf(" 进程 work Need Allocation Work+Allocation\n");
for(int i=0;i<5;i++){
printf("%4s%4d%4d%4d%6d%4d%4d%6d%4d%4d%6d%4d%4d\n",p[i].name,p[i].work[0],p[i].work[1],p[i].work[2],\
p[i].Need[0],p[i].Need[1],p[i].Need[2],p[i].Allocation[0],p[i].Allocation[1],p[i].Allocation[2],p[i].wAllocation[0],p[i].wAllocation[1],p[i].wAllocation[2]);
}
}
else if(temp==1)
printf("出现死锁!\n");
}
//将所有进程和系统进行比较
void Fin(PCB *p,int *Available){
int k=0;
//for(int k=0;k<5;k++){
while(k<5){
for(int i=0;i<5;i++)
if(p[i].finish==0){
start(p,Available);
break;
}
k++;
}
print(p);
}
//输入资源初始状态
void input(PCB *p,int *Available){
printf("进程名 MAX Allocation Need\n");
FILE *r=fopen("2-1.txt","r");
for(int i=0;i<5;i++){
fscanf(r,"%4s%3d%3d%3d%3d%3d%3d%3d%3d%3d\n",p[i].name,&p[i].Max[0],&p[i].Max[1],&p[i].Max[2],\
&p[i].Allocation[0],&p[i].Allocation[1],&p[i].Allocation[2],&p[i].Need[0],&p[i].Need[1],&p[i].Need[2]);
printf("%4s%3d%3d%3d%6d%3d%3d%6d%3d%3d\n",p[i].name,p[i].Max[0],p[i].Max[1],p[i].Max[2],\
p[i].Allocation[0],p[i].Allocation[1],p[i].Allocation[2],p[i].Need[0],p[i].Need[1],p[i].Need[2]);
}
fclose(r);
for(int i=0;i<5;i++){
p[i].label=0;
p[i].finish=0;
}
printf("\nAvailable:");
for(int i=0;i<3;i++)
printf("%3d",Available[i]);
printf("\n");
}
//发出请求信号的初始化
void Request(PCB *q,int *nAvailable){
int pp;
int request[3];
printf("输出需要请求的资源:\n");
scanf("%d",&pp);
printf("输入request:\n");
for(int i=0;i<3;i++)
scanf("%d",&request[i]);
if(q[pp].Need[0]>=request[0]&&q[pp].Need[1]>=request[1]&&q[pp].Need[2]>=request[2]){
for(int i=0;i<3;i++){
nAvailable[i]=nAvailable[i]-request[i];
q[pp].Allocation[i]=q[pp].Allocation[i]+request[i];
q[pp].Need[i]=q[pp].Need[i]-request[i];
}
Fin(q,nAvailable);
}
else printf("ERROR!");
}
//主函数
int main(){
PCB p[5];
PCB q[5];
int Available[3]={3,3,2};
int nAvailable[3];
input(p,Available);
for(int i=0;i<5;i++)
q[i]=p[i];
for(int i=0;i<3;i++)
nAvailable[i]=Available[i];
Fin(p,Available);
Request(q,nAvailable);
}
随机算法代码:
#include<stdio.h>
//定义一个结构体
struct PCB{
char name[10];
int Max[3];
int Allocation[3];
int Need[3];
int label;
int finish;
int work[3];
int wAllocation[3];
};
int ss=1;
//判断进程是否满足系统需求
void Ready(PCB *p,int x,int *Available){
if(Available[0]-p[x].Need[0]>=0&&Available[1]-p[x].Need[1]>=0&&Available[2]-p[x].Need[2]>=0)
p[x].label=0;
else p[x].label=1;
}
//进程完成后资源释放
void add(PCB *p,int x,int *Available){
for(int i=0;i<3;i++){
p[x].work[i]=Available[i];
Available[i]+=p[x].Allocation[i];
p[x].wAllocation[i]=Available[i];
p[x].finish=ss++;
}
}
//对所有进程进行判断和资源处理
void start(PCB *p,int *Available){
for(int i=0;i<5;i++){
Ready(p,i,Available);
if(p[i].label==0&&p[i].finish==0)
add(p,i,Available);
}
}
//对进程按照结束时间进行排序
void sort(PCB *p){
PCB temp;
for(int i=0;i<4;i++)
for(int j=i;j<5;j++){
if(p[i].finish>p[j].finish){
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
//对结果进行输出,若无死锁,按照资源先后顺序输出
void print(PCB *p){
int temp=0;
for(int i=0;i<5;i++)
if(p[i].finish==0)
temp=1;
if(temp==0){
sort(p);
printf("\n安全序列为:\n");
for(int i=0;i<5;i++)
printf("%3s",p[i].name);
printf("\n");
}
else if(temp==1){
printf("出现死锁!\n");
printf("已完成进程为:\n");
for(int i=0;i<5;i++)
if(p[i].finish!=0)
printf("%3s",p[i].name);
}
}
//将所有进程和系统进行比较
void Fin(PCB *p,int *Available){
int k=0;
//for(int k=0;k<5;k++){
while(k<5){
for(int i=0;i<5;i++)
if(p[i].finish==0){
start(p,Available);
break;
}
k++;
}
print(p);
}
//输入资源初始状态
void input(PCB *p,int *Available){
printf("进程名 MAX Allocation Need\n");
FILE *r=fopen("2-1.txt","r");
for(int i=0;i<5;i++){
fscanf(r,"%4s%3d%3d%3d%3d%3d%3d%3d%3d%3d\n",p[i].name,&p[i].Max[0],&p[i].Max[1],&p[i].Max[2],\
&p[i].Allocation[0],&p[i].Allocation[1],&p[i].Allocation[2],&p[i].Need[0],&p[i].Need[1],&p[i].Need[2]);
printf("%4s%3d%3d%3d%6d%3d%3d%6d%3d%3d\n",p[i].name,p[i].Max[0],p[i].Max[1],p[i].Max[2],\
p[i].Allocation[0],p[i].Allocation[1],p[i].Allocation[2],p[i].Need[0],p[i].Need[1],p[i].Need[2]);
}
fclose(r);
for(int i=0;i<5;i++){
p[i].label=0;
p[i].finish=0;
}
printf("\nAvailable:");
for(int i=0;i<3;i++)
printf("%3d",Available[i]);
printf("\n");
}
//主函数
int main(){
PCB p[5];
int Available[3]={0,1,1};
input(p,Available);
Fin(p,Available);
}
代码当中初始化内容中读入文件内容如下:
实验结果如下: