• 计算机操作系统:实验2 【银行家算法】


    计算机操作系统:实验2 【银行家算法】

    一、前言

    在上一期操作系统实验博客中我们学习了有关进程调度的知识,本学期的三个实验也是操作系统中比较经典的实验,本期我们将了解学习下一个经典实验——银行家算法

    二、实验目的

    银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。

    三、实验环境

    Turbo C 2.0/3.0或VC++6.0

    我所使用的编译器是:Embarcadero Dev-C++

    四、实验内容

    用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。

    五、实验说明

    实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。

    六、实验步骤

    1、 认真理解好课本中银行家算法的实例

    以下数据结构用于实现银行家算法:**“n”**是系统中的进程数, **“m”**是资源类型的数量。

    Available :

    • 它是一个大小为**“m”**的一维数组,表示每种类型的可用资源数量。
    • Available[ j ] = k 表示有**“k”个资源类型**R j的实例

    Max :

    • 它是一个大小为“ **n*m”**的二维数组,它定义了系统中每个进程的最大需求。
    • Max[ i, j ] = k 意味着进程P i最多可以请求资源类型R j的“k”个实例。

    Allocation :

    • 它是一个大小为**“n*m”**的二维数组,定义了当前分配给每个进程的每种类型的资源数量。
    • Allocation[ i, j ] = k 表示进程P i当前被分配了资源类型R j的“k”个实例

    Need :

    • 它是一个大小为**“n*m”**的二维数组,表示每个进程的剩余资源需求。
    • Need [ i, j ] = k 表示进程P i当前需要资源类型R j的“k”个实例
    • 需要 [ i, j ] = Max [ i, j ] – 分配 [ i, j ]

    分配i指定当前分配给进程 P i的资源,而需要i指定进程 P i仍可能请求以完成其任务的附加资源。银行家算法由安全算法和资源请求算法组成。

    安全算法
    找出系统是否处于安全状态的算法可以描述如下:

    (1)令 Work 和 Finish 分别为长度为 ‘m’ 和 ‘n’ 的向量。

    初始化:Work = Available

    Finish[i] = false; for i=1, 2, 3, 4….n

    (2)找到一个 i 满足

    Finish[i] = false

    Need i <= Work

    如果不存在这样的 i 转到步骤 (4)

    (3)Work = Work + Allocation[i]

    Finish[i] = true

    goto step (2)

    (4)如果 Finish [i] = true 对于所有的i

    那么系统处于安全状态

    资源请求算法
    设 Request i为进程 P i的请求数组。请求i [j] = k 意味着进程 P i想要资源类型 R j的 k 个实例。当进程 P i发出资源请求时,将采取以下动作:

    (1)如果Requesti <= Needi

    转到步骤 (2) ;否则,引发错误条件,因为该过程已超过其最大声明。

    (2)如果Requesti <= Available

    转到步骤 (3);否则,P i必须等待,因为资源不可用。

    (3)让系统假装已将请求的资源分配给进程 Pi,方法是修改状态

    例如:

    Available = Available – Requesti

    Allocationi= Allocationi + Requesti

    Needi = Needi– Requesti

    我们举个例子:

    具有五个进程 P 0到 P 4和类型 A、B、C 的三个资源的系统。资源类型 A 有 10 个实例,B 有 5 个实例,类型 C 有 7 个实例。假设在时间 t0资源分配情况如下图:

    在这里插入图片描述

    第一个问题:需求矩阵的内容是什么?

    Need [i, j] = Max [i, j] – Allocation [i, j]

    所以,Need Matrix的内容为:

    在这里插入图片描述

    第二个问题:系统是否处于安全状态?如果是,那么安全顺序是什么?

    在这里插入图片描述

    2、根据课本中银行家算法的描述,画出程序流程图

    在这里插入图片描述

    3、按照程序流程图,用C语言编程并实现

    #include 
    using namespace std;
    
    int main()
    {
    	// P0, P1, P2, P3, P4 are the Process names here
    
    int n, m, i, j, k;
    n = 5; // 进程数
    m = 3; // 资源数量
    int alloc[5][3] = { { 0, 1, 0 }, // P0 // 分配矩阵
    					{ 2, 0, 0 }, // P1
    					{ 3, 0, 2 }, // P2
    					{ 2, 1, 1 }, // P3
    					{ 0, 0, 2 } }; // P4
    
    int max[5][3] = { { 7, 5, 3 }, // P0 // 最大矩阵
    				{ 3, 2, 2 }, // P1
    				{ 9, 0, 2 }, // P2
    				{ 2, 2, 2 }, // P3
    				{ 4, 3, 3 } }; // P4
    
    int avail[3] = { 3, 3, 2 }; // 可用资源
    
    int f[n], ans[n], ind = 0;
    for (k = 0; k < n; k++) {
    	f[k] = 0;
    }
    int need[n][m];
    for (i = 0; i < n; i++) {
    	for (j = 0; j < m; j++)
    	need[i][j] = max[i][j] - alloc[i][j];
    }
    int y = 0;
    for (k = 0; k < 5; k++) {
    	for (i = 0; i < n; i++) {
    	if (f[i] == 0) {
    
    		int flag = 0;
    		for (j = 0; j < m; j++) {
    		if (need[i][j] > avail[j]){
    			flag = 1;
    			break;
    		}
    		}
    
    		if (flag == 0) {
    		ans[ind++] = i;
    		for (y = 0; y < m; y++)
    			avail[y] += alloc[i][y];
    		f[i] = 1;
    		}
    	}
    	}
    }
    
    int flag = 1;
    
    // 检查序列是否安全
    for(int i = 0;i";
    	cout << " P" << ans[n - 1] <
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    在这里插入图片描述

    七、最后我想说

    银行家算法是一种资源分配和死锁避免算法,也是操作系统中常考的一个知识点。

    以上内容网上有很多,不同的人有不同的看法,大家选自己喜欢的就行。

  • 相关阅读:
    sklearn处理离散变量的问题——以决策树为例
    NTP时间同步服务器设置
    css,sass,scss和less的区别
    JDK、JRE和JVM
    JAVA泛型实现原理
    开源数字基础设施 项目 -- Speckle
    学习Java的常用开发工具
    YOLO V1学习笔记
    java回调函数
    [含毕业设计论文+PPT+源码等]ssm装潢应用系统小程序+Java后台管理系统|前后分离VUE
  • 原文地址:https://blog.csdn.net/qq_52417436/article/details/127657903