• 银行家算法


    操作系统上机实习课,简单地实现了一下银行家算法==具体的算法流程就不写了==

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<string>
      5 #include<algorithm>
      6 using namespace std;
      7 #define n 5//进程个数
      8 #define m 3//资源种类
      9 string safety;
     10 int Available[m]={2,3,3};//可用资源向量
     11 int Request[m];//进程请求向量
     12 int Work[m];
     13 bool Finish[n];
     14 int Alloc[n][m]={
     15     {2,1,2},
     16     {4,0,2},
     17     {3,0,5},
     18     {2,0,4},
     19     {3,1,4},
     20 };//已分配资源数量
     21 int Need[n][m]={
     22     {3,4,7},
     23     {1,3,4},
     24     {0,0,3},
     25     {2,2,1},
     26     {1,1,0},
     27 };//资源需求量
     28 
     29 //判断是否合法
     30 bool Is_legal(int index)
     31 {
     32     bool flag=true;
     33     for(int i=0;i<m;i++){
     34         if(Request[i]>Available[i]||Request[i]>Need[index][i]){
     35             flag=false;break;
     36         }
     37     }
     38     if(!flag)return false;
     39     return true;
     40 }
     41 
     42 //试探性分配
     43 void Change(int index)
     44 {
     45     for(int i=0;i<m;i++){
     46         Available[i]-=Request[i];
     47         Alloc[index][i]+=Request[i];
     48         Need[index][i]-=Request[i];
     49     }
     50 }
     51 
     52 //取消试探性分配
     53 void Rechange(int index)
     54 {
     55     for(int i=0;i<m;i++){
     56         Available[i]+=Request[i];
     57         Alloc[index][i]-=Request[i];
     58         Need[index][i]+=Request[i];
     59     }
     60 }
     61 
     62 //安全性检查
     63 bool Check(int index)
     64 {
     65     memset(Finish,false,sizeof(Finish));
     66     bool flag=true;
     67     safety="";safety+=index+'0';
     68     for(int i=0;i<m;i++){
     69         Work[i]=Available[i];
     70         if(Work[i]<Need[index][i])flag=false;
     71     }
     72     if(!flag)return false;
     73     for(int i=0;i<m;i++)Work[i]+=Alloc[index][i];
     74     Finish[index]=true;
     75     for(int i=0;i<n;i++)
     76     {
     77         if(Finish[i]==false){
     78             flag=true;
     79             for(int j=0;j<m;j++){
     80                 if(Work[j]<Need[i][j]){ flag=false;break; }
     81             }
     82             if(flag){
     83                 for(int j=0;j<m;j++){
     84                     Work[j]+=Alloc[i][j];
     85                 }
     86                 safety+=i+'0';
     87                 Finish[i]=true;
     88                 i=-1;
     89             }
     90         }
     91     }
     92     for(int i=0;i<n;i++){
     93         if(Finish[i]==false)return false;
     94     }
     95     return true;
     96 }
     97     
     98 
     99 int main()
    100 {
    101     int index;
    102     while(scanf("%d",&index),--index>=0&&index<n)
    103     {
    104         for(int i=0;i<m;i++)
    105             scanf("%d",&Request[i]);
    106         if(!Is_legal(index)){ puts("不合法");continue; }
    107         Change(index);
    108         if(Check(index))
    109         {
    110             for(int i=0;i<n;i++){
    111                 printf("%d ",safety[i]-'0'+1);
    112             }
    113             puts("");
    114         }else puts("安全性检查失败");
    115         Rechange(index);
    116     }
    117     return 0;
    118 }
    119 
    120 
    121 
    122 
    123         
    124         
    125 
    126         
    127         
    View Code
  • 相关阅读:
    敏捷结果30天之第十七天:找出高效时间,并利用它来处理重要事情
    每天一个linux命令(13):less 命令
    敏捷结果30天之第十九天:你在为谁做事
    每天一个linux命令(6):rmdir 命令
    每天一个linux命令(11):nl命令
    代码重构学习笔记三:重构72招式
    每天一个linux命令(4):mkdir命令
    敏捷结果30天之第二十二天:设计你的一天
    敏捷结果30天之第二十一天:正面失败,吸取教训,改善结果
    每天一个linux命令(8):cp 命令
  • 原文地址:https://www.cnblogs.com/wally/p/3125239.html
Copyright © 2020-2023  润新知