Need:这个进程还需要多少资源
Available:这个系统还剩多少资源
2>:刚开始设置work = Available 将所有进程设置为 finish = false (相当于定义一个flag)
3>:找一个进程满足下列的条件
finish = false
need <= work(需要的资源得比系统剩余的要少)
4>:如果 3>的条件满足的话,我们就需要
将work += Allocation (每个进程执行完后需要释放资源)
finish = true (代表该进程完成)
返回步骤 3>继续寻找满足上诉条件的进程
5>:思考如何判定此时的系统状态是安全还是不安全的
安全:如果 3>的条件不满足 即此时的所有进程的 finsh = true 说明了所有的进程已经完成
不安全: 我们已经判断了所有的finish = false 的进程,但是仍未找到满足条件的
need < work 那么可以判定此状态为 不安全的状态
,否则
那么就是说明该系统处在不安全的状态(即会发生死锁)
4.处理数据
1>:这里我们选取的数据结构是结构体数组因为一个进程他对应好多属性,所以选取的是结构体
在结构体的属性当中 我们设置一个 max[] 和 allocation[] 目的是存放多个不同类型资源
2>:关于node[i].a[j],node[i].b[j],node[i].c[j]的理解,就是3个二维数组 就是这样的
*/
#include<bits/stdc++.h>
using namespace std;
struct Node{
string processName;//进程名
int a[100];//Max
int b[100];//allocation
int c[100];//need
bool finish;
}node[1000];
//关于重写 sort方法中的两个参数 都表示是一个结构体(即我们需要用两个结构体当中的数据进行比较)
bool sort_c(Node node1,Node node2){
return node1.c[0] < node2.c[0];
}
int main(){
int N,M;
int cnt = 0;//用于记进程完成的个数
vectorv1;//存总的资源总量
vectorv2;//存need需要的资源
vectorv3;//记录最后需要输出的Available
cin >> N >> M;
for(int i = 0; i < M; i++){
int resources;
cin >> resources;
v1.push_back(resources);
}
for(int i = 0; i < N; i++){
cin >> node[i].processName;
//输入Max
for(int j = 0; j < M; j++){
cin >> node[i].a[j];
}
//输入allocation
for(int j = 0; j < M; j++){
cin >> node[i].b[j];
v1[j] -= node[i].b[j];//这里是每次减去分配的资源 那么剩下的最后就是 available
}
//求取need
for(int j = 0; j < M; j++){
node[i].c[j] = node[i].a[j] - node[i].b[j];
}
node[i].finish = false;//将每个进程初始状态设为 false
}
for(int i = 0; i < M; i++){
v3.push_back(v1[i]);
}
// sort(node,node+N,sort_c);
//算法核心部分
for(int i = 0; i < N; i++){
int count = 0;
for(int j = 0; j < M; j++){
if(node[i].c[j] <= v1[j]){
count++;
}else{
break;//只要有一个不合适就 break 出去
}
}
if(node[i].finish == false && count == M) {//count == M说明剩余的各个资源总量大于该进程的所需要的
for(int j = 0; j < M; j++){
v1[j] += node[i].b[j];//那么此时剩余的资源总量为原来的加上 该进程释放其占有的资源
}
node[i].finish = true;
cnt++;//记录完成进程的个数
// cout << node[i].processName << ’ ';
//此处牛逼之处在于 只要我们找到满足条件的就从-1开始继续寻找满足条件的
i = -1;
}
}
// cout << endl;
int flag = 0;
cout << “name max allocation need available” << endl;
for(int i = 0; i < N; i++){
cout << node[i].processName << ’ ';
for(int j = 0; j < M; j++){
cout << node[i].a[j] << ’ ';
}
cout << "| ";
for(int j = 0; j < M; j++){
cout << node[i].b[j] << ’ ';
}
cout << "| ";
for(int j = 0; j < M; j++){
cout << node[i].c[j] << ’ ';
}
cout << “|”;
if(flag == 0){
for(int j = 0; j < M; j++){
if(j == 0)
cout << ’ ’ <<v3[j];
else
cout << ’ ’ <<v3[j] ;
}
flag = 1;
}
cout << endl;
}
if(cnt == N){
cout << “找到安全序列,处于安全状态。”;
}else{
cout << “找不到安全序列,处于不安全状态。”;
}
// for(int i = 0; i < M; i++){
// cout << v1[i] << ’ ';
// }
// 验证数据
// for(int i = 0; i < N; i++){
//
// cout << node[i].processName << ’ ';
//
// for(int j = 0; j < M; j++){
//
// cout << node[i].c[j] << ’ ';
// }
// cout << endl;
// }
}
//name max allocation need available
//P0 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2
//P1 3 2 2 | 2 0 0 | 1 2 2 |
//P2 9 0 2 | 3 0 2 | 6 0 0 |
//P3 2 2 2 | 2 1 1 | 0 1 1 |
//P4 4 3 2 | 0 0 2 | 4 3 0 |
//找到安全序列,处于安全状态。
//5
//3
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!