操作系统:银行家算法

文章目录

  • 银行家算法
    • 一、实验目的
    • 二、实验要求与内容、过程与结果
  • 系列文章

银行家算法

一、实验目的

1、理解银行家算法。
2、掌握进程安全性检查的方法及资源分配方法。

二、实验要求与内容、过程与结果

1、将图5-1补充完整,画出银行家算法的流程图。

1
图5-1 银行家算法的流程图

2、将图5-2补充完整,画出安全性检查算法的流程图。

2
图5-2 安全性检查算法的流程图

3、编写补充完整模拟银行家算法程序sy-5.cpp,并以下面给出的例子来验证编写程序的正确性。要求记录程序运行过程和结果。

例子:某系统有A、B、C、D 4类资源共5个进程(P0,P1,P2,P3、P4)共享,各进程对资源的需求的分配情况如表5-1所示。

3

现在系统中A、B、C、D 4类资源分别还剩下1、5、2、0个,请按银行家算法回答下列问题:

① 现在系统是否处于安全状态?
答:系统当前处于安全状态,安全序列为:0->2->3->4->1。

② 如果现在进程P1提出资源请求(0、4、2、0),系统能否满足它的请求?
答:能满足。

模拟银行家算法程序sy-5.cpp:

#include <iostream>
using namespace std;
int Available[100];   //可利用资源数组
int Max[50][100];   //最大需求矩阵
int Allocation[50][100];   //分配矩阵
int Need[50][100];      //需求矩阵
int Request[50][100];
int Finish[50];
int p[50];
int m,n;        //m个进程,n个资源

int IsSafe( )   //系统安全性检查
{
int i,j,L=0;
int Isfind=1;
    int Work[100];
    for(i=0; i<n; i++)
           Work[i] = Available[i]    ; //建立Available副本Work,即对Work初始化
    for(i=0; i<m; i++)
            Finish[i] = 0        ;         // 对Finish进行初始化
    
    while(L<m&&Isfind)
    {
        Isfind=0;
for(i=0; i<m; i++)
    	{
        	if (Finish[i]==1) continue;   
        	else
        	{
           		 for(j=0; j<n; j++)
               		 if(Need[i][j]>Work[j]) break;
            if(j==n)     
            {
                Finish[i]=    1    ;       //表示进程i能结束
                for(int k=0; k<n; k++)
                      Work[k] += Allocation[i][k] ; //进程i能结束,释放资源
                p[L++]=i;
				Isfind=1;
                if(L==m)
                    break;
             }
        }
    	}
    }
    if (     L == m   )   //判定是否存在安全系列。提示:判定L与m值的关系
    {
        cout<<"系统是安全的!"<<"安全系列是:"<<endl;
        for(i=0; i<m; i++)
        {
            cout<<p[i];
            if(i<m-1) cout<<"-->";
        }
        cout<<endl;
        return 1;
    }
    else
    {
        cout<<"系统处于不安全状态!";
        return 0;
    }
}

int main()
{
    int i,j,mi,flag=1;
    cout<<"输入进程数目:\n";
    cin>>m;
    cout<<"输入资源的种类数:\n";
    cin>>n;
    cout<<"输入每个进程最多所需要的各资源数,按照"<<m<<"×"<<n<<"矩阵输入!\n";
    for(i=0; i<m; i++)
        for (j=0; j<n; j++)
            cin>>Max[i][j];
    cout<<"输入每个进程已分配的各资源数,也按照"<<m<<"×"<<n<<"矩阵输入!\n";
    for(i=0; i<m; i++)
    {
        for (j=0; j<n; j++)
        {
            cin>>Allocation[i][j];
            Need[i][j]=Max[i][j]-Allocation[i][j];
            if (Need[i][j]<0)
            {
  cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入!\n";
                j--;
                continue;
            }
        }
    }
    cout<<"请输入各个资源现有的数目:\n";
    for(i=0; i<n; i++)
        cin>>Available[i];
    if(IsSafe()!=1)  
        return 0;
    while(1)
    {
        flag=1;
        cout<<"输入要申请资源的进程号(第一个进程号为0,以此类推):\n";
        cin>>mi;
        cout<<"输入该进程所请求各资源的数量:\n";
        for(i=0; i<n; i++)
            cin>>Request[mi][i];
        for(i=0; i<n&&flag; i++)
        {
            if (   Need[mi][i]<Request[mi][i]       )   
            {
               cout <<"进程P"<<mi<<"的资源请求数超过进程的需求量,拒绝分配!\n";
                flag=0;
                break;
            }
            if (    Available[i]<Request[mi][i]     )
            {
             cout <<"进程P"<<mi<<"的请求数超过了系统所可用的资源数,拒绝分配!\n";
                flag=0;
                break;
            }
        }
        if(flag)
        {
            for(i=0; i<n; i++) //试探分配资源给进程mi
            {
                Available[i]-=    Request[mi][i]       ;
                Allocation[mi][i]+=Request[mi][i];
                Need[mi][i]-=   Request[mi][i]        ;
            }
            if (    IsSafe() == 1     ) cout<<"同意分配请求!\n" ;  // 提示:调用安全性检测函数
            else
            {
                cout<<"资源分配请求被拒绝!\n";
                for(i=0; i<n; i++) //恢复进程mi以前的资源分配状态
                {
                    Available[i]+=Request[mi][i];
                    Allocation[mi][i]-=   Request[mi][i]    ;
                    Need[mi][i]+=Request[mi][i];
                }
            }
        }
        for(i=0; i<m; i++)
            Finish[i]=0;
        char YesNo;

        while(1)
        {
            cout<<"继续请求资源分配请按 y或Y ,结束程序请按 n或N :";
            cin>>YesNo;
            cout<<endl;
            if (YesNo=='y'||YesNo=='Y') break;
            else if (YesNo=='n'||YesNo=='N') return 0;

        }
    }
}

本程序是一个简单的银行家算法实现,可以模拟对多进程的资源分配管理。

程序功能:

1.输入进程数目和资源种类数目; 2.输入每个进程最多需要的各资源的数量和已经分配的各资源的数量,计算出每个进程还需要的各个资源数量; 3.输入各个资源当前可用的数量; 4.进行系统安全性检查,判断系统是否处于安全状态; 5.根据用户输入,模拟对进程的资源请求分配; 6.如果分配后系统仍然处于安全状态,同意分配请求,否则拒绝分配请求; 7.根据用户输入,判断是否退出程序。

程序结构:

程序主体部分由主函数实现,包含了系统安全性检查函数IsSafe()和分配资源请求的处理部分。

主要变量:

1.Available[]:可用资源数组,记录每个资源当前可用的数量。 2.Max[][]:进程最多需要各资源的的数量。 3.Allocation[][]:各进程已分配的各资源数量。 4.Need[][]:各进程还需要的各资源数量。 5.Request[][]:进程的资源请求。 6.Finish[]:标记进程是否执行完毕。 7.p[]:存储安全序列。

程序运行流程:

1.用户输入进程数目和资源种类数目; 2.用户输入每个进程最多需要的各资源的数量和已经分配的各资源的数量,计算出每个进程还需要的各个资源数量; 3.用户输入各个资源当前可用的数量; 4.调用IsSafe()函数,判断系统是否处于安全状态; 5.用户输入资源分配请求,根据银行家算法进行资源分配请求处理; 6.如果处理后系统处于安全状态,输出同意分配请求信息,否则输出拒绝分配请求信息; 7.询问用户是否继续,并根据用户输入继续或结束程序。

程序分析:

银行家算法能保证系统安全性,即能够防止死锁和饥饿的情况发生。因此,在本程序中,系统安全性检查是必不可少的。IsSafe()函数的具体实现过程为:

1.将Available数组复制到Work数组中; 2.将所有进程的Finish数组置为0; 3.在未处理完所有进程的情况下,遍历所有进程,寻找可以结束的进程(即进程的Need数组小于等于Work数组); 4.如果找到可以结束的进程,将该进程标记为已结束(Finish数组置为1),将该进程所占用的资源释放(即Work数组增加Allocation数组中该进程所占用的资源数量),将该进程的进程号存储到安全序列p[]数组中,此时需要重新遍历所有进程; 5.如果无法找到可以结束的进程,则说明系统不安全。

程序中分配资源请求的处理部分的具体实现过程为:

