计算机操作系统——银行家算法

本文通过介绍银行家算法的原理和实验,深入探讨如何避免操作系统中的死锁问题。实验涉及请求资源的合法性检查、安全性检查以及资源的试分配与恢复。通过银行家算法的模拟程序,读者可以了解如何判断系统的安全状态并实现资源的合理分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实验目的:

银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法。本实验通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。

2.实验内容:  
    
(1)模拟一个银行家算法:
  设置数据结构
  设计安全性算法
(2)初始化时让系统拥有一定的资源;
(3)用键盘输入的方式申请资源;
(4)如果预分配后,系统处于安全状态,则修改系统的资源分配情况;
(5)如果预分配后,系统处于不安全状态,则提示不能满足请求
3.算法思路:

先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。

若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。

若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。

4.主要数据结构
§ 可利用资源向量   int Available[m]   m为资源种类
§ 最大需求矩阵       int Max[n][m]     n为进程的数量
§ 分配矩阵               int Allocation[n][m]
§ 资源 矩阵       int need[i][j] = Max[i][j]- Allocation[i][j]
§ 申请资源数量       int Request [m]  
§ 工作向量               int Work[m]   int Finish[n] 
5.算法描述

1. 银行家算法bank()函数   

Requesti:进程Pi的请求向量。   0<=j<=m-1

      (1)若Requesti[j] ≤Need[i,j],转向(2),否则出错。

(2)若 Requesti[j] ≤Available[j],转向(3),否则等待。

      (3)系统试探着把资源分配给进程Pi,修改下面内容:

Available[j]= Available[j] – Requesti[j];

Allocation[i,j]= Allocation[i,j]+ Requesti[j];

Need[i,j]= Need[i,j]–Requesti[j];

   (4)试分配后,执行安全性算法,检查此次分配后系统是否处于安全状态。若安全,才正式分配;否则,此次试探性分配作废,进程Pi等待。

2. 安全性算法safe()函数

(1)初始化:设置两个向量Work(1×m)和Finish(1×n)

 Work– 系统可提供给进程继续运行所需各类资源数,初态赋值Available

Finish– 系统是否有足够资源分配给进程,初值false.

(2)从进程集合中满足下面条件进程:

Finish[i]= false;  Need[i,j]≤Work[j];

若找到,执行(3),否则,执行(4)。

(3)进程Pi获得资源,可顺利执行,完成释放所分配的资源。

Work[j]= Work[j]+Allocation[i,j];  Finish[i] = true;  go to (2).

(4)若所有进程Finish[i]= true,表示系统处于安全状态,否则处于不安全状态。

6.程序结构

程序共有以下五个部分:

§(1).初始化chushihua():输入进程数量、资源种类、资源可利用量、进程资源已分配量、进程最大需求量
§(2).当前安全性检查safe():用于判断当前状态安全。
§(3).银行家算法bank():进行银行家算法模拟实现的模块
§(4).显示当前状态show():显示当前资源分配详细情况
(5).主程序main():逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行。

程序:

#include<iostream>

#include<cstring>

 

#define False 0

#define True 1

 

using namespace std;

 

/********

主要数据结构

********/

int N=50;//进程的最大数

int M=100;//资源的最大数

char NAME[100]={0};//资源的名称

int Avaliable[100]={0};//可用资源矩阵

int Max[50][100]={0};//最大需求矩阵

intAllocation[50][100]={0};//系统已分配矩阵

int Need[50][100]={0};//还需要资源矩阵

int Request[100]={0};//请求资源向量

int Security[50]={0};//存放安全序列

int Work[100]={0};//存放系统可提供资源

int Finish[50]={0};

 

 

/********

初始化数据:输入进程数量、资源种类、

各种资源可利用数量、

各进程的资源已分配数量、

各进程对资源最大需求量等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值