//zhu_jie_mian.cpp
#include<iostream.h>
#include"bank.h"
void zhu_jie_mian(list * &L,int &n)
{
cout<<" ++++++++++++++++++++进程资源调度管理+++++++++++++++++++++++"<<endl;
cout<<" + 1.显示当前进程与资源状态 +"<<endl;
cout<<" + 2.增加进程 +"<<endl;
cout<<" + 3.死锁检测 +"<<endl;
cout<<" + 4.申请资源 +"<<endl;
cout<<" + 5.撤销资源 +"<<endl;
cout<<" + 6.结束进程 +"<<endl;
cout<<" + 7.退出程序 +"<<endl;
cout<<" +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
int choice;
cin>>choice;
switch(choice)
{
case 1:xianshi(L,n);break;
case 2:zengjia(L,n);break;
case 3:jiance(L,n);break;
case 4:shenqing(L,n);break;
case 5:chexiao(L,n);break;
case 6:jieshu(L,n);break;
case 7:break;
}
}
//zengjia.cpp
#include<iostream.h>
#include<malloc.h>
#include"bank.h"
void zengjia(list * &L,int &n)
{
list *t,*s;
int choice;
s=L;
while(s->next!=NULL)
s=s->next;
t=(list *)malloc(sizeof(list));
cout<<"请输入此进程的号码:"<<endl;
cin>>t->haoma;
cout<<"请分别输入此进程申请的A、B、C资源数:"<<endl;
cin>>t->data.claim[0]>>t->data.claim[1]>>t->data.claim[2];
cout<<"请分别输入此进程已占有的A、B、C资源数:"<<endl;
cin>>t->data.allocation[0]>>t->data.allocation[1]>>t->data.allocation[2];
cout<<"请分别输入此进程仍需要的A、B、C资源是:"<<endl;
cin>>t->data.need[0]>>t->data.need[1]>>t->data.need[2];
t->state=0;
n++;
t->next=s->next;
s->next=t;
cout<<" ======================1.继续增加进程======================="<<endl;
cout<<" =======================2.返回主界面========================"<<endl;
cin>>choice;
switch(choice)
{
case 1:zengjia(L,n);break;
case 2:zhu_jie_mian(L,n);break;
}
}
//xianshi.cpp
#include<iostream.h>
#include"bank.h"
void xianshi(list * &L,int &n)
{
list *t;
int choice;
int A_temp=0,B_temp=0,C_temp=0;
t=L->next;
cout<<" Claim Allocation Need Available"<<endl;
cout<<" 号码 A B C A B C A B C A B C"<<endl;
while(t!=NULL)
{
cout<<" "<<t->haoma<<" "<<t->data.claim[0]<<" "<<t->data.claim[1]<<" "<<t->data.claim[2]<<" "<<t->data.allocation[0]<<" "<<t->data.allocation[1]<<" "<<t->data.allocation[2]<<" "<<t->data.need[0]<<" "<<t->data.need[1]<<" "<<t->data.need[2];
A_temp+=t->data.allocation[0];
B_temp+=t->data.allocation[1];
C_temp+=t->data.allocation[2];
if(t->next==NULL)
cout<<" "<<A_total-A_temp<<" "<<B_total-B_temp<<" "<<C_total-C_temp<<endl;
else
cout<<endl;
t=t->next;
}
cout<<" =======================1.返回主界面========================"<<endl;
cout<<" ========================2.结束程序========================="<<endl;
cin>>choice;
switch(choice)
{
case 1:zhu_jie_mian(L,n);break;
case 2:break;
}
}
//shenqing.cpp
#include"bank.h"
#include<iostream.h>
void shenqing(list * &L,int &n)
{
int choice,i,request[3],A_temp=0,B_temp=0,C_temp=0,available[3];
list *t;
t=L->next;
cout<<"请输入想要申请资源的进程号:"<<endl;
cin>>i;
while(t!=NULL)
{
A_temp+=t->data.allocation[0];
B_temp+=t->data.allocation[1];
C_temp+=t->data.allocation[2];
t=t->next;
}
available[0]=A_total-A_temp;
available[1]=B_total-B_temp;
available[2]=C_total-C_temp;
t=L->next;
while(t->haoma!=i)
t=t->next;
cout<<"请分别输入此进程申请A、B、C资源的资源数(提示:必须小于可用资源数和最大需求数,否则系统会重新输入!):"<<endl;
cin>>request[0]>>request[1]>>request[2];
while(request[0]>available[0]||request[1]>available[1]||request[2]>available[2]||request[0]>t->data.need[0]||request[1]>t->data.need[1]||request[2]>t->data.need[2])
{
cout<<"您输入的数据不符合要求,请重新输入:"<<endl;
cin>>request[0]>>request[1]>>request[2];
}
t=L->next;
while(t!=NULL)
{
if(t->haoma==i)
{
t->data.allocation[0]+=request[0];
t->data.allocation[1]+=request[1];
t->data.allocation[2]+=request[2];
t->data.need[0]-=request[0];
t->data.need[1]-=request[1];
t->data.need[2]-=request[2];
}
t=t->next;
}
cout<<" =======================1.返回主界面========================"<<endl;
cout<<" ========================2.检测死锁========================="<<endl;
cin>>choice;
switch(choice)
{
case 1:zhu_jie_mian(L,n);break;
case 2:jiance(L,n);break;
}
}
//jieshu.cpp
#include"bank.h"
#include<iostream.h>
#include<malloc.h>
void jieshu(list * &L,int &n)
{
int i,choice;
list *t,*s;
t=L;
s=t->next;
cout<<"请输入您想结束的进程的进程号:"<<endl;
cin>>i;
while(s!=NULL)
{
if(s->haoma==i)
{
t->next=s->next;
free(s);
s=t->next;
n--;
}
else
{
t=t->next;
s=s->next;
}
}
cout<<" ======================1.继续结束进程======================="<<endl;
cout<<" =======================2.返回主界面========================"<<endl;
cin>>choice;
switch(choice)
{
case 1:jieshu(L,n);break;
case 2:zhu_jie_mian(L,n);break;
}
}
//jiance.cpp
#include"bank.h"
#include<iostream.h>
void jiance(list * &L,int &n)
{
int i,A_temp=0,B_temp=0,C_temp=0,flag[100],j=0,available[3],choice;
list *t;
t=L->next;
while(t!=NULL)
{
A_temp+=t->data.allocation[0];
B_temp+=t->data.allocation[1];
C_temp+=t->data.allocation[2];
t->state=0;
t=t->next;
}
available[0]=A_total-A_temp;
available[1]=B_total-B_temp;
available[2]=C_total-C_temp;
for(i=0;i<n;i++)
{
for(t=L->next;t!=NULL;t=t->next)
{
if(t->state==1)
continue;
else if((t->data.need[0]<=available[0])&&(t->data.need[1]<=available[1])&&(t->data.need[2]<=available[2]))
{
available[0]+=t->data.allocation[0];
available[1]+=t->data.allocation[1];
available[2]+=t->data.allocation[2];
flag[j++]=t->haoma;
t->state=1;
}
}
}
if((available[0]==A_total)&&(available[1]==B_total)&&(available[2]==C_total))
{
cout<<" 此状态很安全,无死锁,安全序列为:";
for(i=0;i<n;i++)
{
cout<<flag[i]<<"->";
}
cout<<endl;
}
else
cout<<" 此状态存在死锁,可以采取结束进程来结束死锁状态。"<<endl;
cout<<" =======================1.返回主界面========================"<<endl;
cout<<" ========================2.结束程序========================="<<endl;
cin>>choice;
switch(choice)
{
case 1:zhu_jie_mian(L,n);break;
case 2:break;
}
}
//chexiao.cpp
#include"bank.h"
#include<iostream.h>
void chexiao(list * &L,int &n)
{
int choice,i,request[3];
list *t;
t=L->next;
cout<<"请输入想要撤销资源的进程号:"<<endl;
cin>>i;
cout<<"请分别输入此进程撤销A、B、C资源的资源数(提示:必须小于已占有资源数,否则系统会重新输入!):"<<endl;
cin>>request[0]>>request[1]>>request[2];
while(t->haoma!=i)
t=t->next;
while(request[0]>t->data.allocation[0]||request[1]>t->data.allocation[1]||request[2]>t->data.allocation[2])
{
cout<<"您输入的数据不符合要求,请重新输入:"<<endl;
cin>>request[0]>>request[1]>>request[2];
}
t=L->next;
while(t!=NULL)
{
if(t->haoma==i)
{
t->data.allocation[0]-=request[0];
t->data.allocation[1]-=request[1];
t->data.allocation[2]-=request[2];
}
t=t->next;
}
cout<<" =======================1.返回主界面========================"<<endl;
cout<<" ========================2.检测死锁========================="<<endl;
cin>>choice;
switch(choice)
{
case 1:zhu_jie_mian(L,n);break;
case 2:jiance(L,n);break;
}
}
//bank.cpp
#include"bank.h"
#include<iostream.h>
#include<malloc.h>
int main()
{
list *L;
int n=0;
L=(list *)malloc(sizeof(list));
L->haoma=NULL;
L->next=NULL;
zhu_jie_mian(L,n);
return 0;
}
//bank.h
#define A_total 10
#define B_total 5
#define C_total 7
typedef struct
{
int claim[3];
int allocation[3];
int need[3];
}jincheng;
typedef struct node
{
int haoma;
jincheng data;
int state;
struct node *next;
}list;
void zhu_jie_mian(list *&,int &);
void xianshi(list * &,int &);
void zengjia(list * &,int &);
void jiance(list * &,int &);
void shenqing(list * &,int &);
void chexiao(list * &,int &);
void jieshu(list * &,int &);