7-1 银行家算法--安全性检查 (20 分)(思路+详解+知识分析)宝 你今天 AC了吗

本文描述了一个算法,用于管理进程对系统资源的需求,判断系统是否处于安全状态以防止死锁。通过输入进程的资源需求和分配,程序检查并调整资源,确保进程按需分配且不会导致死锁。
摘要由CSDN通过智能技术生成

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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值