当前位置: 首页 > news >正文

银行家算法-安全性检查算法(C语言实现)

目录

1.题目要求

​编辑2.安全性检查算法描述

初始化:

查找可执行进程:

执行进程并更新状态:

判断系统安全性:

3.代码实现

4.运行结果


1.题目要求

2.安全性检查算法描述

  1. 初始化

    • 设置两个向量:工作向量Work和布尔向量Finish。
    • Work表示系统可提供给进程继续运行所需的各类资源数目,初始化为当前可用资源数量Available。
    • Finish表示系统是否有足够的资源分配给进程,使之运行完成,初始化为false。
  2. 查找可执行进程

    • 从进程集合中找到一个满足以下条件的进程:Finish[i]=false且Need[i]<=Work。
    • 如果找到这样的进程,则执行步骤3;否则,执行步骤4。
  3. 执行进程并更新状态

    • 假设进程Pi获得资源后可顺利执行,直至完成,并释放出分配给它的资源。
    • 更新Work向量:Work+=Allocation[i]。
    • 将Finish[i]设置为true,表示进程Pi已完成。
    • 返回步骤2,继续查找下一个可执行进程。
  4. 判断系统安全性

    • 如果所有进程的Finish[i]都为true,则表示系统处于安全状态;否则,系统处于不安全状态。

3.代码实现

#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> #define SOURNUM 3 #define MAX 5 char* safeList[5]; typedef struct PCB { char name[2]; //进程名 int max[SOURNUM]; //所需最大资源数 int allocation[SOURNUM]; //已分配资源数 int need[SOURNUM]; //当前所需资源数 int finish; //完成状态 }pcb; pcb pro[MAX] = { {"P0",{7, 5, 3}, {0, 1 ,0},{7, 4 ,3},-1}, {"P1",{3 ,2, 2}, {2, 0, 0},{1, 2 ,2},-1}, {"P2",{9, 0, 2}, {3, 0 ,2},{6, 0 ,0},-1}, {"P3",{2 ,2, 2}, {2, 1 ,1},{0, 1, 1},-1}, {"P4",{4 ,3 ,3}, {0 ,0, 2},{4, 3, 1},-1} }; int checkSafe(pcb pro[], int *available, int proNumber, int sourNumber) { int i, j, numsour = 0; int safeListnum = 0; while (safeListnum < proNumber) { int flag = -1;//判断这一轮有没有至少找到一个 for (i = 0; i < proNumber; i++) { numsour = 0; if (pro[i].finish == -1) { for (j = 0; j < sourNumber; j++) { if (pro[i].need[j] <= available[j]) numsour++; } if (numsour == sourNumber) { for (j = 0; j < sourNumber; j++) { available[j] += pro[i].allocation[j];//释放资源 } pro[i].finish = 1; flag = 1; safeList[safeListnum++] = pro[i].name;//加入到安全序列 if (safeListnum == proNumber)//已经找到了一个安全序列 return 1; } } } if (flag == -1)//这轮一个都没有找到 return -1; } } int main() { int proNumber = MAX, sourNumber = SOURNUM; int available[SOURNUM] = { 3,3,2 }; int flag = checkSafe(pro, available, proNumber, sourNumber); if (flag == 1) { printf("找到了一个安全序列:"); for (int i = 0; i < proNumber; i++) { if (i != proNumber-1) printf("%s->", safeList[i]); else printf("%s", safeList[i]); } printf(",T0时刻系统是处于安全状态。\n"); } else printf("找不到安全序列,T0时刻系统处于不安全状态。"); return 0; }

4.运行结果

http://www.jsqmd.com/news/447040/

相关文章:

  • 终极指南:如何用vex.js插件系统打造自定义对话框
  • xctool测试报告分析终极指南:5分钟快速解读JUnit和Phabricator报告
  • 不同输入函数的区别比较及send和sendline使用
  • 为什么React Dev Inspector是2024年前端开发的必备工具?
  • 如何快速掌握Mio高性能I/O库:探索os-poll和net核心功能的终极指南
  • 如何快速生成精准上传漏洞字典?upload-fuzz-dic-builder完全使用指南
  • 交流异步电动机变频矢量控制仿真的控制效果良好
  • EVE API完全指南:函数对象与SIMD类型深度解析
  • USWDS与现代化框架集成终极指南:React、Angular和Vue的最佳实践
  • aHash高级特性:编译时/运行时RNG选择与no_std环境配置
  • 如何使用MagicClothing:AI服装驱动图像合成的完整指南
  • 自动驾驶数据集标注与检测对比:Streamlit Demo: The Udacity Self-driving Car Image Browser 实战教程
  • 彻底解决结构化数据痛点:TensorFlow Fold动态计算图实战指南
  • 为何 LoRA 初始化 B=0 而 A 为高斯分布初始化?
  • wps加载项打包成exe
  • 10分钟上手pretty-quick:让代码格式化效率提升10倍的实战指南
  • wit-bindgen高级特性:类型别名、资源管理与异步支持完全攻略
  • 岐金兰空论
  • 为什么gh_mirrors/cr/cross_browser能跨浏览器追踪用户?核心算法解析
  • Glass终极隐私保护:为什么它永远不会出现在屏幕录制中
  • Input Leap企业部署终极指南:多用户环境下的配置管理与安全策略
  • 终极Githug插件系统架构解析:如何快速扩展Git学习功能的完整指南
  • 如何快速掌握Facebook xctool测试框架:从入门到精通的完整指南
  • twentytwenty实战案例:打造响应式图片对比界面的简单步骤
  • Mutate高级配置:如何设置热键、关键词和主题个性化
  • cryptocurrency-arbitrage:揭秘800+加密货币跨50个市场的套利机会计算器
  • 本地化JSON 处理新方案:基于 Docker的JSON Hero部署全记录
  • Pux Mux类深度解析:掌握路由定义与分发核心机制
  • STM32——DMA(十四) - 指南
  • 如何为xh HTTP请求工具开发自定义功能:完整插件开发指南