//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;elsecout<<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;}elsecout<<" 此状态存在死锁,可以采取结束进程来结束死锁状态。"<<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 7typedef 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 &);