zoukankan      html  css  js  c++  java
  • 银行家算法

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

      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
  • 相关阅读:
    【Kafka】《Kafka权威指南》——从Kafka读取数据
    【Kafka】《Kafka权威指南》——分区partition
    【Kafka】《Kafka权威指南》——写数据
    【Kafka】《Kafka权威指南》入门
    六大设计原则
    EXCEPTION_ACCESS_VIOLATION(0xc0000005)
    属性文件——Java&Spring
    Maven——向Maven本地仓库中手动添加依赖包(ps:ojdbc.jar)
    使用Python轻松批量压缩图片
    Nginx常用命令,解决你日常运维的烦恼
  • 原文地址:https://www.cnblogs.com/wally/p/3125239.html
Copyright © 2011-2022 走看看