银行家算法(C++实现)

这篇具有很好参考价值的文章主要介绍了银行家算法(C++实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、银行家算法概述

二、银行家算法需要的数组结构

三、算法概述

1.安全性算法

2.银行家算法

四、代码实现

五、实验结果验证


一、银行家算法概述

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

二、银行家算法需要的数组结构

1)可利用资源向量Available:这是一个含有m个元素的数组,其中的每一个元素代表一类可用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j] = K,则表示系统中现有Rj类资源K个。

2)最大需求矩阵Max:这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j] = K,则表示进程i需要Rj类资源的最大数目为K。

3)分配矩阵Allocation:这也是一个n*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.安全性算法

系统所执行的安全性算法可描述如下:

(1)设置两个向量:
        ① 工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available;② Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false; 当有足够资源分配给进程时, 再令Finish[i]=true。

(2)从进程集合中找到一个能满足下述条件的进程:
        ① Finish[i]=false;
        ② Need[i,j]≤Work[j]; 若找到, 执行步骤3);否则,执行步骤4)。

(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
        Work[j]=Work[i]+Allocation[i,j];
        Finish[i]=true;
        go to step 2;

(4)如果所有进程的Finish[i]=true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。

2.银行家算法

设Requesti是进程Pi的请求向量,如果表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

(1) 如果 ≤ Need[i,j],转向步骤(2),否则认为出错,因为它所需的资源数目已超过它所宣布的最大值。

(2) 若  ≤ Available[j],转向步骤(3),否则表示尚无足够资源,Pi必须等待。

(3) 系统尝试把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j] = Available[j] – 
Allocation[i,j] = Allocation[i,j] + 
Need[i,j] = Need[i,j] – 

(4) 系统执行安全性算法,检查此次分配后系统是否处于安全状态。若安全,才正式分配给Pi,完成此次分配;否则,此次试分配作废,恢复原来资源的分配状态,进程Pi等待。

四、代码实现

#include<iostream>
using namespace std;

const int p=5;//进程数
const int r=4;//资源种类

int num = 1;//需要分配资源的进程序号

void init_request(int request[r])
{
    //初始化request矩阵
    cout<<"Input the number of request:"<<endl;
    cin>>num;
    num-=1;//下标减1
    cout<<"Input the request vector:"<<endl;
    for(int i=0;i<r;i++)
        cin>>request[i];
}

void init_matrix(int maximum[p][r],int allocation[p][r],int need[p][r],int available[r],int request[r])
{
    //初始化函数
    cout<<"Input the Allocation matrix:"<<endl;
    for(int i=0;i<p;i++)
        for(int j=0;j<r;j++)
            cin>>allocation[i][j];
    cout<<"Input the Need matrix:"<<endl;
    for(int i=0;i<p;i++)
        for(int j=0;j<r;j++)
            cin>>need[i][j];
    //cout<<"Input the Max matrix:"<<endl;
    //Max矩阵可以由Need和Allocation矩阵推导得出
    //Max[i,j]= Need[i,j]+Allocation[i,j]
    for(int i=0;i<p;i++)
        for(int j=0;j<r;j++)
            maximum[i][j]=need[i][j]+allocation[i][j];
    cout<<"Input the available vector:"<<endl;
    for(int i=0;i<r;i++)
        cin>>available[i];
}

void output_func(int allocation[p][r],int need[p][r],int available[r])
{
    //输出函数
    cout<<endl<<"     "<<"Allocation"<<"     Need"<<"        Available"<<endl;
    for(int i=0;i<p;i++)
    {
        cout<<"P"<<i+1<<"   :";
        for(int j=0;j<r;j++)
        {
            cout<<allocation[i][j]<<' ';

        }
        cout<<"     ";
        for(int j=0;j<r;j++)
            cout<<need[i][j]<<' ';
        if(i==0)
        {
            cout<<"     ";
            for(int k=0;k<r;k++)
                cout<<available[k]<<' ';
        }
        cout<<endl;
    }
    cout<<endl;

}

bool compare(int need[],int work[])
{
    bool flg = 1;
    for(int i=0;i<r;i++)
    {
        //检查是否有大于的情况存在
        if(need[i]>work[i])
        {
            flg=0;
            break;
        }
    }
    return flg;
}

