#include "fstream.h"
//#include"iostream"
#include"stdio.h"
//#include"string.h"
#include"windows.h"
#include"iomanip.h"
#include"queue.h"
//using namespace std;
typedef struct proce
{
int allocation[5];//最多有5个资源
int max[5];
int need[5];//还需要的资源
int request[5];
int finish;
}pro;
typedef struct source
{
int available;//可用数
char name[5];
}sou;
//ofstream SaveFile("cpp-home.txt");//////
int al;
int all_finish;//进程全部完成标志
LinkQueue Q;
void create(sou *source,int &ns)
{
cout<<"资源"<<ns+1<<"名:"; cin>>source[ns].name;
cout<<"资源"<<ns+1<<"数:"; cin>>source[ns].available;
ns++;
cout<<"当前可用资源及资源数为:"<<endl;
for(int i=0;i<ns;i++)
{ //puts(source[i].name);
cout<<source[i].name<<":";
cout<<source[i].available<<" ";
}
}
void delet(sou *source,int &ns)
{
cout<<"当前可用资源及资源数为:"<<endl;
for(int i=0;i<ns;i++)
{ //puts(source[i].name);
cout<<source[i].name<<":";
cout<<source[i].available<<" ";
}
cout<<"请输入欲删除的资源名:";
char ch[5];
cin>>ch;
for(i=0;i<ns-1;i++)
{if(!strcmp(source[i].name,ch))
break;
else continue;
}
for(int j=i;j<ns;j++)
{//source[j].name=source[j+1].name;
strcpy(source[j].name,source[j+1].name);
source[j].available=source[j+1].available;
}
ns--;
cout<<"已删除资源"<<ch<<",当前可用资源及资源数为:"<<endl;
for( i=0;i<ns;i++)
{ cout<<source[i].name<<":";
cout<<source[i].available<<" ";
}
}
void modify(sou *source,int &ns)//记住 一定要加*
{
cout<<"当前可用资源及资源数为:"<<endl;
for(int i=0;i<ns;i++)
{ //puts(source[i].name);
cout<<source[i].name<<":";
cout<<source[i].available<<" ";
}
cout<<"请输入欲修改的资源名:";
char ch[5];
cin>>ch;
for(i=0;i<ns-1;i++)
{if(!strcmp(source[i].name,ch))
break;
else continue;
}
int avai;
cout<<"资源"<<i+1<<"名:"<<ch;
cout<<" 请输入资源"<<i+1<<"数:"; cin>>source[i].available;
for( i=0;i<ns;i++)
{ cout<<source[i].name<<":";
cout<<source[i].available<<" ";
}
cout<<endl;
}
int xulie[10];
int nn;
//安全性算法
int safe_algor(sou *source,pro *process,int &ns,int &np)
{
int f=0;
int work[5];
for(int j=0;j<ns;j++)
{
work[j]=source[j].available;
}
for(int i=0;i<np;i++)
{
if(process[i].finish==0)
{
for(int j=0;j<ns;j++)
if(process[i].need[j]<=work[j])
continue;
else break;
if( j==ns)//找到满足条件的进程
{
for(j=0;j<ns;j++)
{
work[j]+=process[i].allocation[j];
}
process[i].finish=-1;//用 -1表示用安全性算法时,存在序列让它顺利完成,但并不是真的进程完成,1表示进程真的完成
xulie[f]=i+1;
f++;//用来记录可以完成的进程的个数
//break;
i=-1;//下一次判断从头开始
}
}
}
//int p=0;
for(j=0;j<np;j++)
{ if(process[j].finish==-1)
process[j].finish=0;//安全性算法用完之后,恢复finish值
}
nn=0;
for(j=0;j<np;j++)
if(process[j].finish){ f++; nn++;}
if(f<np)
{/*cout<<"正在给进程分配资源....."<<endl;
Sleep(500);
cout<<"已分配给进程
*/
return 0;
}
else {/*
cout<<"始状态是安全的,进程可以开始申请资源"<<endl;
cout<<"存在的一个安全的序列:";
for(i=0;i<np;i++)
cout<<"p"<<xulie[i]<<",";
cout<<endl;
*/
return 1;
}
}
void _process(sou *source,pro *process,int &ns,int &np)
{al=1;
cout<<"注意:(当前可用资源及资源数为: ";
for(int i=0;i<ns;i++)
{ //puts(source[i].name);
cout<<source[i].name<<":";
cout<<source[i].available<<" ";
} cout<<")";
cout<<endl;
cout<<"-------------------------------------------------"<<endl;
cout<<endl<<"请输入各个进程需各个资源最大数:"<<endl;
//cout<<" 进程 "<<" 分配 "<<" 尚需"<<endl;
//cout<<" ";for(i=0;i<ns;i++)
// cout<<source[i].name<<" ";
for( i=0;i<np;i++)
{ process[i].finish =0;//进程结束标志
cout<<"进程"<<i+1<<",";//<<need
cout<<"需各资源最大数:"<<endl;
for(int j=0;j<ns;j++)
{
process[i].allocation[j]=0;
process[i].request[j]=0;
cout<<" "<<source[j].name<<":";
cin>>(process[i]).max[j];
if(process[i].max[j]>source[j].available)
{ cout<<" "<<"errror!超过可用资源最大值,请重输!."<<endl;
j--;//返回重输
}
}
/*
cout<<"进程"<<i+1<<",";
cout<<"已分配各资源数:"<<endl;
for( j=0;j<ns;j++)
{cout<<" "<<source[j].name<<":";
cin>>(process[i]).allocation[j]; }
*/
}
for(i=0;i<np;i++)
for(int j=0;j<ns;j++)
process[i].need[j]=process[i].max[j]-process[i].allocation[j] ;
/*
//for(int j=0;j<np;j++)
for(i=0;i<ns;i++)
for(int j=0;j<np;j++)
source[i].available-=process[j].allocation[i];//可用的减去分配的,求出当前可用
*/
cout<<"当前可用:";
for(i=0;i<ns;i++)
{
cout<<source[i].name<<": ";
cout<<source[i].available<<" ";
}
cout<<endl;
//调用安全性算法,判断初始初始状态的安全性
// safe_algor(source,process,ns,np);
}
void show(sou *source,pro *process,int np,int ns)
{
cout<<setw(16*ns+18)<<setfill('_')<<"_"<<endl;
cout<<" |"; cout<<setw(4*ns+1)<<setfill(' ')<<"已分配|";// cout<<"|";
cout<<" |"; cout<<setw(4*ns+1)<<setfill(' ')<<"还需要|";
cout<<" |"; cout<<setw(4*ns+1)<<setfill(' ')<<"可用资源|";
cout<<" |"; cout<<setw(4*ns+1)<<setfill(' ')<<"是否完成|";
cout<<endl;
Sleep(1000);
//cout<<"|"<<endl;
//for(int i=0;i<np;i++)
cout<<" |";
for(int i=0;i<3;i++)
{
for(int j=0;j<ns;j++)
cout<<setw(4)<<setfill(' ')<<source[j].name;
cout<<"| |";
}
cout<<endl;
cout<<setw(16*ns+18)<<setfill('-')<<"-"<<endl; Sleep(1000);
for(i=0;i<np;i++)
{ cout<<setw(3)<<setfill(' ')<<'p'<<i+1<<" ";
for(int j=0;j<ns;j++)
cout<<setw(4)<<setfill(' ')<<process[i].allocation[j];
cout<<" ";
for(j=0;j<ns;j++)
cout<<setw(4)<<setfill(' ')<<process[i].need[j];
cout<<" ";
for(j=0;j<ns;j++)
cout<<setw(4)<<setfill(' ')<<source[j].available;
cout<<" ";
if(process[i].finish==1)
cout<<setw(4)<<setfill(' ')<<"T";
else cout<<setw(4)<<setfill(' ')<<"F";
cout<<endl;
Sleep(1000);
}
cout<<setw(16*ns+18)<<setfill('_')<<"_"<<endl;
QNode *p;
p=Q.front->next;
while(p)
{
cout<<"等待队列中还有"<<endl;
cout<<"进程"<<p->data.id+1<<" ";
for(i=0;i<ns;i++)
{cout<<source[i].name<<":"; cout<<p->data.r_sourc[i]<<",";}
cout<<endl<<" ";
p=p->next;
}
//cout<<setw(6)<<source[j].name;
}
//申请资源,银行家算法
void _buf(sou *source,pro *process,int &ns,int &np)
{
if(!QueueEmpty(Q))//等待队列中优先
{ int length;
length=QueueLength(Q);
for(int i=0;i<length;i++)
{
int num; buf dd;
DeQueue(Q,dd);
num=dd.id;
for(int j=0;j<ns;j++)
process[num].request[j]=dd.r_sourc[j];
int con=1;
for(int i=0;i<ns;i++)
{
if(process[num].request[i]>process[num].need[i])//缓冲区中等待的申请失效
{
DeQueue(Q,dd);break; con=0;
}
}
if(con)
{
//
for( j=0;j<ns;j++)
{
source[j].available-=process[num].request[j];
process[num].allocation[j]+=process[num].request[j];
process[num].need[j]-=process[num].request[j];
}
if(safe_algor(source,process,ns,np))
{
Sleep(1000);
cout<<"现在可以给等待队列中进程"<<num+1<<"分配"<<endl;
cout<<"正在分配..."; Sleep(500); cout<<"分配成功"<<endl;
int flag;
for(i=0;i<np;i++)
{ flag=1;
for(int j=0;j<ns;j++)
if(process[i].need[j])//有一个不为0,就没有结束
{
flag=0;break;
}
if(f