在windows下用C++实现银行家算法

这篇博客详细介绍了如何在Windows操作系统上使用C++实现银行家算法,包括多线程编程、资源分配和安全状态判断。通过创建多个线程模拟进程资源请求,利用Windows API的信号量机制实现并发访问。实验数据结构包括系统资源分配和进程需求,通过程序判断系统是否处于安全状态并给出安全路径。
摘要由CSDN通过智能技术生成


银行家算法的实现

                                

  1. 实验目的

       通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用Windows API进行共享数据互斥访问和多线程编程的方法。

  2. 实验内容

     1.  在Windows操作系统上,利用Win32 API编写多线程应用程序实现银行家算法。

     2.  创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。

     3.  通过Win32 API提供的信号量机制,实现共享数据的并发访问。

  3. 实验思路

      我们要理解银行家算法的整体思路,银行家算法是死锁避免的一种方法,在整个程序中,我们可以提供两种功能,首先我们可以判断当前系统是否处于安全状态,如果处于,则给出一条安全路径,否则提示用户。另外,我们提供进程的资源请求功能,当一个进程发出请求后,如果请求小于可用资源数量,那么请求通过,并进行安全算法的检验。

    4.实验数据结构及说明

       a为了表示程序的初始状态,我在这里用一组实例作为检测,在程序的开始,我们需要定义两个二维数组

      

     Alloc表示五个进程已分配的资源,max表示最大的需求数量,max-alloc就是进程需要的资源数量

     同时我们设一个系统可用资源数量的数组available

     ,表示三种资源可用的数量

    b.main函数

      Main函数中我们主要进行数据的显示及与用户的交互操作 ,当用户输入对应的进程号及相应的资源请求后,我们通过swich语句启动相应的进程函数,同时在函数中判断请求的资源是否小于可用的资源数,如果小于则判断是否存在安全路径,否则则输出请求资源大于可用资源。

    C.5个线程函数

        他们分别表示系统的5个进程,对资源进行请求,同时进行判断操作

    D.ifsafe()函数是本实验的关键,用于判断系统是否处于安全状态,如果安全,则给出一条安全路径,否则输出不存在安全算法

     

     

  1. 程序运行时的初值及运行结果

      a.判断当前系统是否安全

      

     

     当输入5后,判断当前系统是否处于安全状态

     

    可以看出,系统当前是安全的,且安全路径为P1-P3-P0-P2-P4

    b.P1请求资源555的情况

      

      可以看出,会输出请求资源大于可用资源

    c.P0请求020的资源

      

       可以看出此时也符合系统安全的要求

     

    d.P4请求330的资源

      

      

      也符合我们预期的结果

     

     

  2. 实验体会

      开始碰到这个实验的时候,以为这个实验很简单,但在做的过程中,感觉这个实验还是挺复杂的,特别是判断系统是否安全的算法,如果系统安全,则输出一条安全路径,这个算法我整整想了一个下午加晚上,而且刚写完后,错误百出,自己又不得不一步一步进行程序的调试,直到最后成功输出了程序的正确结果,不知不觉就写了三百行的代码,心里还是很有成就感的,同时通过这个实验,也进一步加深了我对C++的一些基本算法的理解。

  3. 源程序加注释

     #include<iostream>

    #include<process.h>

    #include<Windows.h>

     

    using namespace std;

     

     

    //定义5个线程函数,分别表示5个进程对系统资源的请求

    DWORD WINAPI pro0(PVOID pvPram);

    DWORD WINAPI pro1(PVOID pvPram);

    DWORD WINAPI pro2(PVOID pvPram);

    DWORD WINAPI pro3(PVOID pvPram);

    DWORD WINAPI pro4(PVOID pvPram);

    //申明安全函数

    void ifsafe();

     

    int available[3] = { 3,3,2 };       //系统当前可用的资源数

     

    //5个进程已分配的资源数

    int alloc[5][3] = { {0,1,0},

    {2,0,0},

    {3,0,2},

    {2,1,1},

    {0,0,2}

    };

    //5个进程的最大资源数

    int max[5][3] = {                            {7,5,3},

    {3,2,2},

    {9,0,2},

    {2,2,2},

    {4,3,3}

    };

     

     

     

    int a, b, c, d;      //用于用户的输入b,c,d表示进程的请求资源数

    int main()

    {

     

    //以一定的格式输出当前的资源分配情况

    cout<< "******************银行家算法**********************" << endl;

    cout<< "        All   Max   Nee" << endl;

    cout<< "P0      " << alloc[0][0]<< alloc[0][1]<< alloc[0][2]<< "   " << max[0][0]<< max[0][1]<< max[0][2]<< "   " 

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值