1.用户输入进程号和资源请求数量; 2.判断资源请求是否超过进程的需求量,如果超过则拒绝分配请求并进行下一次请求; 3.判断资源请求是否超过系统可用资源数量,如果超过则拒绝分配请求并进行下一次请求; 4.对进程进行试探性分配,如果分配后系统处于安全状态,则同意分配请求,否则拒绝分配请求,将资源分配状态恢复到进程请求前的状态; 5.询问用户是否继续进行资源请求分配,并根据用户输入决定是否继续。

系列文章

实验目录直达链接
实验一Linux初步https://want595.blog.csdn.net/article/details/133145097
实验二进程的控制和通信(Windows2000)https://want595.blog.csdn.net/article/details/133903234
实验三线程同步和调度https://want595.blog.csdn.net/article/details/133903419
实验四单处理机调度https://want595.blog.csdn.net/article/details/133903537
实验五银行家算法https://want595.blog.csdn.net/article/details/133903623
实验六虚拟存储管理技术https://want595.blog.csdn.net/article/details/133903701

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/119063.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web —— html

Web —— css基础 1. HTML2. 基本HTML结构3. HTML常用标签3.1 文本相关标签3.2 HTML图像标签3.3 HTML超链接标签3.4 HTML表&#xff0c;单3.4.1 HTML表格3.4.2 HTML表单&#xff0c;输入框&#xff08;多选框&#xff0c;单选框&#xff09;下拉框 3.5 HTML分区标签3.5.1 div标…

k8s-----数据存储

目录 一、数据存储的概念 二、基本存储 1、EmptyDir存储卷 2、hostPath存储卷 3、nfs共享存储卷 三、高级存储 1、PV&#xff08;持久化卷&#xff09; 2、PVC&#xff08;持久化卷声明&#xff09; 3、静态PV实验 4、动态PV实验 4.1 在stor01节点上安装nfs&#xf…

肩颈筋膜炎怎么治疗才能彻底除根

肌筋膜炎是肩背部肩胛骨内侧某一点的疼痛&#xff0c;同时可以放射到同侧的肩部以及上肢的疼痛&#xff0c;肩关节活动的受限以及同侧肢体麻木&#xff0c;无力的症状。 在肩关节劳累或者在着凉时可以诱发&#xff0c;主要表现为肩后背部明显疼痛&#xff0c;肩关节抬举以及向各…

华为李鹏:到 2025 年智能算力需求将达到目前水平的 100 倍

在第十四届全球移动宽带论坛上&#xff0c;华为高级副总裁、运营商 BG 总裁李鹏表示&#xff0c;大模型为代表的 AI 应用发展带来对智能算力的爆发式需求。 李鹏在题为《加速 5G 商业正循环&#xff0c;拥抱更繁荣的 5.5G》的讲话中表示&#xff0c;「5G 已经走在商业成功的正确…

度假胜地:色彩、曲线与艺术之家

葡萄牙&#xff0c;这里的建筑风格是非常独特的&#xff0c;而不是当地传统的白色房屋&#xff0c;充满了粉红和蓝色的色彩&#xff0c;以及一些印度和巴西的灵感。 在当地&#xff0c;有一座混凝土建筑&#xff0c;它建在通往大海的道路上&#xff0c;建筑的设计理念使其更适合…

volatile-日常使用场景

6.4 如何正确使用volatile 单一赋值可以&#xff0c;但是含复合运算赋值不可以&#xff08;i之类的&#xff09; volatile int a 10; volatile boolean flag true; 状态标志&#xff0c;判断业务是否结束 作为一个布尔状态标志&#xff0c;用于指示发生了一个重要的一次…

el-checkbox-group的全选与反选

需求如下&#xff1a; 思路&#xff1a;在点击全部时按钮组双向绑定赋值全部值&#xff0c;点击按钮组内按钮计算选中按钮数量与按钮组数量对比&#xff0c;判定是否选中全部 代码如下&#xff1a; <template><div><el-checkbox-button v-model"checkall…

golang工程中间件——redis常用结构及应用(string, hash, list)

Redis 命令中心 【golang工程中间件——redisxxxxx】这些篇文章专门以应用为主&#xff0c;原理性的后续博主复习到的时候再详细阐述 string结构以及应用 字符数组&#xff0c;redis字符串是二进制安全字符串&#xff0c;可以存储图片等二进制数据&#xff0c;同时也可以存…

Spark 新特性+核心回顾

