实验六 银行家算法的模拟与实现

2024-03-27 08:38

本文主要是介绍实验六 银行家算法的模拟与实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、实验目的

(1) 进一步了解进程的并发执行。
(2) 加强对进程死锁的理解,理解安全状态与不安全状态的概念。
(3) 掌握使用银行家算法避免死锁问题。

2、实验基本知识及原理

(1)基本概念
死锁:多个进程在执行过程中,因为竞争资源会造成相互等待的局面。如果没有外力作用,这
些进程将永远无法向前推进。此时称系统处于死锁状态或者系统产生了死锁。
安全序列:系统按某种顺序并发进程,并使它们都能达到获得最大资源而顺序完成的序列为安
全序列。
安全状态:能找到安全序列的状态称为安全状态,安全状态不会导致死锁。
不安全状态:在当前状态下不存在安全序列,则系统处于不安全状态。
(2)银行家算法
银行家算法顾名思义是来源于银行的借贷业务,一定数量的本金要满足多个客户的借贷周转,
为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须
保证得到的资源的进程能在有限的时间内归还资源,以供其它进程使用资源。如果资源分配不当,
就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
当一进程提出资源申请时,银行家算法执行下列步骤以决定是否向其分配资源:
1)检查该进程所需要的资源是否已超过它所宣布的最大值。
2)检查系统当前是否有足够资源满足该进程的请求。
3)系统试探着将资源分配给该进程,得到一个新状态。
4)执行安全性算法,若该新状态是安全的,则分配完成;若新状态是不安全的,则恢复原状
态,阻塞该进程。

3、实验内容

本实验的内容是要通过编写和调试一个模拟系统动态分配资源的银行家算法程序,有效地避免
死锁发生。具体要求如下:
(1) 初始化时让系统拥有一定的资源;
(2) 用键盘输入的方式允许进程动态申请资源;
(3) 如果试探分配后系统处于安全状态,则修改系统的资源分配情况,正式分配资源;
(4) 如果试探分配后系统处于不安全状态,则提示不能满足请求,恢复原状态并阻塞该进程

代码实现:

/*
2021-12-17
操作系统课程设计
@浩茫*/
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;//进程数
int m; //资源数量int Claim[10][10]; //最大需求矩阵
int Resource[10]; //资源总量
int Allocation[10][10]; //分配矩阵
int Need[10][10];   //需求矩阵
int Available[10]; //可用资源向量
int Request[10];   //请求向量当前进程对各类资源的申请量
int secuer_path[10];void Input()
{int i,j;cout<<"资源总量Available:\n";for(i=0; i<m; i++){cin>>Resource[i];}cout<<"最大需求矩阵Claim:\n";for(i=0; i<n; i++){for(j=0; j<m; j++){cin>>Claim[i][j];}}cout<<"分配矩阵Allocation:\n";for(i=0; i<n; i++){for(j=0; j<m; j++){cin>>Allocation[i][j];}}//需求矩阵=C-Afor(i=0; i<n; i++){for(j=0; j<m; j++){Need[i][j]=Claim[i][j]-Allocation[i][j];}}//初始化:当前可用资源数=总资源数for(i=0; i<m; i++){Available[i]=Resource[i];}//当前可用资源数= 总资源数-已分配资源数for(i=0; i<n; i++){for(j=0; j<m; j++){Available[j]=Available[j]-Allocation[i][j];}}}//比较进程为a中的元素全大于b中的元素返回1,否则返回0
int compare(int a[],int b[])
{int i;for(i=0; i<m; i++){if(a[i]<b[i]){return 0;}}return 1;
}bool test()
{int i,j,k,l;int  program_finished=0;//可以完成运行的进程数量bool flag=0;bool finish[n];int work[m];int x=0;for(i=0; i<n; i++){finish[i]=0;//初始状态都没完成运行}for(i=0; i<m; i++){work[i]=Available[i];}while(program_finished!=n){//进行一轮检查bool flag=false;//for(i=0; i<n; i++) //每一轮至少要加入一个进程,否则就是不安全状态{if(finish[i]==true){continue;}else{if(compare(work,Need[i]))//Available>=Need{finish[i]=true;program_finished++;flag=true;//更新每种资源数量for (j = 0; j <m; j++){work[j] = work[j] +Allocation[i][j];}}elsecontinue;}}if(flag==false){return false;}}for(i=0; i<n; i++){if(finish[i]==0){return false;//不存在安全序列}}return true;//存在安全序列
}
//申请进程后的安全性检验函数
int  secuer_test(int num)
{int i,j;//n=n-1;if(compare(Available,Request)&&compare(Need[num-1],Request))//Available>=Request 并且 Need >=Request{for(j=0; j<m; j++){Allocation[num-1][j]=Allocation[num-1][j]+Request[j];Need[num-1][j]=Need[num-1][j]-Request[j];Available[j]=Available[j]-Request[j];}if(test()){return 1;}else{//撤销资源分配for(j=0; j<m; j++){Allocation[num-1][j]=Allocation[num-1][j]-Request[j];Need[num-1][j]=Need[num-1][j]+Request[j];Available[j]=Available[j]+Request[j];}return 0;}}else{return -1;}}
void show_current()
{int i =0;int j=0;cout<<"         claim      Allocation    Need ";for(i=0; i<n; i++){cout<<"\n进程"<<i+1<<"    ";for(j=0; j<m; j++){cout<<" "<<Claim[i][j];}cout<<"     ";for(j=0; j<m; j++){cout<<" "<<Allocation[i][j];}cout<<"       ";for(j=0; j<m; j++){cout<<" "<<Need[i][j];}cout<<"     ";}cout<<"\n当前剩余资源数量:";for(i=0; i<m; i++){cout<<" "<<Available[i];}cout<<endl;}
int main()
{int i,p;int num;cout<<"进程数:";cin>>n;cout<<"资源种类数:";cin>>m;Input();//初始化if(test()){cout<<"\n存在安全序列,初始状态安全\n\n";show_current();cout<<"\n\n";}else{cout<<"不存在安全序列,初始状态不安全\n";return 0;}while(true){cout<<"输入发出请求Request的进程编号:";cin>>num;cout<<"输入请求的资源数:";for(i=0; i<m; i++){cin>>Request[i];}switch(secuer_test(num)){case 1:cout<<"系统处于安全状态,资源分配成功\n";show_current();break;case 0:cout<<"系统进入不安全状态,资源分配失败,进程阻塞\n";return 0 ;case -1:cout<<"申请资源量不合法,重新输入\n";}}return 0;
}

这篇关于实验六 银行家算法的模拟与实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851539

相关文章

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti