admin 管理员组

文章数量: 887017

实验目的

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

实验内容

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

实验原理

进程申请资源时,系统通过一定的算法判断本次申请是否不可能产生死锁(处于安全状态)。若可能产生死锁(处于不安全状态),则暂不进行本次资源分配,以避免死锁。算法有著名的银行家算法。

  1. 什么是系统的安全状态和不安全状态?
    所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直至最大需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。
    如果不存在这样的安全序列,则称系统处于不安全状态。

  2. 银行家算法
    把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

  3. 为保证资金的安全,银行家规定:
    (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
    (2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
    (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
    (4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金。

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

实验要求

  1. 画出银行家算法流程图;
  2. 对算法所用的数据结构进行说明;
  3. 测试数据随机产生。不可手工输入;
  4. 编写程序并调试;
  5. 多次测试程序,截屏输出实验结果;
  6. 根据实验结果与理论课讲述的原理进行实验分析。

实验步骤

  1. 画出银行家算法流程图;
  2. 对算法所用的数据结构进行说明;
// 进程总数
#define PROCESS 20 

// 资源种类
#define KIND_OF_RESOURCES 10

// 每类资源总数
#define NUMBER_OF_RESOURCES 10

// 系统当前每类资源总数
int resources[KIND_OF_RESOURCES];

// 每个进程的每类资源最大需求
int max[PROCESS][KIND_OF_RESOURCES];

// 每个进程已分配的每类资源
int allocated[PROCESS][KIND_OF_RESOURCES];

// 每个进程需要的每类资源
int need[PROCESS][KIND_OF_RESOURCES];

// 初始化数据
void Init()

// 检查分配给进程p,系统是否安全
bool IsSafe(int p)

// 分配资源
int Distribution()
  1. 测试数据随机产生。不可手工输入;
    (1) 实验过程中使用的系统资源总类、每类资源初始值是固定的均为10;
    (2) 系统当前申请资源的进程总数为分别为10,15,20,25,30;
    (3) 每个进程的每类资源最大需求量在0-10内由随机数产生;
    (4) 每个进程的每类资源已经分配的资源数由随机数产生,并且与系统当前剩余资源和每类资源最大需求量相关。

  2. 编写程序并调试;

// banker's algorithm.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <list>
#include <iomanip>
using namespace std;


// 进程总数
#define PROCESS 30  

// 资源种类
#define KIND_OF_RESOURCES 10

// 每类资源总数
#define NUMBER_OF_RESOURCES 10

// 系统当前每类资源总数
int resources[KIND_OF_RESOURCES];

// 每个进程的每类资源最大需求
int max[PROCESS][KIND_OF_RESOURCES];

// 每个进程已分配的每类资源 
int allocated[PROCESS][KIND_OF_RESOURCES];

// 每个进程需要的每类资源
int need[PROCESS][KIND_OF_RESOURCES];

// 初始化数据
void Init()
{
   
	srand((unsigned)time(0));
	
	cout << "系统每类资源初始化为:"

本文标签: 银行家 算法 操作系统