C言語のアルゴリズムバンカー

 

 

する#include <stdio.hに> 
する#include <STDLIB.H> 
の#include <string.hの> 
する#include <stdbool.h> // BOOL型


INT N = 0; //プロセスの数
リソースの//数; M = 0 INT 
int型*利用可能; //リソース利用可能ベクトルM 
のint **マックス; //最大需要* N行列M 
のint **割り当て; // N *割り当て行列M 
のint **必要性; //ニーズはN * Mマトリックス


//初期化データ構造は
、INIT(ボイド)

//データ構造の破壊
)ボイドDestoryは(; 

//セキュリティアルゴリズムチェック
、ボイドsecurity_checks()


INTメイン(INTのargc、char型のconst * ARGV []){ 
    INIT(); 
    security_checks()を; 
    Destoryは(); 
    戻り0; 
} 


/ ** 
 *初期化データ構造
 * /  
ボイドのinit(){
    のprintf( "リソースの種類の入力プロセス番号とシーケンス番号");



            printf( "最大需要との取得したリソース型%dの数の注文入力プロセス%のD:"、I、J);  
            scanfの( "%D%D"、&(マックス[I] [J])、&(アロケーション[I] [J]))。
            利用可能な[J] - =割当[I]、[J]; 
            必要性[I] [J]マックス= [I]、[J] -割り当て[I]、[J]; 
        } 
    } 
} 


/ ** 
 *データ構造を破壊する
 * / 
ボイドDestoryは(){ 
    フリー(使用可能)
    のための(INT I = 0、I <N。 I ++){ 
        無料(マックス[I]); 
        無料(ニード[I]); 
        無料(割当[I]); 
    } 
} 


/ ** 
 *セキュリティ検査アルゴリズム
 * / 
無効security_checks(){ 
    int型の作品[M]; 
    仕上げBOOL [N]; 
    のための(INT I = 0、I <N; I ++){ 
        完了[I] = falseに; 
    } 
    のため(int型I = 0; <M I;私は++){ 
        作品は[I]が利用可能= [I] ; 
    } 

    プロセスの数// END; INT finish_count = 0 
    チャーsecurity_seq [N] [5] ; // セキュリティ配列
    一方、(真の){ 
        BOOL = had_allocated falseに; //ラウンド判定する割り当てるかどうかを
        (INT I = 0、I <N; I ++)のために{ 
            (完了[I] == falseには){//プロセスの終わりではない見つけた場合
                BOOL all_valid = trueに; 
                のため(int型J = 0; J <M; J ++){//もし、すべてのリソース[i]の[j]が少ない仕事[J]よりも、割り当てられているの必要性
                    (必要性[I] [J場合]>仕事[J]){ // 満たされていないときはいつでも、無割り当て
                        all_valid = falseに、
                        BREAK; 
                    } 
                }
                IF(all_valid == TRUE){//リソースを割り当て、回収
                    (INT J = 0; J <M、J ++)のために{ 
                        仕事[J] + =配分[I]、[J]; 
                    } 
                    完了[I] = trueに。
                    =真had_allocatedに; 
                    sprintfの(security_seq [finish_count ++]、 "Pの%のD \ 0"、I); 
                } 
            } 
        } 
        IF(finish_count == N){//エンドセキュリティ
            プット( "安全な状態でシステム"); 
            のprintf( "プロセス安全性配列は:"); 
            (INTのために私は= 0; I <N; I ++){//出力用安全シーケンス
                のprintf( "[%S]"、security_seq [I]); 
                IF(Iは、N = - ! 1)のprintf( "=>" );
                他プット( ""); 
            } 
            リターン; 
        }そうIF(== falseにhad_allocated){//終了危険
            プット( "安全でない状態でシステム"); 
            リターン; 
        } 
    } 
}

  

おすすめ

転載: www.cnblogs.com/yuanyb/p/11934855.html