题目:
代码:
#include<iostream>
using namespace std;
#define MAX_PROCESSNUM 5 //最大线程数
#define MAX_RESOURCE 4 //资源种类 (A B C D)
/*单个进程的最大需求矩阵*/
int Max[MAX_PROCESSNUM][MAX_RESOURCE] = { {0,0,1,2},{1,7,5,0},{2,3,5,6},{0,6,5,2},{0,6,5,6} };
/*系统可用资源数量*/
int Available[MAX_RESOURCE] = { 1,5,2,0 };
/*每个进程已占各类资源数量*/
int Allocation[MAX_PROCESSNUM][MAX_RESOURCE] = { {0,0,1,2},{1,0,0,0},{1,3,5,4},{0,6,3,2},{0,0,1,4}};
/*单个进程还需要资源数量*/
int Need[MAX_PROCESSNUM][MAX_RESOURCE] = { 0 };
//某个进程的请求资源数
int Request[MAX_RESOURCE] = { 0 };
//显示各类资源状态
void ShowResource()
{
cout << "最大需求矩阵(Max)为:" << endl;
for (int i = 0; i < MAX_PROCESSNUM; i++)
{
cout << "P" << i<<" ";
for (int j = 0; j < MAX_RESOURCE; j++)
{
cout<<Max[i][j]<<" ";
}
cout << endl;
}
cout << endl << "已占资源数(Allocation):" << endl;
for (int i = 0; i < MAX_PROCESSNUM; i++)
{
cout << "P" << i << " ";
for (int j = 0; j < MAX_RESOURCE; j++)
{
cout << Allocation[i][j] << " ";
}
cout << endl;
}
cout << endl << "系统可用资源数(Available)为:" << endl;
for (int i = 0; i < MAX_RESOURCE; i++)
{
cout << Available[i]<< " ";
}
cout << endl;
}
//计算需求矩阵
void CalculatNeed()
{
cout << endl << "计算所得需求矩阵(Need)为:" << endl;
for (int i = 0; i < MAX_PROCESSNUM; i++)
{
cout << "P" << i << " ";
for (int j = 0; j < MAX_RESOURCE; j++)
{
Need[i][j] = Max[i][j] - Allocation[i][j];
cout << Need[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
//need矩阵与Work(availiable)矩阵比较(当所需资源全部小于系统剩余资源时返回true)
bool CompareNeedAndWork(int* Need_,int* Work_)
{
bool flag = true;//初始默认全部小于
for (int i = 0; i < MAX_RESOURCE; i++)
{
if (Need_[i] > Work_[i])
{
flag = false;
break;
}
}
return flag;
}
//将进程i的已分配资源释放到系统可用资源中
void ReleaseAllocationToWork(int* Allocated_, int* Work_)
{
for (int i = 0; i < MAX_RESOURCE; i++)
{
Work_[i] += Allocated_[i];
}
}
//检测系统是否存在安全序列
void CheckSafe()
{
//初始化 work = availiable
int Work[MAX_RESOURCE] = { 0 };
memcpy(Work, Available, sizeof(int) * MAX_RESOURCE);
//进程是否已经分配资源
int IsFinish[MAX_PROCESSNUM] = { 0 };
//暂存分配进程id号
int Temp[MAX_PROCESSNUM] = { 0 };
int index = 0;//暂存下标
//遍历进程所需资源是否超过系统目前可用资源(不超过的就响应请求)
for (int i = 0; i < MAX_PROCESSNUM; i++)
{
//若此进程未被响应且所需资源全部小于系统可利用资源则尝试进行分配
if (!IsFinish[i] && CompareNeedAndWork(Need[i], Work))
{
//记录分配进程id
Temp[index++] = i;
//将进程i的资源释放到系统可用资源
ReleaseAllocationToWork(Allocation[i], Work);
//将进程i的标志位置为true(当前进程请求已释放)
IsFinish[i] = true;
i = -1;//重复此循环
}
}
//校验是否所有进程均已分配执行完成
for (int i = 0; i < MAX_PROCESSNUM; i++)
{
if (!IsFinish[i])
{
cout << "系统不安全,此次资源申请失败!" << endl<<endl;
return;
}
}
//打印成功分配的安全序列
cout << "系统安全,此次资源申请成功,安全序列为:" << endl;
for (int i = 0; i < MAX_PROCESSNUM; i++)
{
cout <<"P"<<Temp[i] << " ";
}
cout << endl<<endl;
}
//检测进程i的请求资源是否合法
//要求 need >= request且 availabel >= request
//若合法则尝试进行分配
bool CheckRequest(int id,int *Request_)
{
for (int i = 0; i < MAX_RESOURCE; i++)
{
if (Need[id][i]< Request_[i])
{
cout << "资源请求超出该进程最大需求资源!" << endl;
return false;
}
if (Available[i] < Request_[i])
{
cout << "资源请求超出系统可分配资源!" << endl;
return false;
}
}
return true;
}
//系统对i进程的资源请求进行分配
void AllocateToResquest(int id,int* Request_)
{
for (int i = 0; i < MAX_RESOURCE; i++)
{
Available[i] -= Request_[i];//系统可用资源减少
Allocation[id][i] += Request_[i];//进程i已分配资源增加
Need[id][i] -= Request_[i];//进程i所需资源减少
}
return;
}
//回复原始状态
void BackToOrignal(int id, int* Request_)
{
for (int i = 0; i < MAX_RESOURCE; i++)
{
Available[i] += Request_[i];//系统可用资源
Allocation[id][i] -= Request_[i];//进程i已分配资源
Need[id][i] += Request_[i];//进程i所需资源
}
return;
}
int main()
{
ShowResource();
CalculatNeed();
CheckSafe();
char flag = 'n';
do
{
cout << "****************尝试分配请求***************" << endl;
cout << "请输入进程id号:" << endl;
int id = 0;
cin >> id;
if (id >= MAX_PROCESSNUM || id < 0)
{
cout << "该进程id不存在,请重新输入!" << endl;
goto END;
}
cout << "请输入资源请求矩阵:" << endl;
for (int i = 0; i < MAX_RESOURCE; i++)
{
cin >> Request[i];
}
if (!CheckRequest(id, Request))
{
goto END;
}
//满足条件,对请求尝试进行资源分配
AllocateToResquest(id, Request);
//检查安全性
CheckSafe();
//下次尝试分配前要恢复原始资源数据(不管安全不安全都要恢复)
BackToOrignal(id, Request);
END:
cout<< "输入n退出,否则继续" << endl;
cin >> flag;
} while (flag != 'n');
return 0;
}
结果截图:
比较复杂的就是安全性校验那部分,这部分感觉还可以优化时空复杂度,采用递归之类的方式处理(但是线程数量一多,可能会造成递归栈溢出)