Spark 新特性核心 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 1. 掌握Spark的Shuffle流程 1.1 Spark Shuffle Map和Reduce 在Shuffle过程中&#xff0c;提供数据的称之为Map端&#xff08;Shuffle Write&#xff09;接收数据的称之为Reduce端&#xff08;Sh…

10 索引优化与查询优化

文章目录 索引失效案例关联查询优化对于左外连接对于内连接JOIN语句原理简单嵌套循环连接SNLJ索引嵌套循环连接INLJ块嵌套循环连接BNLJHash Join 子查询优化排序优化filesort算法&#xff1a;双路排序和单路排序 分组优化分页优化优先考虑覆盖索引索引下推ICP使用条件 其他查询…

Python语言高级实战-内置函数super()的使用之类的多继承(附源码和实现效果)

实现功能 super()函数的调用顺序是按照方法解析顺序&#xff08;Method Resolution Order, MRO&#xff09;来确定的。MRO 是一个确定继承顺序的算法&#xff0c;它使用 C3 线性化算法来避免潜在的方法冲突。Python会根据继承顺序自动计算 MRO&#xff0c;我们只需要使用 supe…

c语言从入门到实战——操作符详解

操作符详解 前言1. 操作符的分类2. 二进制和进制转换2.1 2进制转10进制2.1.1 10进制转2进制数字 2.2 2进制转8进制和16进制2.2.1 2进制转8进制2.2.2 2进制转16进制 3. 原码、反码、补码4. 移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&#xff1a;&、|、^、~6. 单目…

力扣 138. 随机链表的复制

题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的…

伦敦金开户需要多少资金,有开户条件吗?

伦敦金&#xff08;London Gold&#xff09;是黄金市场中备受瞩目的投资种类之一&#xff0c;无论是专业投资者还是新手&#xff0c;都对伦敦金感兴趣。但关于开户需要多少资金&#xff0c;以及是否有特定的开户条件&#xff0c;这些问题可能会让一些新手投资者感到困惑。 首先…

GPT-4V:AI在医疗领域的应用

OpenAI最新发布的GPT-4V模型为ChatGPT增添了语音和图像功能&#xff0c;为用户提供了更多在日常生活中使用ChatGPT的方式。这次更新将为用户带来更加便捷、直观的交互体验&#xff0c;用户可以直接通过拍照上传图片&#xff0c;并提出相关问题。OpenAI的最终目标是构建一个安全…

云服务器哪家便宜靠谱 | 简单了解亚马逊云科技发展史

云服务器哪家便宜又靠谱呢&#xff1f;为什么说亚马逊云科技在这道题答案的第一行&#xff0c;一篇故事告诉你。 1994年&#xff0c;杰夫贝索斯在西雅图创建了亚马逊&#xff0c;最初只是一个在线书店。 1997年&#xff0c;亚马逊在纳斯达克交易所上市&#xff0c;成为一家公…

大模型的实践应用5-百川大模型(Baichuan-13B)的模型搭建与模型代码详细介绍,以及快速使用方法

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用5-百川大模型(Baichuan-13B)的模型搭建与模型代码详细介绍,以及快速使用方法。 Baichuan-13B 是由百川智能继 Baichuan-7B 之后开发的包含 130 亿参数的开源可商用的大规模语言模型,在权威的中文和英文 benchmark 上均…

SVG循环滑动效果

1.循环滑动图&#xff08;4张) 效果图 svg滑块视频 代码&#xff1a;&#xff08;如果要调整整体的速度和时间请对begin“1s” dur"12s"属性进行编辑&#xff09; <section style"margin: 0px auto;display: block;width: 100%;" data-mpa-powered-by…

一文深入搞懂ARM处理器架构

1、嵌入式处理器基础 典型的微处理器由控制单元、程序计数器&#xff08;PC&#xff09;、指令寄存器&#xff08;IR&#xff09;、数据通道、存储器等组成 。 指令执行过程一般分为&#xff1a; 取指&#xff1a; 从存储器中获得下一条执行的指令读入指令寄存器&#xff1…

PTA 编程题(C语言)-- 连续因子

题目标题&#xff1a; 连续因子 题目作者 陈越 浙江大学 一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3567&#xff0c;其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N&#xff0c;要求编写程序求出最长连续因子的个数&#xff0c…