📄 cpp1.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<iostream.h>
#define M 5 /*进程数*/
#define N 3 /*资源数*/
//系统可用资源向量
int Available[N] = {3,3,2};
//最大需求向量
int Max[M][N] = {
{7,5,3},
{3,3,2},
{9,0,2},
{2,2,2},
{4,3,3},
};
//资源分配向量
int Allocation[M][N] = {
{0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2}, };
//需求向量
int Need[M][N] = {
{7,4,3},
{1,2,2},
{6,0,0},
{0,1,1},
{4,3,1},
};
//比较两个一维数组
//判断 a >= b ?
bool compare(int *a,int *b,int n)
{
int i=0;
for(i=0;i<n;i++)
{
if(a[i]<b[i])
{
return false;
}
}
return true;
}
//一维数组加法
//a = a + b
void add(int *a,int *b,int n)
{
int i=0;
for(i=0;i< n;i++)
{
a[i]+=b[i];
}
}
//一维数组减法
//a = a - b
void subtract(int *a,int *b,int n)
{
int i=0;
for(i=0;i<n;i++)
{
a[i]-=b[i];
}
}
//将数组b的值赋给a,n为数组的大小
void assign(int *a,int *b,int n)
{
int i=0;
for(i=0;i<n;i++)
{
a[i]=b[i];
}
}
//sl 记录安全序列
bool safe(int *sl)
{
int i;
int count=0; /*记录finish[i] = true 的个数*/
int n=0;
int work[N];
bool finish[M];
//work = av;
assign(work,Available,N);
//初始化标记 finish
for(i=0;i<M;i++)
{
finish[i]=false;
}
//n为进程的个数
//循环最多执行n次
n=M;
while(n--)
{
for(i=0;i<M;i++)
{
//判断是否安全
if(count>=M)
{
//全部进程都可安全执行(finish = true)
return true;
}
//判断能否满足进程i的要求
//work >= Need[i] ?
if(finish[i]==false&&compare(work,Need[i],N))
{
//分配,待进程完成后再释放
add(work,Allocation[i],N);
finish[i]=true;
//记录安全路径
sl[count]=i;
//能满足的进程数+1
count++;
}
}
}
if(count>=M) { return true;}
else{ return false;}
}
//请求分配
//pid进程,r请求向量,n资源个数
bool request(int pid,int *r,int n)
{
int i;
//记录安全路径
int sl[5];
if(compare(Need[pid],r,n)==true &&
compare(Available,r,n))
{
//尝试分配资源
subtract(Available,r,N);
add(Allocation[pid],r,N);
subtract(Need[pid],r,N);
//判断是否是安全状态
if(safe(sl))
{
//打印安全路径
cout<<"安全序列为:"<<endl;
for(i=0;i<M;i++)
{
printf("p%d",sl[i]);
}
cout<<endl;
//可以分配
return true;
}
else
{
//不分配
//恢复到分配前的状态
add(Available,r,N);
subtract(Allocation[pid],r,N);
add(Need[pid],r,N);
return false;
}
}
else
{ //error
return false;
}
}
//打印一维数组
void print(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{cout<<" "<<a[i]; }
cout<<endl;
}
//显示系统信息
void init()
{
int i;
cout<<"该系统共有进程5个,"<<'\n'<<"其对资源的需求和分配情况分别是:"<<endl;
for(i=0;i<M;i++)
{
cout<<"进程"<<i<<"资源最大需求:";
print(Max[i],N);
}
cout<<endl;
for(i=0;i<M;i++)
{
cout<<"进程"<<i<<"已经分配资源:";
print(Allocation[i],N);
}
cout<<endl;
cout<<"系统可用资源数量:"<<'\n'<<'\t'<<endl;
print(Available,N);
}
//输入
void input(int *r,int n,int *id)
{
char ch;
cout<<"请输入进程的id(0 ~ 4):"<<endl;
ch=getche();
*id=ch-0x30;
cout<<"\n请输入对0类资源的申请数量:"<<endl;
ch=getche();
r[0]=ch-0x30;
cout<<"\n请输入对1类资源的申请数量:"<<endl;
ch=getche();
r[1]=ch-0x30;
cout<<"\n请输入对2类资源的申请数量:"<<endl;
ch=getche();
r[2]=ch-0x30;
printf("\n您输入的是:Request[%d](%d,%d,%d)\n",*id,r[0],r[1],r[2]);
}
//检查输入
bool check(int id,int r1,int r2,int r3)
{
if(id>4||id<0||r1<0||r2<0||r3<0)
{ return false; }
else { return true;}
}
int main()
{
//进程id
int id;
//控制字符
int r[3];
char es;
char control;
//显示开始信息
init();
//输入申请信息
input(r,N,&id);
{ //检查输入
if(check(id,r[0],r[1],r[2]) == false)
{
cout<<"输入错误请检查后重新输入!"<<endl;
//continue;
}
//执行
if(request(id,r,N))
{
cout<<"资源分配成功!"<<endl;
}
else
{
cout<<"资源分配失败!"<<endl;
}
//显示当前系统资源和进程情况
cout<<"系统可用资源:"<<endl;
print(Available,N);
cout<<"进程"<<id<<"的最大资源需求:"<<endl;
print(Max[id],N);
cout<<"进程"<<id<<"已经分配资源:"<<endl;
print(Allocation[id],N);
cout<<"是否继续输入?(Y/N)"<<endl;
control=getch();
if(control=='Y'||control=='y')
es=main();
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -