📄
字号:
设计七 动态资源分配系统的设计
目的与要求:
本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。具体要求如下:
⑴模拟一个银行家算法;
⑵初始化时让系统拥有一定的资源;
⑶用键盘输入的方式申请资源;
⑷如果预分配后,系统处于安全状态,则修改系统的资源分配情况;
⑸如果预分配后,系统处于不安全状态,则提示不能满足请求。
三。程序说明:
这个程序是用C++语言写的
四。程序结构:
程序中一共定义了两个类:进程类(class Process),系统类(class System);
进程类封装了进程的基本操作:
Process(int Num_M[],int Num_A[]); //构造函数,初始化进程对资源的最大申请量跟进程已经获 得资源的数量
int Max(Resource j); //进程对资源j的最大申请量
int Allocation(Resource j); //进程已获得资源j的数量
void AlterAlloc(Resource j,int AltNum); //改变进程已经获得资源j的数量
int Need(Resource j); //进程还需要资源j的数量
void AcceReq(int Num_R[]); //用来存入进程申请的资源数量
int Request(Resource j); //进程申请资源j的数量
进程封装了进程所拥有的数据成员:
int Num_Max[3]; //用来保存进程分别对 Printer,Disk,CD-ROM的最大申请量
int Num_Alloc[3]; //保存进程已获得的三类资源数量
int Num_Req[3]; //用来保存进程对相应三类资源的申请
系统类封装了系统可进行的基本操作:
System(int Num_P,int Num_D,int Num_CD); //构造函数初始化系统现有Printer,Disk,CD-ROM的数量
int Available(Resource j); //系统现有j类资源的数量
void AlterAvai( Resource j,int AltNum);
void AskResource(int NumberP,int Num_R[],Process& p0,Process& ,Process&p2,Process& p3,Process& p4,System& system);
void PutTable(Process p0,Process p1,Process p2,Process p3,Process p4);
nt SafeCheck(Process p0,Process p1,Process p2,Process p3,Process p4); //系统安全检查,如果安全将返回1,否则返回0
系统类还封装了系统拥有的数据成员:
int Num_Printer; //打印机的数量
int Num_Disk; //磁盘的数量
int Num_CDROM; //光驱的数量
五。程序源代码:
//文件Process.h
//进程类的定义文件以及其它数据的定义
#ifndef PROCESS_H
#define PROCESS_H
enum resource {Printer,Disk,CDROM}; //定义资源类型为枚举变量
typedef enum resource Resource;
//下面定义进程类
class Process
{
public:
Process(int Num_M[],int Num_A[]); //构造函数,初始化进程对资源的最大申请量跟进程已经获得资源的数量
int Max(Resource j); //进程对资源j的最大申请量
int Allocation(Resource j); //进程已获得资源j的数量
void AlterAlloc(Resource j,int AltNum); //改变进程已经获得资源j的数量
int Need(Resource j); //进程还需要资源j的数量
void AcceReq(int Num_R[]); //用来存入进程申请的资源数量
int Request(Resource j); //进程申请资源j的数量
private:
int Num_Max[3]; //用来保存进程分别对 Printer,Disk,CD-ROM的最大申请量
int Num_Alloc[3]; //保存进程已获得的三类资源数量
int Num_Req[3]; //用来保存进程对相应三类资源的申请
};
#endif
/文件System
//系统类的定义文件
#ifndef SYSTEM_H
#define SYSTEM_H
#include"Process.h"
//下面定于系统类
class System
{
public:
System(int Num_P,int Num_D,int Num_CD); //构造函数初始化系统现有Printer,Disk,CD-ROM的数量
int Available(Resource j); //系统现有j类资源的数量
void AlterAvai( Resource j,int AltNum);
void AskResource(int NumberP,int Num_R[],Process& p0,Process& p1,Process& p2,Process& p3,Process& p4,System& system);
void PutTable(Process p0,Process p1,Process p2,Process p3,Process p4);
int SafeCheck(Process p0,Process p1,Process p2,Process p3,Process p4); //系统安全检查,如果安全将返回1,否则返回0
private:
int Num_Printer; //打印机的数量
int Num_Disk; //磁盘的数量
int Num_CDROM; //光驱的数量
};
#endif
//文件Process.cpp
//进程类的实现文件
#include"Process.h"
Process::Process(int Num_M[],int Num_A[]) //构造函数
{
int count=0;
for(count=0;count<3;count++) //资源数量数组初始化
{
Num_Max[count]=Num_M[count];
Num_Alloc[count]=Num_A[count];
}
}
int Process::Max(Resource j)
{
switch(j) //下面分别返回对相应资源的最大申请量
{
case Printer:
return Num_Max[0];
case Disk:
return Num_Max[1];
case CDROM:
return Num_Max[2];
default:
return 0;
}
}
int Process::Allocation(Resource j)
{
switch(j) //下面分别返回已获得的对应资源数量
{
case Printer:
return Num_Alloc[0];
case Disk:
return Num_Alloc[1];
case CDROM:
return Num_Alloc[2];
default:
return 0;
}
}
void Process::AlterAlloc(Resource j,int AltNum) //修改进程获得的资源j的数量
{
switch(j)
{
case Printer:
Num_Alloc[0]=AltNum;
break;
case Disk:
Num_Alloc[1]=AltNum;
break;
case CDROM:
Num_Alloc[2]=AltNum;
break;
default:
break;
}
}
int Process::Need(Resource j)
{
switch(j) //下面分别返回还需要对应资源的数量
{
case Printer:
return Num_Max[0]-Num_Alloc[0];
case Disk:
return Num_Max[1]-Num_Alloc[1];
case CDROM:
return Num_Max[2]-Num_Alloc[2];
default:
return 0;
}
}
void Process::AcceReq(int Num_R[]) //存入进程要申请的资源数量
{
int count=0;
for(count=0;count<3;count++)
{
Num_Req[count]=Num_R[count];
}
}
int Process::Request(Resource j)
{
switch(j) //下面分别返回申请的对应资源数量
{
case Printer:
return Num_Req[0];
case Disk:
return Num_Req[1];
case CDROM:
return Num_Req[2];
default:
return 0;
}
}
//文件System.cpp
//系统类的实现文件
#include"System.h"
#include<iostream.h>
typedef int Code;
void DelPro(Code AllPro[],Code c)
{
for(int i=0;i<5;i++) //依次查找元素c
{
if(c==AllPro[i])
{
while(i<5)
{
AllPro[i]=AllPro[i+1]; //删除这个元素
i++;
}
}
}
}
System::System(int Num_P,int Num_D,int Num_CD) //构造函数初始化系统现有的各类资源
{
Num_Printer=Num_P;
Num_Disk=Num_D;
Num_CDROM=Num_CD;
}
int System::Available(Resource j) //返回系统现有的各类资源
{
switch(j)
{
case Printer:
return Num_Printer;
case Disk:
return Num_Disk;
case CDROM:
return Num_CDROM;
default:
return 0;
}
}
void System::AlterAvai( Resource j,int AltNum)//修改系统现有资源j的数量
{
switch(j)
{
case Printer:
Num_Printer=AltNum;
break;
case Disk:
Num_Disk=AltNum;
break;
case CDROM:
Num_CDROM=AltNum;
break;
default:
break;
}
}
void System::AskResource(int NumberP,int Num_R[],Process& p0,Process& p1,
Process& p2,Process &p3,Process& p4,System& system) //对请求分配资源的进程处理过程
{
switch(NumberP)
{
case 0:
{
p0.AcceReq(Num_R); //把要申请的资源数量存入
//下面开始银行家算法
if(p0.Request(Printer)>p0.Need(Printer) || p0.Request(Disk)>p0.Need(Disk)
|| p0.Request(CDROM)>p0.Need(CDROM) )
{
cout<<"你输入错了!";
}
else if(p0.Request(Printer)>system.Available(Printer) || p0.Request(Disk)>system.Available(Disk)
|| p0.Request(CDROM)>system.Available(CDROM) )
{
cout<<"资源数量不够,请等待!"<<endl;
}
else
{
system.AlterAvai(Printer,system.Available(Printer)-p0.Request(Printer)); //修改现有Printer数量
system.AlterAvai(Disk,system.Available(Disk)-p0.Request(Disk)); //修改现有Disk数量
system.AlterAvai(CDROM,system.Available(CDROM)-p0.Request(CDROM)); //修改现有CDROM数量
p0.AlterAlloc(Printer,p0.Allocation(Printer)+p0.Request(Printer) ); //修改已经得到的Printer数量
p0.AlterAlloc(Disk,p0.Allocation(Disk)+p0.Request(Disk)); //修改已经得到的Disk数量
p0.AlterAlloc(CDROM,p0.Allocation(CDROM)+p0.Request(CDROM)); //修改已经得到的CDROM数量
if(SafeCheck(p0,p1,p2,p3,p4))
{
cout<<endl;
cout<<"亲爱的,恭喜你! 资源分配安全,可以分配,分配以后的资源分配表如下:"<<endl;
system.PutTable(p0,p1,p2,p3,p4);
}
else
{
cout<<endl;
cout<<"宝贝对不起!为了系统的安全你申请的资源将得不到分配!"<<endl;
//恢复原来的资源分配状态
system.AlterAvai(Printer , system.Available(Printer)+p0.Request(Printer) );
system.AlterAvai(Disk , system.Available(Disk)+p0.Request(Disk) );
system.AlterAvai(CDROM , system.Available(CDROM)+p0.Request(CDROM) );
p0.AlterAlloc(Printer , p0.Allocation(Printer)-p0.Request(Printer) );
p0.AlterAlloc(Disk , p0.Allocation(Disk)-p0.Request(Disk) );
p0.AlterAlloc(CDROM , p0.Allocation(CDROM)-p0.Request(CDROM) );
}
}
break;
}
case 1:
p1.AcceReq(Num_R); //把要申请的资源数量存入
//下面开始银行家算法
if(p1.Request(Printer)>p1.Need(Printer) || p1.Request(Disk)>p0.Need(Disk)
|| p1.Request(CDROM)>p1.Need(CDROM) )
{
cout<<"你输入错了!";
}
else if(p1.Request(Printer)>system.Available(Printer) || p1.Request(Disk)>system.Available(Disk)
|| p1.Request(CDROM)>system.Available(CDROM) )
{
cout<<"资源数量不够,请等待!"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -