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 }
  • 相关阅读:
    vue中的watch
    css渲染层次理解及实际问题
    css中一些设计总结
    python打包文件(nuitka)
    vue实现前后端文件的上传和下载
    pyqt5使用多线程避免程序假死
    使用python编写shell脚本并运行
    记录一下WordNet多线程下的bug
    利用多线程对大数组进行处理
    nginx配置静态文件
  • 原文地址:https://www.cnblogs.com/john1015/p/12980235.html
Copyright © 2011-2022 走看看