计算机操作系统【银行家算法】

本文详细描述了一个实验,通过使用银行家算法来模拟银行家算法的概念,包括资源的动态申请、试分配、合法性检查和安全性检查,以防止死锁。实验涉及进程间的资源管理,展示了如何通过算法确保资源的有效分配和系统的安全性。
摘要由CSDN通过智能技术生成

实验二 银行家算法

一、实验目的
运用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地避免死锁的发生,以加深对课堂上所讲授的知识的理解。
二、实验内容
完成银行家算法的模拟实现:设计有m个进程共享n个系统资源的系统,进程可动态的申请和释放资源。系统按各进程的申请动态的分配资源时,采用银行家算法有效地避免死锁的发生。
三、实验准备
1.相关理论知识
(1)银行家算法的思路
对进程的资源请求进行合法性检查;若请求合法,则进行试分配。试分配后,调用安全性检查算法进行安全性检查。若安全,则满足该进程请求,分配资源;若不安全,则拒绝该进程申请,不分配资源,并恢复系统试分配前的资源状态。
(2)银行家算法中用到的主要数据结构
可利用资源向量 int Available[j] // j为资源的种类。
最大需求矩阵 int Max[i][j] // i为进程的数量。
分配矩阵 int Allocation[i][j]
需求矩阵 int Need[i][j]= Max[i][j]- Allocation[i][j]
申请各类资源数量 int Requesti[j] //i进程申请j资源的数量
工作向量 int Work[x] int Finish[y]
(3)银行家算法Bank()
进程i发出请求申请k个j资源,Requesti[j]=k
① 检查申请量是否不大于需求量:
Request i[j]<=Need[i,j],若条件不符重新输入,不允许申请大于需求量。
② 检查申请量是否小于系统中的可利用资源数量:
Request i[j]<=Available[j],若条件不符就申请失败,阻塞该进程,用goto语句跳转到重新申请资源。
③ 若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:
Available[j]= Available[j]- Requesti[j];
Allocation[i][j]= Allocation[i][j]+ Requesti[j];
Need[i][j]= Need[i][j]- Request i[j];
④ 试分配后,执行安全性检查,调用Safe()函数检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
⑤ 用while循环实现输入字符Y/y判断是否继续请求资源分配。
(4)安全性检查算法(Safe()函数)
① 设置两个向量:
工作向量Work:表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available。
Finish:表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false;当有足够的资源分配给进程时,再令Finish[i]=true。
② 在进程中查找符合以下条件的进程:
条件1:Finish[i]=0;
条件2:Need[i][j]<=Work[j]
若找到,则执行步骤③否则,执行步骤④
③ 当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]= Work[j]+ Allocation[i][j];
Finish[i]=true;
跳至 ②;
④ 若所有进程的Finish[i]=true都满足,则表示已找到安全序列,系统处于安全状态,试分配成功;否则,系统处于不安全状态,不予分配。
2.测试数据
系统有5个进程(p0,p1,p2,p3,p4)和4类资源(A,B,C,D),在T0时刻的资源分配情况如下表所示:
Process Max Allocation Need Available
P0 0 0 4 4 0 0 3 2 0 0 1 2 1 6 2 2
P1 2 7 5 0 1 0 0 0 1 7 5 0
P2 3 6 10 10 1 3 5 4 2 3 5 6
P3 0 9 8 4 0 3 3 2 0 6 5 2
P4 0 6 6 10 0 0 1 4 0 6 5 6
试问:(1)该状态是否安全?–该状态是安全的。
(2)如果进程P2提出请求Request2(1,2,2,2)后,系统能否将资源分配给它?–不能。
四、实验过程
1.流程图

  1. 源代码
    #include
    using namespace std;
    #define MAXPROCESS 50 /最大进程数/
    #define MAXRESOURCE 100 /最大资源数/
    int AVAILABLE[MAXRESOURCE]; /可用资源数组/
    int MAX[MAXPROCESS][MAXRESOURCE]; /最大需求矩阵/
    int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /分配矩阵/
    int NEED[MAXPROCESS][MAXRESOURCE]; /需求矩阵/
    int REQUEST[MAXPROCESS][MAXRESOURCE]; /进程需要资源数/
    bool FINISH[MAXPROCESS]; /系统是否有足够的资源分配/
    int p[MAXPROCESS]; /记录序列/
    int m,n; /m个进程,n个资源/
    void Init();
    bool Safe();
    void Bank();
    int main()
    {
    a: Init();
    if(!Safe()) goto a;
    Bank();
    return 0;
    }
    //银行家算法和安全性算法区别
    //100页当进程发出资源的请求时采用银行家算法,当 判断系统能否给每一个进程分配资源时采用安全性算法
    void Init() /初始化/
    {
    int i,j;
    cout<<“…银行家算法模拟实验…”<<endl;
    cout<<“请输入进程数目m:”;
    cin>>m;
    cout <<“请输入进程的种类n:”;
    cin>>n;
    cout<<“请输入每个进程对资源数的最大需求,按照”<<m<<“x”<<n<<“矩阵输入”<<endl;
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    cin>>MAX[i][j];
    cout<<“输入每个进程已分配的资源数,同样按照”<<m<<“x”<<n<<“矩阵输入”<<endl;
    for(i=0;i<m;i++)
    {
    for(j=0;j<n;j++)
    {
    cin>>ALLOCATION[i][j];
    //请写出NEED[i][j]的计算公式!!!
    NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
    if(NEED[i][j]<0)
    {
    cout<<“进程”<<i+1<<“的第”<<j+1<<“个资源数超过其最大资源数,请重新输入:”<<endl;
    j–;
    continue;
    }
    }
    }
    cout<<“请输入各个资源现有的数目:”<<endl;
    for(i=0;i<n;i++)
    {
    cin>>AVAILABLE[i];
    }
    cout<<“…”<<endl;
    }
    void Bank() /银行家算法/
    {
    int i,r;
    char again;
    while(1)
    {
    cout<<“请输入要申请资源的进程号(注:第一个进程号为0,以此类推)”<<endl;
    cin>>r;
    cout<<“请输入进程所请求的各资源的数量”<<endl;
    for(i=0;i<n;i++)
    {
    cin>>REQUEST[r][i];
    }
    for(i=0;i<n;i++)
    {
    if(REQUEST[r][i]>NEED[r][i])
    {
    cout<<“您输入的请求数超过进程的需求量!请重新输入”<<endl;
    break;
    }
    if(REQUEST[r][i]>AVAILABLE[i])
    {
    cout<<“您输入的请求数超过进程的需求量!请重新输入”<<endl;
    break;
    }
    }
    if(i<n)continue;
    for(i=0;i<n;i++)//银行家算法精髓
    {
    AVAILABLE[i]=AVAILABLE[i]-REQUEST[r][i];
    ALLOCATION[r][i]=ALLOCATION[r][i]+REQUEST[r][i];
    NEED[r][i]= NEED[r][i]-REQUEST[r][i];
    }
    if(Safe())//调用安全性算法:判定系统是否处于安全状态
    {
    cout<<“同意分配请求!”<<endl;
    }
    else
    {
    cout<<“您的请求被拒绝!”<<endl;
    for(i=0;i<n;i++)//试分配失败,恢复试分配前系统资源状态
    {
    AVAILABLE[i]+=REQUEST[r][i];
    ALLOCATION[r][i]=REQUEST[r][i];
    NEED[r][i]+=REQUEST[r][i];
    }
    }
    cout<<“您还想再次请求分配资源吗?是请按y/Y,否请按其他键”<<endl;
    cin>>again;
    if(again==‘y’||again==‘Y’)
    {
    continue;
    }
    break;
    }
    }
    bool Safe() /安全性算法/
    {
    int i,j,k,l=0;
    int Work[MAXRESOURCE];
    for(i=0;i<n;i++)//输入Work值
    Work[i]=AVAILABLE[i];
    for(i=0;j<m;i++)
    {
    FINISH[i]=false; //输入FINSH值
    }
    for(i=0;i<m;i++)
    {
    if(FINISH[i]true)
    {
    continue;
    }
    else
    {
    for(j=0;j<n;j++)
    {
    if(NEED[i][j]>Work[j])
    {
    break;
    }
    }
    if(j
    n)
    {
    FINISH[i]=true;
    for(k=0;k<n;k++)
    {
    Work[k]=Work[k] + ALLOCATION[i][k];//输入
    }
    p[l++]=i;
    i=-1;
    }
    else
    {
    continue;
    }
    }
    }
    if(l==m)
    {
    cout<<“系统是安全的”<<endl;
    cout<<“安全序列”<<endl;
    for(i=0;i<l;i++)
    {
    cout<<p[i];
    if(i!=l-1)
    {
    cout<<“–>”;
    }
    }
    cout<<“”<<endl;
    return true;
    }
    else{
    cout<<“系统是不安全的”<<endl;
    }
    return false;}
  2. 运行界面
    在这里插入图片描述
    在这里插入图片描述

