操作系统实验---银行家算法(数据随机生成)

本文旨在介绍操作系统中的银行家算法,通过模拟程序避免死锁的发生。实验目标包括理解安全状态与不安全状态,以及银行家算法的原理和应用。通过对资源的动态分配和安全序列的检测,确保系统不会陷入死锁,同时提供了算法流程图、相关数据结构和函数的解释,以及实验代码的编写和运行结果展示。
摘要由CSDN通过智能技术生成

一、 实验目的
1、了解什么是操作系统安全状态和不安全状态;
2、了解如何避免系统死锁;
3、理解银行家算法是一种最有代表性的避免死锁的算法,掌握其实现原理及实现过程。

二、 实验内容
根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效避免死锁的发生。

三、 实验原理
进程申请资源时,系统通过一定的算法判断本次申请是否不可能产生死锁(处于安全状态)。若可能产生死锁(处于不安全状态),则暂不进行本次资源分配,以避免死锁。算法有著名的银行家算法。
1、什么是系统的安全状态和不安全状态?
所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直至最大需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。
如果不存在这样的安全序列,则称系统处于不安全状态。
2、银行家算法
把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金。

操作系统按照银行家制定的规则设计的银行家算法为:
(1)进程首次申请资源的分配:如果系统现存资源可以满足该进程的最大需求量,则按当前的申请量分配资源,否则推迟分配。
(2)进程在执行中继续申请资源的分配:若该进程已占用的资源与本次申请的资源之和不超过对资源的最大需求量,且现存资源能满足该进程尚需的最大资源量,则按当前申请量分配资源,否则推迟分配。
(3)至少一个进程能完成:在任何时刻保证至少有一个进程能得到所需的全部资源而执行到结束。
银行家算法通过动态地检测系统中资源分配情况和进程对资源的需求情况来决定如何分配资源,并能在确保系统处于安全状态时才把资源分配给申请者,从而避免系统发生死锁。

四.算法流程图

在这里插入图片描述
在这里插入图片描述

五.实验用到的数据结构及函数
数据结构:
n:进程数,随机生成若干个个进程(为了便于观察,限制随机在3-6个);
m:资源总类数随机生成(同样为了方便观察,限制在3-6个);
char NAME[n] :各个资源的名称,手动输入
Max[n][m]:每个进程每种资源的最大需求量,随机赋值
allocation[n][m]:每个进程每种资源已经分配的资源量,随机赋值
need[n][m]:每个进程每种资源还需要请求的总量,由max和allocation算出
Request[n][m]:每个进程每种资源的请求量,随机生成
Work[m]:工作向量,即可向正在运行的进程分配的资源量
bool Finish[n]:进程是否执行结束
available[m]:可利用资源向量,随机赋值
security[n]:安全监测记录进程完成的顺序

函数:
Init():初始化,随机生成资源总数及各个资源初始数量,以及随机生成进程总数和各个进程的最大资源需求量和以及分配的各资源量
showdata():输出当前各个进程的资源情况
printspace():空格输出,在showdata输出数据时使用,为了界面美观
Safe():判断系统是否处于安全状态
Test(int i):尝试给进程i分配资源
Retest(int i):与test相反,还原分配前的资源情况
Banker():银行家算法核心部分

六:银行家算法代码

因为我是在vs上编写的程序再拿到linux虚拟机那边去运行的,所以主体采用的是c++编写,输出上为了方便有些地方使用了c的输出;所以保存的是cpp文件,到虚拟机那边编译时指令用g++(.c文件编译用gcc);

#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#include<stdbool.h>
#include<iostream>
#include<iomanip>
using namespace std;
char NAME[100] = {
    0 };//资源的名称
int MAX[100][100] = {
    0 };//最大需求矩阵
int Allocation[100][100] = {
    0 };//系统已分配矩阵
int need[100][100] = {
    0 };//还需要资源矩阵
int Available[100] = {
    0 };//可用资源矩阵
int request[100] = {
    0 };//请求资源向量
