博客
关于我
操作系统 银行家算法c++版
阅读量:622 次
发布时间:2019-03-12

本文共 3301 字,大约阅读时间需要 11 分钟。

银行家算法C++模拟实现

项目概述

本项目旨在对银行家算法进行C++语言的模拟实现,重点关注进程资源分配与系统安全状态的判断。通过对银行家算法的深入理解与实践,掌握进程调度与资源管理的核心知识。

代码实现

代码主要包含三个部分:注释版、最终版以及相关的样例输入输出解释。

注释版代码

// 头文件包含#include 
using namespace std;int avallable[100]; // 系统资源总量数组int sum[100]; // 已分配资源总量数组int cha[100]; // 资源剩余量数组int need[100][100]; // 进程需求数组int allocation[100][100]; // 资源分配数组int maxn[100][100]; // 进程总需求数组int n, m; // 进程个数与资源类数int que[100]; // 模拟队列bool book[100]; // 标记数组bool check() { // 检查函数 // 初始标记为安全 memset(book, true, sizeof(book)); int i, j, l, k = 0, ans; i = 0; ans = i; while (k < n) { // 进程i的资源需求是否满足 if (cha[i] == 0) { // 进程i安全 ans = i; i++; } else { // 非安全,移出队列 book[i] = false; if (ans != i) { // 安全序列更新 que[k] = ans; k++; } l = i; while (l < n && book[l]) { l++; } if (l >= n) break; // 找到下一个安全进程 for (int p = l; p < n; p++) { if (cha[p] == 0) { ans = p; i = p; break; } } } } return true;}

最终版代码

// 代码清空函数void initialization() {    memset(sum, 0, sizeof(sum));    memset(cha, 0, sizeof(cha));    memset(need, 0, sizeof(need));    memset(que, 0, sizeof(que));}// 检查函数bool check() {    memset(book, true, sizeof(book));    int i, j, l, k = 0, ans;    i = 0;    ans = i;    while (k < n) {        if (cha[i] == 0) {            ans = i;            i++;        } else {            book[i] = false;            if (ans != i) {                que[k] = ans;                k++;            }            l = i;            while (l < n && book[l]) {                l++;            }            if (l >= n) break;            for (int p = l; p < n; p++) {                if (cha[p] == 0) {                    ans = p;                    i = p;                    break;                }            }        }    }    return true;}

样例输入输出

样例1

输入:

5 424 28 25 31P0 2 17 10 6-1 9 3 2P1 11 6 12 13-9 1 6 5P2 0 0 13 11-0 0 7 4P3 4 15 8 8-1 6 1 2P4 9 11 9 9-5 8 2 9

输出:

1. 此时系统中可利用的资源向量ABCD为:A:8B:4C:6D:92. 利用银行家算法判断此时刻系统状态是否安全:安全3. 安全序列为:P2 P4 P0 P1 P34. 若进程x提出请求y,系统能否将资源分配给它?系统能否把资源预分配给它?能预分配后安全序列为:P2 P4 P0 P1 P3

样例2

输入:

5 317 5 20P1 5 5 9-2 1 2P2 5 3 6-4 0 2P3 4 0 11-4 0 5P4 4 2 5-2 0 4P5 4 2 4-3 1 4

输出:

1. 此时系统中可利用的资源向量ABC为:A:2B:3C:32. 利用银行家算法判断此时刻系统状态是否安全:安全3. 安全序列为:P4 P5 P1 P2 P34. 若进程x提出请求y,系统能否将资源分配给它?系统能否把资源预分配给它?不能,因为预分配后系统状态不安全,所以无法给出安全序列。

样例3

输入:

5 317 5 20P1 5 5 9-2 1 2P2 5 3 6-4 0 2P3 4 0 11-4 0 5P4 4 2 5-2 0 4P5 4 2 4-3 1 4

输出:

1. 此时系统中可利用的资源向量ABC为:A:2B:3C:32. 利用银行家算法判断此时刻系统状态是否安全:安全3. 安全序列为:P4 P5 P1 P2 P34. 若进程x提出请求y,系统能否将资源分配给它?系统能否把资源预分配给它?能预分配后安全序列为:P4 P5 P1 P2 P3

实现总结

本项目的主要实现步骤包括:

  • 代码设计与初始化

    • 定义了多个数组来模拟资源状态,包括可用资源、已分配资源、剩余资源、需求资源、分配资源和进程总需求等。
    • 设计了初始清空函数initialization(),用于准备下一次安全序列计算。
  • 检查函数实现

    • 核心函数check()实现了银行家算法的安全性判断。
    • 使用book数组标记进程状态,模拟队列que保存安全序列。
    • 逐步检查每个进程是否安全,维护当前安全序列长度k和上一个安全进程编号ans
  • 样例验证

    • 通过提供的三个样例,验证了代码的正确性和银行家算法的应用效果。
    • 样例输出展示了系统状态判断、安全序列生成以及资源分配预测等功能。
  • 改进与优化

    • 优化了代码结构,使其更易读性和可维护性。
    • 确保代码清空函数正确执行,避免数据残留影响后续计算。
  • 感想与收获

    通过本次项目,我对银行家算法有了更深入的理解,掌握了进程调度与资源管理的关键原理。同时,通过实际编码实现,锻炼了动手能力和解决问题的能力。这次实践让我对操作系统中的资源管理机制有了更直观的认识,为后续学习打下了坚实的基础。

    转载地址:http://vuexz.baihongyu.com/

    你可能感兴趣的文章
    pyinstaller:更改应用程序图标
    查看>>
    Pylint“未解决的导入“;Visual Studio 代码中的错误
    查看>>
    pyLoad远程代码执行漏洞复现(CVE-2023-0297)
    查看>>
    pymongo update_one(),upsert=True,不使用$运算符
    查看>>
    pymongo 中的快速或批量更新
    查看>>
    pymongo删除操作
    查看>>
    PyMongo按多个关键点分组
    查看>>
    Pympress:强大的双屏PDF阅读器
    查看>>
    pymysql.err.InternalError: (1054, "Unknown column '27D24A3B' in 'where clause'")之错误解决
    查看>>
    pymysql.err.OperationalError: (1364, “Field ‘id‘ doesn‘t have a default value“)
    查看>>
    Pytorch Tensor 维度操作的形象理解 Tensor.unsqueeze() Tensor.squeeze()
    查看>>
    PyMySQL库对Mysql数据库进行增删改查与工具类封装
    查看>>
    pynput的基本介绍和使用
    查看>>
    pyodbc 通过 IIS7 连接到 MSSQL 2005 服务器
    查看>>
    PyPI 存储库中的 JarkaStealer:深入解析与防范措施
    查看>>
    Pyplot tutorial,Pyplot官方教程自翻译
    查看>>
    PyQ5学习笔记——使用内部槽函数关闭窗口
    查看>>
    PyQ5学习笔记——使用自定义槽函数关闭窗口
    查看>>
    PyQt MimeData 文件名
    查看>>
    PyQt QML Material Design 按钮背景不会改变
    查看>>