C語言模擬銀行家演算法

2021-10-10 06:41:04 字數 4702 閱讀 6662

銀行家演算法需求:

乙個程式對資源的最大需求量不超過系統的最大資源

程式可以分多次申請資源,但是申請資源的總量不能超過最大需求量

當系統現有資源不能滿足程式的需求時,可以推遲分配資源,但是總能滿足程式對資源的需求

當程式獲得了全部的資源後,要在有限的時間內歸還資源

系統的安全/不安全狀態:

在程式申請資源時,當系統的擁有的資源不能滿足程式剩餘所需的全部資源時,則處於不安全狀態

c**實現:

標頭檔案的匯入和預定義

#include

#include

#include

#include

#include

#include

#include

#define resources_max 5

//系統擁有5種資源

#define u32 unsigned int

#define u8 char

#define true 1

#define false 0

#define programs_t struct programs *

#define critical_resources_t struct critical_resources *

結構體和列舉的建立

/*建立資源名列舉型別*/

enum resources;/*

父程序和子程序的共享資源

system_possess_resouces 臨界資源 系統剩餘的資源數量

wait_visit_number 判斷有多少個程序在等待訪問臨界資源

wait_get_number 判斷有多少個程序在等待資源的分配,等待數量等於總程序數時代表出現死鎖

all_programs_size 總程序數量

sinal_number 訊號量

program_set_up 當前程序的數量

max_programs 儲存最大程序數(當n個程序都初始化完畢後才接著往下執行)

sleep_time 每個子程序建立出來後都會通過休眠來和其他子程序錯開cpu時間避免隨機數相同

*/struct critical_resources;/*

程序需求結構體

max_resources 程序需要的全部資源

get_resources 程序獲取的資源數量

need_resources 程序需要的資源數量

random_next_resources 程序這次要申請多少資源,利用隨機數來確定

program_number 程序號

judge_success_get_resources 判斷是否成功分配到了資源,是則random_next_resources清空

*/struct programs

;

程序阻塞函式

/*

迴圈等待訊號量

*/void

program_wait

(critical_resources_t crts)

} crts->signal_number--

;//訊號量-1

crts->wait_visit_number--

;}

釋放訊號量函式

void

release_signal

(critical_resources_t crts)

申請資源函式

u8 request_resources

(critical_resources_t crts , programs_t prg)

prg->random_next_resources[i]=(

random()

%prg->need_resources[i]+1

);printf

("%d random request resource%d size:%d \n"

,prg->program_number, i +

1, prg->random_next_resources[i]);

//usleep(1000);}}

/* 對系統安全性進行判斷,如果分配資源後系統處於不安全狀態則不給予分配

*/if

( prg->need_resources[resource1]

<= crts->system_possess_resources[resource1]

&& prg->need_resources[resource2]

<= crts->system_possess_resources[resource2]

&& prg->need_resources[resource3]

<= crts->system_possess_resources[resource3]

&& prg->need_resources[resource4]

<= crts->system_possess_resources[resource4]

&& prg->need_resources[resource5]

<= crts->system_possess_resources[resource5]

)bzero

(prg->random_next_resources,

sizeof

(prg->random_next_resources));

}else

return true;

}

main主函式體

int

main

(int argc ,

char

** ar**)

//使用mmap的檔案對映來實現父程序和子程序的共享記憶體,因為程序之間有從屬關係,所以在fd處只需要傳入-1

critical_resources_t crt =

(critical_resources_t)

mmap

(null

,sizeof

(struct critical_resources)

, prot_read | prot_write , map_anon | map_shared ,-1

,0);

//共享記憶體的初始化

for(

int i =

0; i < resources_max ; i++

) crt->system_possess_resources[i]=10

; crt->wait_visit_number =0;

crt->wait_get_number =0;

crt->all_programs_size =

atoi

(ar**[1]

);crt->signal_number =1;

crt->program_set_up =0;

crt->sleep_time =1;

crt->max_programs =0;

pid_t pid;

//迴圈建立程序

for(

int i =

0; i <

atoi

(ar**[1]

);++i)

if(pid >0)

if(0== crt->all_programs_size)

break

;wait

(null);

}printf

("all programs operation end..\n");

}else

//printf("%d max need resources : %d , %d , %d , %d , %d" , prm.program_number , prm.max_resources[resource1] , prm.max_resources[resource2] , prm.max_resources[resource3] , prm.max_resources[resource4]);

printf

("%d max need resources : "

, prm.program_number)

;for

(int i =

0; i < resources_max ; i++

)printf

("\n");

while

(true)

//執行到這裡開始阻塞等待所有子程序都初始化完畢再接著執行

while

(true)

release_signal

(crt);}

}return0;

}

這是之前的乙個作業系統作業,本來還希望實現列印程序資源需求表,但是似乎需要再建立乙個共享記憶體進行鍊錶操作,比較懶就沒有實現

在列印過程中是否存在乙個程序還未列印結束出現另乙個程序搶占列印造成兩個程序的輸出內容錯亂的風險?

銀行家演算法 C

銀行家演算法.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std define m 5 程序數 define n 3 資源數 define false 0 define true 1 int ailable n 系統可用資源數...

銀行家演算法

我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。為保證資金的安全,銀行家規定 1 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客 2 顧客可以分期貸款,但貸款的總數不能超過最大需求量 3 當銀行家現有的...

銀行家演算法

銀行家演算法 banker s algorithm 是乙個避免死鎖 deadlock 的著名演算法,是由艾茲格 迪傑斯特拉在1965年為t.h.e系統設計的一種避免死鎖產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全執行。就像我們從銀行貸快一樣,首先銀行會考慮到我們有沒有償還能力...