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

文章讨论了如何通过算法在系统中安全地分配资源,以防止死锁的发生。关键步骤包括检查进程需求、分配资源、判断进程完成状态和系统安全性。作者还提到在编程挑战中遇到的陷阱,如变量初始化的重要性。
摘要由CSDN通过智能技术生成

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个二维数组 就是这样的

四:先说坑

====================================================================

1.这个题无语了简直了真是,不,应该是PTA这个平台让我真的无语了,我定义了一个变量 cnt 但我并未初始化为0 ,我在DEV-C中测试了好多数据其实也无妨正确结果,但是在PTA中提交一直显示答案错误,而且测试样例一直输出 找不到安全序列,真的一上午我真的想砸电脑,什么呀!! 最后坚持不懈,不信邪,终于让我发现一个大毛病,原来在PTA上变量必须初始化,否则系统自动给你赋值一个很大数 ,但在DEV-C上却没有任何问题

2.这个题还需要的是无论 是否可以得到安全序列,其都必须将其系统中各个进程的状态输出来

五:上码

===================================================================

/**

思路:1.首先我们进行安全性算法是为了预防死锁,再解释一下死锁 比如

1>:在系统中有两个进程p1,p2 和两个资源r1(扫描仪),r2(刻录机)

p1和p2都需要将扫描的文档通过刻录机刻录到CD盘上,

2>:进程p1先请求资源r1成功,进程p2请求资源r2成功,那么接下来,

p1又申请了r2资源 p2申请了r1资源,那么此时p1和p2都在等对方

释放资源那么就会发生死锁,两个进程都无法进行下去

2.那么安全性算法就是使系统在分配资源时候一直处在安全的状态(即不会发生死锁)

那么我们在分配资源的时候就有了算法,即最终分配给各个进程的资源,都不会影响到

整个系统的安全状态,这时会出现一个进程的执行序列

3.具体解释算法过程

1>:几个变量

Max:一个进程所需的最大资源量

Allocation:系统已经给其分配了多少资源

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;

}

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值