int check_security(int allocation[p][r],int need[p][r],int available[r])
{
    //安全性检查函数
    int finish[p] = {0};//初始化finish向量
    int work[r];  //拷贝available
    int lis[p];//用来记录安全时的队列
    int cnt=0;
    for(int i=0;i<r;i++)
        work[i] = available[i];//初始化work向量
    //序列分配
    //循环p次
    for(int m=0;m<p;m++)
    {
        for(int i=0;i<p;i++)
        {
            //如果当前进程执行完成,跳过
            if(finish[i] == 1)
                continue;
            //找到finish[i] = false
            else{
                //如果Need[i,j]<=Work[j]
                if(compare(need[i],work))
                {
                    for(int j=0;j<r;j++)
                        work[j]+=allocation[i][j];
                    finish[i] = 1;
                    lis[cnt++] = i+1;//将该状态放入安全状态队列中
                    break;
                }
            }
        }
    }
    int flag=1;
    for(int i=0;i<r;i++)
    {
        if(finish[i]==0)
        {
            flag = 0;
            break; //如果存在F的进程,表明系统处于不安全状态
        }
        else
            continue;
    }
    if(flag)
    {
         cout<<"系统处于安全状态!"<<endl;
         cout<<"安全序列为:";
         for(int i=0;i<p;i++)
            cout<<lis[i]<<' ';
         cout<<endl;
    }
    else cout<<"系统处于不安全状态!"<<endl;
    return flag;

}

void banker(int allocation[p][r],int need[p][r],int available[r],int request[r],int n)
{
    if(!compare(request,need[n]))
    {
        //如果存在Requesti[j]>Need[i][j],认为出错
        cout<<"出错!所需资源已超过所宣布的最大值!"<<endl;
        return ;
    }
    else{
        //银行家算法(1)没有出错
        if(!compare(request,available))
        {
            //如果存在Requesti[j]>Available[j],认为出错
            cout<<"尚无足够资源,必须等待!"<<endl;
            return ;
        }
        else{
            for(int j=0;j<r;j++)
            {
                available[j]-=request[j];
                allocation[n][j]+=request[j];
                need[n][j]-=request[j];
            }
            if(check_security(allocation,need,available))
            {
                cout<<"安全!将资源正式分配"<<endl;
            }
            else
            {
                cout<<"不安全!资源分配作废!恢复以前状态"<<endl;
                for(int j=0;j<r;j++)
                {
                    need[n][j]+=request[j];
                    allocation[n][j]-=request[j];
                    available[j]+=request[j];
                }
            }
        }
    }
    output_func(allocation,need,available);

}

int main()
{
    int maximum[p][r],allocation[p][r],need[p][r];
    int available[r],request[r];
    init_matrix(maximum,allocation,need,available,request);
    cout<<endl<<"检查T0时刻系统是否处于安全状态..."<<endl;
    check_security(allocation,need,available);
    int flag = 1;
    while(flag)
    {
        cout<<endl<<"对请求资源进行银行家算法检查..."<<endl;
        init_request(request);//初始化request矩阵
        banker(allocation,need,available,request,num);
        cout<<"是否继续输入?(输入0退出):";
        cin>>flag;
    }

    return 0;
}
/*测试数据
0 0 3 2
1 0 0 0
1 3 5 4
0 3 3 2
0 0 1 4
0 0 1 2
1 7 5 0
2 3 5 6
0 6 5 2
1 6 5 6
1 6 2 2
*/

五、实验结果验证

1.能安全分配的情况

 

 文章来源地址https://www.toymoban.com/news/detail-821903.html

2.分配不安全情况(注意一定要恢复原来的状态)

银行家算法c++,C++,操作系统,算法,c++,开发语言

 3.需要的资源超过自己需要的最大值

银行家算法c++,C++,操作系统,算法,c++,开发语言

 4.尚无足够资源,需等待分配

银行家算法c++,C++,操作系统,算法,c++,开发语言

 

