关闭

操作系统实验四 银行家算法

标签: 操作系统c语言算法
8016人阅读 评论(0) 收藏 举报
分类:

操作系统实验四 银行家算法

一、实验目的

1、 理解银行家算法。
2、 掌握进程安全性检查的方法与资源分配的方法。

二、实验内容与基本要求

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

进程 已占资源 最大需求数
资源种类 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 3 5 4 2 3 5 6
P3 0 6 3 2 0 6 5 2
P4 0 0 1 4 0 6 5 6

现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答:
1、 现在系统是否处于安全状态?
2、 如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?

三、实验报告内容

1、 银行家算法和安全性检查算法原理


银行家算法:

  银行家算法最初级原为银行系统设计,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。在OS设计中,也可以用它来避免死锁。
  为实现银行家算法,每个新进程在进入系统时它必须申明在运行过程中,可能需要的每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当某一进程请求时,系统会自动判断请求量是否小于进程最大所需,同时判断请求量是否小于当前系统资源剩余量。若两项均满足,则系统试分配资源并执行安全性检查算法。

安全性检查算法 :

  安全性检查算法用于检查系统进行资源分配后是否安全,若安全系统才可以执行此次分配;若不安全,则系统不执行此次分配。
  安全性检查算法原理为:在系统试分配资源后,算法从现有进程列表寻找出一个可执行的进程进行执行,执行完成后回收进程占用资源;进而寻找下一个可执行进程。当进程需求量大于系统可分配量时,进程无法执行。当所有进程均可执行,则产生一个安全执行序列,系统资源分配成功。若进程无法全部执行,即无法找到一条安全序列,则说明系统在分配资源后会不安全,所以此次分配失败。


2、 程序流程图


这里写图片描述

3、 程序及注释


#include <iostream.h>
//////////////////////////////////////////////////////////////////////////
//全局变量定义
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;
    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;
            }
        }
        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<<"SORRY╮(╯▽╰)╭……你的请求被拒绝…\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 Flag;       //标志位
        cout<<"是否再次请求分配?是请按Y/y,否请按N/n";
        while (1)
        {
            cin>>Flag;
            if (Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n')
            break;
            else
            {
                cout<<"请按要求重新输入:\n";
                continue;
            }
        }
        if (Flag=='Y'||Flag=='y')
        continue;
        else break;
    }
}

4、 运行结果以及结论

图示为题目所给定的条件下的程序运行结果。可看出在现有分配情况下,该系统安全。
这里写图片描述

下图为,P1提出请求后,程序的运行结果,可知,系统仍然安全,所以系统可以满足请求。
这里写图片描述

2
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

操作系统课程设计银行家算法

#include #include using namespace std; typedef struct Arithmetic { char name; int Max[5]; int A...
  • wangiijing
  • wangiijing
  • 2016-05-19 21:57
  • 1232

银行家算法(Java实现)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理...
  • u014634576
  • u014634576
  • 2016-09-20 21:52
  • 5333

操作系统银行家算法调度实验

[目的要求] 银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法。本实验要求用高级语言编写一个银行家的模拟算法。 通过本实验可以对预防死锁和银行家算法有更深刻的认识。 [试验内容] 1...
  • Justin_bibo
  • Justin_bibo
  • 2016-11-08 13:30
  • 662

操作系统 - 模拟银行家算法实验

/* 实验以3.7.4为例 N=5个进程(p0,p1,p2,p3,p4) M=3类资源(A=10,B=5,C=7) 在T0时刻资源分配如下 Max...
  • qubeleyZ
  • qubeleyZ
  • 2017-06-15 23:36
  • 199

【避免死锁的银行家算法】操作系统原理与实践教程实验

由于滕艳平所写的《操作系统原理与实践教程》这本书的后面的实验在格式上比较乱,且不容易看懂,所以自己在看懂之后写了代码并且在适当的位置后面给予了注释,同时代码的格式更容易看,希望能够更深入了解一下避免死...
  • Waitfou
  • Waitfou
  • 2017-05-28 18:00
  • 413

操作系统实验之银行家算法

smilesword.com 1. 实验目的和要求 银行家算法是避免死锁的一种重要方法,要求编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁...
  • freezesword
  • freezesword
  • 2011-11-23 21:27
  • 1571

操作系统实验,用C或者C++实现银行家算法

实验内容与要求用C或C++语言实现下列要求,并写出实验报告,报告内容包括:题目、目的、内容和要求、程序清单、运行情况(输入、输出)、总结。 系统中有进程P0、P1、P2、P3、P4,三种资源数量分别为...
  • qq_34164532
  • qq_34164532
  • 2017-12-08 18:55
  • 39

操作系统实验之银行家算法模拟

银行家算法模拟 银行家算法中遇到的数据结构 可利用资源向量 Available Available[i] 表示第 i 种资源可利用的数目 最大需求矩阵 Max Max[i][j] 表示第...
  • ping1632743560
  • ping1632743560
  • 2017-05-28 23:33
  • 249

计算机操作系统实验报告,C语言实现银行家算法

  • 2017-12-02 21:48
  • 140KB
  • 下载

操作系统大实验—银行家算法

  • 2013-12-26 18:13
  • 221KB
  • 下载
    个人资料
    • 访问:354345次
    • 积分:3700
    • 等级:
    • 排名:第10165名
    • 原创:96篇
    • 转载:3篇
    • 译文:2篇
    • 评论:84条
    文章分类
    最新评论