zoukankan      html  css  js  c++  java
  • 操作系统 银行家算法(C++实现)

    1. 系统安全状态

      系统在进行资源分配之前,应先计算此次资源分配的安全性,即判断系统当前拥有的资源数,是否满足该进程目前所需要的资源数,若满足则将该进程运行完毕,并将在此之前分配给该进程的资源释放,然后继续推进,该推进顺序为安全序列;若无法满足,则称当前系统处于不安全状态。

    2. 银行家算法中的数据结构

    • 可用资源向量Available。其中含有 m 个元素(m 即为资源种类),Available[ j ] 的值表示,当前资源 j 所拥有的个数。
    • 最大需求矩阵Max。这是一个n * m的矩阵(n 即为进程个数),Max[ i ][ j ] 的值表示,进程 i 对于 资源 j 的最大需求值。
    • 分配矩阵Allocation。这是一个n * m的矩阵,Allocation[ i ][ j ] 的值表示,当前系统对于进程 i 已分配资源 j 的个数。
    • 需求矩阵Need。这是一个n * m的矩阵,Need[ i ][ j ] 的值表示,当前进程 i 对于 资源 j 的需求个数。

    上述三个矩阵满足如下关系:

            Need[ i ][ j ] = Max[ i ][ j ] - Allocation[ i ][ j ]

    3. 银行家算法

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

    1. 如果 Requesti[ j ]  <= Need[ i ][ j ] ,便转向步骤(2);否则认为出错,因为它所需要的资源超过所宣布的最大值。
    2. 如果 Requesti[ j ]  <= Available[ j ],便转向步骤(3);否则,表示尚无足够资源,Pi需等待。
    3. 系统尝试着把资源分配给进程Pi,并修改下面数据结构中的数值:

          Available[ j ] -= Requesti[ j ];

          Allocation[ i ][ j ] += Requesti[ j ];

          Need[ i ][ j ] -= Requesti[ j ];

       4. 系统执行安全性算法,检查此次资源分配后是否安全。若安全才正式将资源分配给进程 Pi,以完成本次分配;否则将此次请求视为作废,恢复原来分配状态,让 Pi 等待。

    4. 代码实现

      4.1 银行家算法之例

     

       4.2 安全性检验函数

     1 //安全性检验及输出安全序列
     2 vector<int> CountSafeOrder( vector<int> Ava, vector<vector<int> > Max, 
     3                 vector<vector<int> > All, vector<vector<int> > Need){
     4     int pro_number = Max.size();
     5     int res_number = Ava.size();
     6     vector<bool> Finish(pro_number,false);
     7     vector<int> SafeOrder;
     8     vector<int> temp;
     9     vector<vector<int> >work(pro_number,temp);
    10     
    11     queue<int> q;
    12     int count = 0; //用来记录循环是否超过次数;
    13     for(int i = 0; i < pro_number; i ++)
    14         q.push(i);
    15     while( !q.empty() ){
    16         int num = q.front();
    17         bool arg = true; 
    18         q.pop(); count ++;
    19         //判断当前可用资源是否大于需求
    20         for(int j = 0; j < res_number ; j ++){
    21             if(Ava[j] < Need[num][j] ){
    22                 q.push(num); arg = false; break; 
    23             }
    24         }
    25         //将当前可用资源增加,并记录工作向量
    26         if( arg ){
    27             for(int j = 0; j < res_number && arg; j ++){
    28                 work[num].push_back(Ava[j]);
    29                 Ava[j] += All[num][j];
    30             }
    31             SafeOrder.push_back(num);
    32             count = 0;
    33         }
    34         //如果循环次数超时,则跳出循环
    35         if( count > q.size())
    36             break;
    37     }
    38     return SafeOrder;           
    39 } 

      4.3 资源请求函数

     1 void RequestRes(vector<int> &Ava, vector<vector<int> > &All, 
     2                         vector<vector<int> > &Need, vector<vector<int> >Request, int num){
     3     int res_number = Ava.size();
     4     bool arg = true;
     5     // 判断请求的资源是否满足条件
     6     for(int i = 0; i < res_number; i ++ ){
     7         if(Request[num][i] > Need[num][i] || Request[num][i] > Ava[i] ){
     8             cout << "需求过大,无法满足请等待!
    "; arg = false; break;
     9         }    
    10     }
    11     // 若满足条件,则修改向量值
    12     if( arg ){
    13         for(int i = 0; i < res_number; i ++){
    14             Ava[i] -= Request[num][i];
    15             Need[num][i] -= Request[num][i];
    16             All[num][i] += Request[num][i];
    17         }
    18     }
    19 }
  • 相关阅读:
    ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
    初学Larevel 2014-08-21 11:24 90人阅读 评论(0) 收藏
    初学PHP&MySQL 2014-05-31 12:40 92人阅读 评论(0) 收藏
    codeforces 570 E. Pig and Palindromes (dp)
    codeforces 570 D. Tree Requests (dfs序)
    poj 2157 Maze (bfs)
    cf 570 C. Replacement (暴力)
    cf 570B B. Simple Game(构造)
    cf 570 A. Elections
    hdu 1429胜利大逃亡(续) (bfs+状态压缩)
  • 原文地址:https://www.cnblogs.com/john1015/p/12980235.html
Copyright © 2011-2022 走看看