到了这里,关于银行家算法(C++实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

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

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

    掌握银行家算法思想,并能编程实现。 1、在Linux环境下编译运行程序; 2、按照教材的算法编写; 3、(*)输入数据从文本文件中读出,不从键盘录入,数据文件格式见以下说明; 4、主要数据结构的变量名和教材中的一致,包括Available、Max、Allocation、Need、Request、Work、Fin

    2024年02月01日
    浏览(10)
  • 操作系统银行家算法(JAVA/Python/C#/JavaScript/C/C++)代码实现

    操作系统银行家算法(JAVA/Python/C#/JavaScript/C/C++)代码实现

    银行家算法是一种资源分配和死锁避免算法,它通过模拟所有资源的预定最大可能数量的分配来测试安全性,然后进行“s状态”检查以测试可能的活动,然后决定是否应该允许继续分配。 Banker’s algorithm 之所以叫“银行家算法”,是因为它在银行系统中被用来检查贷款是否

    2024年02月06日
    浏览(18)
  • 【操作系统】银行家算法个人出题例题 (含答案)

    【操作系统】银行家算法个人出题例题 (含答案)

    1.银行家算法是代表性的避免死锁的算法,在进程调度中具有重要作用。请结合所学知识回答以下问题:(23分——加长版) (1)银行家算法使用的四个必要的数据结构是:可用资源向量Available,____________,分配矩阵Allocation,需求矩阵Need。(1分) (2)以下是银行家算法具体实现

    2024年02月12日
    浏览(10)
  • 操作系统实验二死锁避免之银行家算法的模拟

    操作系统实验二死锁避免之银行家算法的模拟

    死锁  (1)定义  (2)死锁产生的原因  (3)死锁产生的必要条件  (4)死锁的处理策略 银行家算法  (1)核心思想  (2)数据结构  (3)算法描述    (4)  安全性检查算法 银行家算法的模拟 (1)数据结构 (2)完整代码 (3)测试 所谓死锁,是指多个进程因为竞争资

    2024年02月01日
    浏览(8)
  • 银行家算法(C++实现)

    银行家算法(C++实现)

    目录 一、银行家算法概述 二、银行家算法需要的数组结构 三、算法概述 1.安全性算法 2.银行家算法 四、代码实现 五、实验结果验证 银行家算法 (Banker\\\'s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的

    2024年01月24日
    浏览(9)
  • 银行家算法——C++实现 [ 开源代码 + 详细解析 ]

    银行家算法——C++实现 [ 开源代码 + 详细解析 ]

    ✅ (原创,纯手敲,开源免费,2021的最后一篇) Banker Algorithm 🏦 ◆ 说明 :上述算法的核心实现采用了 “DFS + 回溯” 的方法,详见后文的源代码。另外,如果把 C++ 代码里面的 “ p_num=1; ” 注释掉,得到的是另一个结果。我虽然输入是“0”,但代码里后面我直接把 p_num 赋值

    2023年04月26日
    浏览(9)
  • C++ 银行家算法与时间片轮转调度算法结合

    C++ 银行家算法与时间片轮转调度算法结合

    声明:未经允许,请勿转载 一.实验目的 (1) 掌握 RR(时间片调度) 算法,了解 RR 进程调度 (2) 了解死锁概念,理解安全状态,并且理解银行家算法 (3) 利用 RR 进程调度与银行家算法结合,写出一个简单的项目 二.实验原理 2.1 时间片调度算法       在分时系统中都采用时间片轮

    2024年02月08日
    浏览(5)
  • C语言实现银行家算法

    C语言实现银行家算法

    银行家算法 最初是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉(Edsger W. Dijkstra)于1965年提出的。当时他正致力于解决多道程序设计中产生的死锁问题。在多道程序设计中,由于不同进程之间共享有限的系统资源,如内存、I/O设备等,因此存在一个进程等待其他进程释放资源而

    2024年02月05日
    浏览(7)
  • 银行家算法

    银行家算法

    银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。 假设客户A、B、C 三人向银行贷款用于建房,分别需要贷款

    2024年02月02日
    浏览(6)
  • 银行家算法--申请资源

    银行家算法--申请资源

    问题描述: 输入N个进程(N=100),以及M类资源(M=100),初始化各种资源的总数,T0时刻资源的分配情况。例如: 假定系统中有5个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10、5、7,在T0时刻的资源分配图如下: 输入申请资源的进程以及申请各类资源的数

    2024年02月03日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包