constint MAX_PROCESS = 100; constint MAX_RESOURCE = 100; int n; //记录进程数 int m; //记录资源数 int Max[MAX_PROCESS][MAX_RESOURCE]; //记录进程所需最大资源数 int Allocation[MAX_PROCESS][MAX_RESOURCE]; //记录进程已分配的资源数 int Need[MAX_PROCESS][MAX_RESOURCE]; //记录进程还需分配的资源数 int Available[MAX_RESOURCE]; //记录可用资源数 int Request[MAX_RESOURCE]; //记录请求的资源数 bool Finish[MAX_PROCESS]; //安全判断辅助数组 bool flag[MAX_PROCESS]; //记录进程是否完成 int safeSeries[MAX_PROCESS]; // 记录进程 int sum = 0; //记录已完成的进程数
voidprintfInfo(){ // 打印系统信息 cout << "系统当前可用的资源:" << endl; for (int i = 0; i < m; ++i) cout << Available[i] << " "; cout << endl; cout << "系统当前未完成的进程资源分配情况如下:" << endl; cout << " PID " << " Max " << " Allocation " << " Need " << endl; for (int i = 0; i < n; ++i) { if (flag[i]) { cout << " P" << i << " "; for (int j = 0; j < m; ++j) cout << Max[i][j] << " "; cout << '\t'; for (int j = 0; j < m; ++j) cout << Allocation[i][j] << " "; cout << '\t'; for (int j = 0; j < m; ++j) if (flag[i]) cout << Need[i][j] << " "; cout << endl; } } }
boolcmp(int a[], int b[]){ // 比较函数,如果a < b, 返回true for (int i = 0; i < m; ++i) if (a[i] > b[i]) returnfalse; returntrue; }
boolsafe(){ // 安全性算法 for (int i = 0; i < n; ++i) Finish[i] = false; // 初始化Finish辅助数组 int work[MAX_RESOURCE]; for (int i = 0; i < m; ++i) // 将Available数组复制到work work[i] = Available[i]; for (int i = 0; i < sum; ++i) { for (int j = 0; j < n; ++j) { if (flag[j]) { if ( !Finish[j] && cmp(Need[j], work)) { Finish[j] = true; for (int k = 0; k < m; ++k) work[k] += Allocation[j][k]; safeSeries[i] = j; break; //这次遍历结束,直接break } elseif (j == n - 1 && (Finish[j] || !cmp(Need[j], work))) //如果某一次遍历并未对Finish进行修改,则说明目前进程不安全,直接返回结果 returnfalse; } } } returntrue; }
boolbank(int index){ if (!flag[index]) { printfInfo(); cout << "该进程已经结束,无需分配资源,请求已被系统拒绝!" << endl; returnfalse; } if (!cmp(Request, Need[index])) { printfInfo(); cout << "本次请求大于所需资源数,请求已被系统拒绝!" << endl; returnfalse; } if (!cmp(Request, Available)) { printfInfo(); cout << "本次请求大于系统所剩资源数,请求已被系统拒绝!" << endl; returnfalse; } // 尝试分配资源 for (int i = 0; i < m; ++i) { Available[i] -= Request[i]; Allocation[index][i] += Request[i]; Need[index][i] -= Request[i]; } if (safe()) { printfInfo(); cout << "当前系统安全!" << endl; cout << "安全序列为:"; for (int i = 0; i < sum; i++) cout << safeSeries[i] << " "; cout << endl; returntrue; } else { // 撤销之前的尝试 for (int i = 0; i < m; ++i) { Available[i] += Request[i]; Allocation[index][i] -= Request[i]; Need[index][i] += Request[i]; } printfInfo(); cout << "当前请求不安全,无法进行操作!" << endl; returnfalse; }
}
voidinit(){ //读入系统进程的初始状态 while (true) { cout << "请输入进程的数量:"; cin >> n; cout << "请输入系统资源种类数:"; cin >> m; sum = n; //初始状态,所有进程均未完成 // 初始化flag数组,表示这些进程均未完成 for (int i = 0; i < n; ++i) flag[i] = true; cout << "请输入各进程的最大需求矩阵:" << endl; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) cin >> Max[i][j]; cout << "请输入各进程的已分配的资源数:" << endl; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) cin >> Allocation[i][j]; cout << "请输入系统各资源的个数:" << endl; for (int i = 0; i < m; ++i) cin >> Available[i]; //计算获得Need矩阵 for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) Need[i][j] = Max[i][j] - Allocation[i][j];
for (int i = 0; i < n; ++i) //获取Available矩阵 for (int j = 0; j < m; ++j) Available[j] = Available[j] - Allocation[i][j]; printfInfo(); if (safe()) { cout << "当前系统安全!" << endl; cout << "安全序列为:"; for (int i = 0; i < n; i++) cout << safeSeries[i] << " "; cout << endl; return; } else cout << "当前系统不安全,无法进行操作,请重试!" << endl; } }
voidisFinished()//判断是否有进程已经结束 { for (int i = 0; i < n; ++i) { bool isFinished = true; for (int j = 0; j < m; ++j) { if (Need[i][j] != 0) { isFinished = false; break; } } if (isFinished && flag[i]) { flag[i] = false; sum --; for (int j = 0; j < m; ++j) Available[j] += Max[i][j]; return; //从整个系统来看,我们得知一次请求最多只可能使一个进程结束 } } } intmain() { init(); cout << "============数据录入完毕=============" << endl; int choice; while (true) { int index; //判断是否有进程已经结束,并进行处理 isFinished(); if (sum == 0) { cout << "进程已全部结束!" << endl; return0; } cout << "请输入发布请求的进程ID(0~" << n - 1 << "):"; cin >> index; cout << "请依次输入请求的资源数:"; for (int i = 0; i < m; ++i) cin >> Request[i]; bank(index); } }