五、实验心得
银行家算法就是当接收到一个系统资源的分配后找到一个安全序列,使得进程间不会发生死锁.,若发生死锁则让进程等待。
通过本次上机实验,我对银行家算法有了更深的了解。银行家算法可以保证系统中,所有进程都能在有限的时间内得到需要的全部资源。银行家算法是一种用来避免操作系统死锁出现的有效算法。

  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
设计一个n个并发进程共享m个系统资源的程序以实现银行家算法。要求: 1) 简单的选择界面; 2) 能显示当前系统资源的占用和剩余情况。 3) 为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 4) 撤销作业,释放资源。 编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申请资源时,系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量时,就满足进程的当前申请。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后归还它所占有的全部资源供其它进程使用。 银行家算法中的数据结构 (1)可利用资源向量Available(一维数组) 是一个含有m个元素,其中的每一个元素代表一类可利用的资源数目,其初值是系统中所配置的该类全部可用资源数目。如果Available[j]=k, 表示系统中现有Rj类资源k个。 (2)最大需求矩阵Max(二维数组) m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k, 表示进程i需要Rj类资源的最大数目为k。 (3)分配矩阵Allocation(二维数组) m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation(i,j)=k, 表示进程i当前已分得Rj类资源k个。 (4)需求矩阵Need (二维数组) 是一个含有n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need(i,j)=k, 表示进程i还需要Rj类资源k个,方能完成其任务。 Need(i,j)= Max(i,j)-Allocation(i,j)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值