int work[100] = {
    0 };//存放系统可提供资源量
bool finish[100] = {
    false };//标记系统是否有足够的资源分配给各个进程
int security[100] = {
    0 };//存放安全序列

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

/********初始化数据:随机生成进程数量、资源种类、各种资源可利用数量、
各进程对资源最大需求量、各进程的资源已分配数量等。********/

void init() {
   
	int i, j, n, m;
	char name;
	bool flag;
	srand((unsigned)time(NULL));
	m = rand() % 4 + 3;
	M = m;
	printf("随机生成资源总数为:%d\n", m);
	printf("请输入各个资源的名称:\n");
	for (i = 0; i < m; i++) {
   
		printf("请输入资源%d的名称: ", i);
		cin >> name;
		NAME[i] = name;
		int number;
		number = rand() <
  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
5 银行家算法实现 5.1 实验类型 设计型(4学时)。 5.2 实验目的 1) 理解死锁避免相关内容; 2) 掌握银行家算法主要流程; 3) 掌握安全性检查流程。 5.3 实验描述 本实验主要对操作系统中的死锁预防部分的理论进行实验。要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。 5.4 实验内容 1) 设计多个资源(≥3); 2) 设计多个进程(≥3); 3) 设计银行家算法相关的数据结构; 4) 动态进行资源申请、分配、安全性检测并给出分配结果。 5.5 实验要求 1) 编写程序完成实验内容; 2) 画出安全性检测函数流程图; 3) 撰写实验报告。 5.6 测试要求 1) 进行Request请求,输入参数为进程号、资源号和资源数; 2) 进行3次以上的Request请求; 3) 至少进行1次资源数目少于可用资源数,但不安全的请求。 5.7 相关知识 5.7.1 银行家算法数据结构 1) 可利用资源向量Available。其中每个元素代表每类资源的数目。 2) 最大需求矩阵Max。其中每个元素代表每个进程对于每类资源的最大需求量。Max[i,j]=K表示i进程对于j类资源的最大需求量为K。 3) 分配矩阵Allocation。其中每个元素代表每个进程已得到的每类资源的数目。 4) 需求矩阵Need。其中每个元素代表每个进程还需要的每类资源的数目。 5.7.2 银行家算法 Request i [j]=K表示进程Pi需要K个j类资源。 1) 如果Request i [j]≤Need[i , j],便转向步骤2,否则认为出错。 2) 如果Request i [j]≤Available[j],便转向步骤3,否则表示无足够资源,Pi需等待; 3) 系统尝试分配资源给Pi; 4) 系统进行安全性检查,检查此次资源分配后,系统是否安全。如果安全,则正式分配资源,否则撤销此次分配。 5.7.3 安全性算法 1) 设置两个向量:工作向量Work和Finish。算法开始时Work=Available;Finish表示系统是否有足够的资源分配给进程,使之运行完成,开始时,令Finish[i]=False;如果有足够的资源分配给进程,则令Finish[i]=True。 2) 从进程集合中找到一个能满足下列条件的进程:Finish[i]=False;Need[i,j] ≤ Work[j],若找到,执行步骤3),否则,执行步骤4); 3) Pi获得所需资源后,可顺利执行指导完成,并释放它占有的资源。并执行: Work[j]=Work[j]+Allocation[i , j]; Finish[i] = True; 到第2)步。 4) 直到所有Finish[i]=True,表示系统处于安全状态;否则系统处于不安全状态。 5.8 实验设备 PC机1台,要求安装DOS7.1、Turbo C3.0、Windows2000。 5.9 实验成绩评定 实验成绩评定方式包含实验报告成绩、实验过程成绩两个部分,其中实验过程成绩占60%、实验报告成绩占40%,如果其中任何一个部分成绩不及格,则总成绩按不及格处理。 5.10 实验报告 按照实验目的、实验内容、实验要求、实验设备、测试等部分进行组织。 5.11 实验思考 1) 针对死锁有哪些可行方案? 2) 死锁解除的难点是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值