操作系统实验四:多种资源的银行家算法

一、实验目的

(1)加深了解有关资源申请、避免死锁等概念。
(2)体会和了解银行家算法的具体实施方法。

二、实验原理与内容

(1) 实验内容:

银行家算法是一种最有代表性的避免死锁的算法。

在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,所谓安全状态, 是指进程能按某种进程次序( p1 , p2 , , , pn ) , 来为每个进程pi 分配其所需资源,直至满足进程pi 对资源的最需求量, 使每个进程pi 可顺利地完成, 则此时系统处于安全状态, 称序列( p1 , p2 , , , pn ) 为安全序列。 如果系统无法找到这样一个安全序列, 则称系统处于不安全状态.

最早由Dijkstra 提出了一种能够避免死锁的调度方法, 称为银行家法若分配不会导致系统进入不安全状态,则分配,否则等待。银行家算法的核心内容是判断资源试分配后系统是否处于安全状态, 即是否可以找到一个进程安全序列。

(2) 实验原理:

① 对于银行家算法的实现,需要知道三件事:
每个进程所能获取的每种资源数量是多少[MAX];
每个进程当前所分配到的每种资源的数量是多少[ALLOCATED];
系统当前可分配的每种的资源数量是多少[AVAILABLE];

② 只有当资源满足以下条件,资源才会被分配:
request<=max,也可设置错误条件,当进程所请求的资源超过最大的要求;
request <= available, 或者进程一直等直到资源可分配一些资源在实际的系统被跟踪,如:内存,信号量以及接口。

③ 银行家算法名字源于该算法实际上是用于确保银行系统不会用尽系统资源,因为当银行系统不再满足所有客户的需求,系统将不会分配钱(看作资源)给客户,银行必须确保对钱的请求不会导致银行系统处于不安全状态。如果上述情况不会发生,则该情况下请求是被允许的,否则,客户必须等到其他客户往银行存进足够银行分配的资金。

三、实验过程

(1) 设计过程:

① 资源:

设计了几个基本数据结构用于维护运行银行家算法:
n表示系统资源数量,m表示系统资源类型。则我们需要以下的数据结构:

Available: 长度为m的向量用来表示每种资源可分配的数量。如果available[j]=k, 资源类型为Rj可分配数量为k。
Max: n * m矩阵,定义,每个进程最大的资源需求。如果Max[i,j]=k. 表明Pi对类型为Rj资源的请求为k.
Allocation: n * m矩阵定义每个进程已分配到的每种资源的数量。如果Allocation[i,j] = k,进程Pi已分配到类型为Rj的资源数量为k。
Need: n * m 矩阵表明每个进程所需的资源数量,如果Need[i,j] = k, 进程Pi需要至少得到k数量的资源Rj,才能完成任务。

② 安全与不安全状态:

Ⅰ.设置两个向量:
a. 工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available;
b. Finish向量: 它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false; 当有足够资源分配给进程时, 再令Finish[i]=true。

Ⅱ.从进程集合中找到一个能满足下述条件的进程:
a. Finish[i]=false;
b. Need[i,j]≤Work[j];若找到,执行步骤(3),否则,执行步骤(4)。

Ⅲ.当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]=Work[i]+Allocation[i,j];
Finish[i]=true;
go to step 2;

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

③请求:
当系统收到对资源请求信号时,系统运行银行家算法判断允许请求是否安全。
1.该请求是否可以运行?
如果不允许,该请求则是不可行的,必须要么拒绝请求或插入到等待队列。
2.假设请求被允许,
3.是否安全?
如果安全,请求授予;
否则,要么拒绝或插入到等待队列。
不论系统拒绝请求或请求延迟或不安全请求都是系统的特殊决定。

(2)问题:

银行家算法运行时必须知道每个进程所能请求的资源。在大多数系统,该信息是不可知的,使的无法顺利运行银行家算法。而且也无法去假设进程数量是不变的,因为大多数的系统的进程数量是动态变化的。再者,对于正确的算法,进程会释放其全部的资源(当进程结束运行),然而对于实际中的系统则是不可行。为了资源的释放等上数小时甚至几天,通常是不可接受的。

(3)运行结果

运行结果如图1。可以观察到实现了多种资源的银行家算法。
多种资源银行家算法实现结果图
图1 多种资源银行家算法实现结果图

四、实验总结

编写银行家算法需要较好分析能力,C语言也要掌握的很好,而且需要细心和耐心。

我的程序在最开始写出来的第一份代码编译时大大小小一堆错误,有些是一个小错误导致了下面全错,这些小错误在一百多行里找起来非常费劲。然后小错误全部找出来以后,再编译,错误没有了,但是得到的结果却是错误的,这样又要根据运行结果和代码结合一行行分析,看是哪里出了问题。

到最后得到了想要的结果以后,程序还需要修饰,至少要输出要简洁明朗,要让别人运行这个程序时知道自己在什么时候该输入什么数据,数据是什么作用,而不是只有自己知道输进去的是什么东西。
五、代码源码

#include<stdio.h>
#define MAXPROCESS 100                        //最大进程数
#define MAXRESOURCE 100                       //最大资源数
int available[MAXRESOURCE];                   //可利用资源向量
int max[MAXPROCESS][MAXRESOURCE];            //最大需求矩阵
int allocation[MAXPROCESS][MAXRESOURCE];    //分配矩阵
int need[MAXPROCESS][MAXRESOURCE];            //需求矩阵
int request[MAXPROCESS][MAXRESOURCE];        //进程需要资源数
bool finish[MAXPROCESS];                        //表示系统是否有足够的资源分配给进程(标记) 
int p[MAXPROCESS];                             //记录序列
int m, n;                                    //n个进程,m个资源
int i, j;                                 
int pid;

void Init();   //初始化 
bool Safe();
void Bank();

int main(){
   
	Init();
	Bank();
}

void Init(){
   
	printf("请输入进程数:");
	scanf("%d", &n);
	printf("请输入资源种类数:");
	scanf("%d", &m);
	printf("请输入各种资源分别拥有的最大数量:");</
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值