【操作系统】银行家算法

【实验目的】

①理解银行家算法。

②掌握进程安全性检查的方法及资源分配的方法。

 【实验内容】

编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。

例4-1某系统有A、B、C、D4类资源共5个进程(PO、P1、P2、P3、P4)共享,

各进程对资源的需求和分配情况如表4-1所示。

表4-1各进程对资源的需求和分配情况表

 

进程

已占资源

最大需求数

A

B

C

D

A

B

C

D

P0

0

0

1

2

0

0

1

2

P1

1

0

0

0

1

7

5

0

P2

1

1

5

4

2

3

5

6

P3

0

6

3

2

0

6

5

2

P4

0

0

1

1

0

6

5

6

现在系统中A、B、C、D4类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:

①现在系统是否处于安全状态?

②如果现在进程Pl提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?

 

【实验步骤】

1:数据结构

int Available[100];

int Max[50][100];  

int Allocation[50][100]; 

int Need[50][100];       

int Request[50][100];  

int Finish[50];

int p[50];

int m, n; 

流程图1.2:银行家算法程序流程图

1.3 实验代码

复制代码
#include <iostream>
using namespace std;

//全局变量定义
int Available[100]; //可利用资源数组
int Max[50][100];   //最大需求矩阵
int Allocation[50][100];  //分配矩阵
int Need[50][100];        //需求矩阵
int Request[50][100];     //M个进程还需要N类资源的资源量
int Finish[50];
int p[50];
int m, n;   //M个进程,N类资源

//安全性算法
int Safe()
{
    int i, j, l = 0;
    int Work[100]; //可利用资源数组
    for (i = 0; i < n; i++)
        Work[i] = Available[i];
    for (i = 0; i < m; i++)
        Finish[i] = 0;
    for (i = 0; i < m; i++)
    {
        if (Finish[i] == 1)
            continue;
        else
        {
            for (j = 0; j < n; j++)
            {
                if (Need[i][j] > Work[j])
                    break;
            }
            if (j == n)
            {
                Finish[i] = 1;
                for (int k = 0; k < n; k++)
                    Work[k] += Allocation[i][k];
                p[l++] = i;
                i = -1;
            }
            else continue;
        }
        if (l == m)
        {
            cout << "系统是安全的" << '\n';
            cout << "系统安全序列是:\n";
            for (i = 0; i < l; i++)
            {
                cout << p[i];
                if (i != l - 1)
                    cout << "-->";
            }
            cout << '\n';
            return 1;
        }
    }
}

//银行家算法
int main()
{
    int i, j, mi;
    printf("\n"); 
    cout << "输入进程的数目:\n";
    cin >> m;
    cout << "输入资源的种类:\n";
    cin >> n;
    cout << "输入每个进程最多所需的各类资源数,按照" << m << "x" << n << "矩阵输入\n";
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            cin >> Max[i][j];
    cout << "输入每个进程已经分配的各类资源数,按照" << m << "x" << n << "矩阵输入\n";
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            cin >> Allocation[i][j];
            Need[i][j] = Max[i][j] - Allocation[i][j];
            if (Need[i][j] < 0)
            {
                cout << "你输入的第" << i + 1 << "个进程所拥有的第" << j + 1 << "个资源错误,请重新输入:\n";
                j--;
                continue;
            }
        }
    }
    cout << "请输入各个资源现有的数目:\n";
    for (i = 0; i < n; i++)
        cin >> Available[i];
    Safe();
    while (1)
    {
        cout << "输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\n";
        cin >> mi;
        cout << "输入进程所请求的各个资源的数量\n";
        for (i = 0; i < n; i++)
            cin >> Request[mi][i];
        for (i = 0; i < n; i++)
        {

            if (Request[mi][i] > Need[mi][i])
            {
                cout << "所请求资源数超过进程的需求量!\n";
                return 0;
            }
            if (Request[mi][i] > Available[i])
            {
                cout << "所请求资源数超过系统所有的资源数!\n";
                return 0;
            }
        }
        Safe(); 
        for (i = 0; i < n; i++)
        {
            Available[i] -= Request[mi][i];
            Allocation[mi][i] += Request[mi][i];
            Need[mi][i] -= Request[mi][i];
        }
        if (Safe())
            cout << "同意分配请求\n";
        else
        {
            cout << "你的请求被拒\n";
            for (i = 0; i < n; i++)
            {
                Available[i] += Request[mi][i];
                Allocation[mi][i] -= Request[mi][i];
                Need[mi][i] += Request[mi][i];
            }
        }
        for (i = 0; i < m; i++)
            Finish[i] = 0;
        char YesOrNo;       //标志位
        cout << "是否再次请求分配?是请按Y/y,否请按N/n \n";
        while (1)
        {
            cin >>YesOrNo;
            if (YesOrNo == 'Y' || YesOrNo == 'y' || YesOrNo == 'N' || YesOrNo == 'n')
                break;
            else
            {
                cout << "请按要求重新输入:\n";
                continue;
            }
        }
        if (YesOrNo == 'Y' ||YesOrNo == 'y')
            continue;
        else break;
    }
}
复制代码

实验结果

1.根据五个进成和数据,判断系统是否安全结果如下:

进程p1需要(0420)个资源的请求,对进程进行修改并重新判断是否安全实验结果如下:

【实验结果分析】

1.安全状态一定是没有死锁发生。不安全状态不一定导致死锁。

2.如果一个由系统有安全序列,则系统处于安全状态。

3.银行家算法要在资源分配之前查看系统是否安全

 

posted @   Mymcky  阅读(1026)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示