する#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){//終了危険 プット( "安全でない状態でシステム"); リターン; } } }