zoukankan      html  css  js  c++  java
  • 【操作系统】银行家算法

    1.算法原理

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

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

    2.实现思路

        利用3个二维数组分别表示最大需求量矩阵,allocation矩阵,need矩阵,利用一维数组存放available初始值。

     3个核心函数:输入函数,安全检查函数,请求资源检验函数。

    3.代码实现

      1 #include<iostream>
      2 using namespace std;
      3 #define p 4
      4 #define r 3
      5 
      6 //a-max,b-allocation,c-need,d-available
      7 void input(int a[p][r],int b[p][r],int c[p][r],int d[r])
      8 {
      9     int i,j;
     10     cout<<"请输入allocation矩阵数据:";
     11     for(i=0;i<p;i++){
     12         cout<<"进程p"<<i+1<<":  " ;
     13         for(j=0;j<r;j++)
     14             cin>>b[i][j];
     15     }
     16         
     17             
     18     cout<<"请输入 need 矩阵数据:";
     19     for(i=0;i<p;i++){
     20         cout<<"进程p"<<i+1<<":  " ;
     21         for(j=0;j<r;j++)
     22             cin>>c[i][j];
     23     }
     24         
     25 //    cout<<"max data:";
     26     for(i=0;i<p;i++)
     27         for(j=0;j<r;j++){
     28             a[i][j]=b[i][j]+c[i][j];
     29         }
     30         
     31     cout<<"请输入初始available:";
     32     for(j=0;j<r;j++)
     33         cin>>d[j];
     34 }
     35  //比较函数,用于比较两个数组中所有数字大于第二个矩阵中所有数字,正确return 1 
     36 int equ(int m[r],int n[r])
     37 {
     38     int i,flag=0;
     39     for(i=0;i<r;i++)
     40         if(m[i]<n[i])
     41         {
     42             flag=1;
     43             break;
     44         }
     45     if(flag==1)    
     46     return 0;
     47     else 
     48     return  1;
     49 }
     50   
     51 //申请资源,第n个进程申请资源
     52 void banktest(int b[p][r],int c[p][r],int d[r],int req[r],int n)
     53 {
     54     int i,j;
     55     int t[r];
     56     n=n-1;
     57     for(i=0;i<r;i++)
     58         t[i]=c[n][i];//需要的资源 
     59     if(equ(d,req)&&equ(t,req))//对available,request进行比较
     60     {
     61         for(j=0;j<r;j++)
     62         {
     63             b[n][j]=b[n][j]+req[j];
     64             c[n][j]=c[n][j]-req[j];
     65             d[j]=d[j]-req[j];
     66         }
     67         if(stest(b,c,d))
     68             cout<<"允许第"<<n+1<<"个进程申请资源!";
     69         else 
     70         {
     71             cout<<"不允许第"<<n+1<<"个进程申请资源!";
     72  
     73         cout<<"恢复以前状态!";
     74         for(j=0;j<r;j++)
     75         {
     76             b[n][j]=b[n][j]-req[j];
     77             c[n][j]=c[n][j]+req[j];
     78             d[j]=d[j]+req[j];
     79         }
     80         }
     81     }
     82  
     83     else cout<<"申请资源量出错!";
     84 }
     85  
     86 //系统的安全性检测 
     87 int stest(int b[p][r],int c[p][r],int d[r])
     88 {
     89     int i,j,k,l,flag=0,flag1=0;
     90     int t[r],finish[p],dd[r];
     91     for(i=0;i<p;i++)
     92         finish[i]=0;//finish为1即表示available满足某一进程并让其实现
     93  
     94     for(i=0;i<r;i++)
     95         dd[i]=d[i];
     96     cout<<"输出分配序列:";
     97     cout<<"      allocation        need       avilable"<<endl;
     98     for(k=0;k<p;k++)            //全搜索    {
     99         for(i=0;i<p;i++)
    100         {
    101             if(finish[i]==1)
    102             continue;
    103             else
    104             {
    105                 for(j=0;j<r;j++)
    106                     t[j]=c[i][j];
    107                 if(equ(dd,t))
    108                 {
    109                     finish[i]=1;
    110                     cout<<endl;
    111                     //cout<<i+1<<'	';输出矩阵 
    112                     cout<<"p"<<i+1<<":";
    113                     for (j =0;j<r; j++)
    114                     {
    115                         printf("  %2d ", b[i][j]);
    116                     }
    117                     cout<<"     ";
    118                     for (j = 0; j < r; j++)
    119                     {
    120                         //Allocation[i][j]=Pause[j]-Need[i][j];
    121                         printf("  %2d ", c[i][j]);
    122                     }
    123                     cout<<"     ";
    124                     for (j = 0; j <r; j++)
    125                     {
    126                         printf("  %2d ", dd[j] +b[i][j]);
    127                     }
    128                     
    129                     flag=1;
    130                     for(l=0;l<r;l++)
    131                         dd[l]=dd[l]+b[i][l];
    132                     break;
    133                 }
    134             }
    135             if(flag==1)break;
    136         }    
    137     }
    138     cout<<endl;
    139     for(l=0;l<p;l++)
    140     {
    141         //cout<<finish[l]<<endl;
    142         if(finish[l]==0)
    143         flag1=1;
    144     }
    145     
    146        cout<<"当前系统还剩余的资源:"<<endl; 
    147        for(i=0;i<r;i++){
    148            cout<<dd[i]<<"   "<<endl;
    149        }
    150        
    151         //cout<<flag1<<endl;
    152     if(flag1==0)
    153     Return 1;    //flag1为记录finish是否有0存在的标记,当flag1=0时,安全
    154     else 
    155     Return 0;
    156 }
    157 
    158 int main()
    159 {
    160     cout<<"当前资源种类数为:" <<r<<endl;
    161     cout<<"当前进程总数为: " <<p<<endl;
    162     int j,n;                   //n-第n个资源申请
    163     int max[p][r],allocation[p][r],need[p][r];
    164     int available[r],request[r];
    165     input(max,allocation,need,available);
    166  
    167     if(stest(allocation,need,available)==1)
    168         cout<<"初始状态安全!";
    169     else 
    170     cout<<"初始状态不安全!";
    171  
    172     cout<<" input request data:";
    173     for(j=0;j<r;j++)cin>>request[j];
    174  
    175     cout<<"第n个进程申请资源——n的值";
    176     cin>>n;
    177  
    178     banktest(allocation,need,available,request,n);
    179     return 0;
    180 }

    4.实例测试

  • 相关阅读:
    durex-word
    闲聊可穿戴设备
    闲聊质数
    一步一步学swift之:自己写Api接口-PHP
    Swift实战-小QQ(第2章):QQ侧滑菜单
    Swift实战-小QQ(第1章):QQ登录界面
    一步一步学习Swift之(一):关于swift与开发环境配置
    objective-c底层: runtime机制
    手把手教你视频直播开发
    多语言本地化开发Localized
  • 原文地址:https://www.cnblogs.com/yitou13/p/10250783.html
Copyright © 2011-2022 走看看