銀行家算法是荷蘭學者Dijkstra為銀行系統設計的,以確保銀行在發放現金貸款時,不會發生不能滿足所有客戶需要的情況。后來該算法被用在操作系統中,用于避免死鎖
核心思想
:在進程提出資源申請時,先預判此分配是否會導致系統進入不安全狀態。如果會進入不安全狀態,就暫時不答應這次請求,讓該進程先阻塞等待。
假定有五個進程{P0,P1,P2,P3,P4}和三類資源{A,B,C},各種資源的數量分別為10、5、7。在T0時刻的資源分配情況如下
T0時刻的安全性
P1發出請求向量Request1(1,0,2),系統按銀行家算法進行檢查:
#include<stdio.h>
#include <cstdlib>
/*定義數據結構*/
int Max[100][100] ={
0};//最大需求矩陣
int Allocation[100][100]={
0};//已分配矩陣
int Need[100][100]={
0};//需求矩陣
int Available[100]={
0}; //資源可用情況
char Name[100]={
0};//資源名稱
int Work[100]={
0};//記錄系統中當前各類可用資源的數目
int Request[100]={
0};//系統對各類資源請求的數目
int Security[100]={
0};//保存進程在安全情況下的執行順序
int M;//系統中進程的數量
int N;//資源類型的數量
void init()
{
int i=0,j=0;
printf("請輸入可用資源的種類數量:");
scanf("%d",&N);
for(i=0;i<N;i++)
{
printf("請輸入第 %d 個可用資源的名稱: ",i);
scanf("%s",&Name[i]);
printf("請輸入初始可用資源 %c 的數量: ",Name[i]);
scanf("%d",&Available[i]);
}
printf("\n");
printf("請輸入進程的數量:");
scanf("%d",&M);
printf("請輸入進程的Max矩陣:\n");
for(i=0;i<M;i++){
//遍歷每一個進程
for(j=0;j<N;j++){
//輸入第i個進程中每種資源的數量
scanf("%d",&Max[i][j]);
}
}
printf("請輸入進程的Allocation矩陣:\n");
int temp[100]={
0};//為了算新的Available
for(i=0;i<M;i++){
//遍歷每一個進程
for(j=0;j<N;j++){
//輸入第i個進程中每種資源的數量
scanf("%d",&Allocation[i][j]);
//第一個進程需要j類資源的數量:最大需求量-已經分配的
Need[i][j]=Max[i][j]-Allocation[i][j];
temp[j]+=Allocation[i][j]; //統計已經分配的資源量
}
}
for(j=0;j<N;j++)//更新可用資源數目Available
{
Available[j]=Available[j]-temp[j];
}
}
void show(){
//功能:進行資源及進程相關信息顯示
printf("\t--------------------\n");
printf("\t系統當前可用的資源矩陣Available:\n");
int i;
for(i=0;i<N;i++){
printf("%c ",Name[i]);
}
printf("\n");
for(i=0;i<N;i++)
printf("%d ",Available[i]);
printf("\n");
printf("\t系統當前資源分配情況如下: \n");
printf("\t Max Allocation Need\n");
printf("進程名 ");
int j=0;
for(j=0;j<3;j++)//每個進程名要輸出三次
{
for(i=0;i<N;i++){
//遍歷所有的資源名稱
printf("%c ",Name[i]);
}
}
printf("\n");
for(i=0;i<M;i++){
//打印進程
printf("P%d ",i);
for(j=0;j<N;j++){
printf("%d ",Max[i][j]);
}
for(j=0;j<N;j++){
printf("%d ",Allocation[i][j]);
}
for(j=0;j<N;j++){
printf("%d ",Need[i][j]);
}
printf("\n");
}
}
int safe()
{
int Finish[100]={
0};//Finish:系統是否有足夠的資源分配給進程,使之完成運行
// 開始時先令Finish[i]=0,當有祖國資源分配給進程時,再令Finish[i]=1
int i=0;
for(i=0;i<N;i++)
{
Work[i]=Available[i];//在執行安全算法開始時,Work=Available
}
int j=0,count=0,k=0,m=0;
for(i=0;i<M;i++)
{
count=0;//遍歷完一個進程就將count置為0,對新的i號進程資源達標數進行計數
for(j=0;j<N;j++){
//Finish[i]=0表示未執行
if(Finish[i]==0&&Need[i][j]<=Work[j])
{
//如果進程沒有執行且資源需求條件滿足
count++;//統計有多少種資源滿足條件
if(count==N) //表示對于i號進程所有資源都滿足
{
Finish[i]=1;//記錄i號進程為可執行
for(k=0;k<N;k++)
{
Work[k]=Work[k]+Allocation[i][k];
}
Security[m]=i;//記錄第m個執行的是i號進程
i=-1;//將i置為-1;通過for循環執行i++后變為0,從第一個進程重新開始找
m++;
}
}
}
}
for(i=0;i<M;i++)
{
if(Finish[i]==0)
{
printf("系統不安全\n");
return -1;
}
}
printf("系統時安全的\n");
for(i=0;i<M;i++)
{
printf("P%d",Security[i]);
if(i<M-1)
printf("-->");
}
printf("\n");
return 0;
}
bool bank()
{
printf("請輸入希望手動分配資源的進程的編號:");
int Id,j;
bool flag=true;
while(scanf("%d",&Id))
{
if(Id < 0 || Id > M-1)
printf("進程不存在!請重新輸入\n請輸入希望手動分配資源的進程的編號:");
else break;
}
printf("請輸入請求資源數(%d個):\n",N);
for(j=0;j<N;j++)
{
scanf("%d",&Request[j]);
}
printf("開始為進程P%d分配資源:\n",Id);
for(j=0;j<N;j++)
{
if(Request[j]>Need[Id][j]){
printf("進程請求資源數大于所需資源數,無法分配!\n");
flag=false;
break;
}
else if(Request[j]>Available[j]){
printf("進程請求資源數大于可用資源數,無法分配!\n");
flag=false;
break;
}
else{
Available[j] -= Request[j];
Allocation[Id][j] += Request[j];
Need[Id][j] -= Request[j];
}
}
return flag;
}
int main()
{
printf("\t--------------------------\n");
printf("\t|| ||\n");
printf("\t|| 模擬銀行家算法 ||\n");
printf("\t|| ||\n");
printf("\t|| ||\n");
printf("\t|| Sparky ||\n");
printf("\t|| ||\n");
printf("\t--------------------------\n");
init();
show();
safe();
char choice;
printf("\t-------------------------------------\n");
printf("\t|| ||\n");
printf("\t|| 手動進行資源請求 ||\n");
printf("\t|| 輸入R(r)請求資源 ||\n");
printf("\t|| 輸入E(e)退出程序 ||\n");
printf("\t|| ||\n");
printf("\t|| ||\n");
printf("\t-------------------------------------\n");
while(true){
printf("請選擇資源分配還是退出");
scanf("%s",&choice);
if(choice=='R'||choice=='r')
{
if(bank()){
safe();
show();
//exit(0);
}else{
//說明沒有分配資源,不必退出程序。
show();
}
}
else if(choice=='E'||choice=='e')
{
exit(0);
}
else
printf("請正確選擇");
}
return 0;
}
3種資源:
A B C
10 5 7
Max矩陣
7 5 3
3 2 2
9 0 2
2 2 2
4 3 3
Allocation
0 1 0
2 0 0
3 0 2
2 1 1
0 0 2
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
北京地鐵9號線全程?北京地鐵9號線是北京一條已建成運營的城市軌道交通線路,于2011年12月31日開通南段(郭公莊站至北京西站),2012年10月12日開通豐臺東街站,2012年12月30日開通北段(白堆子站至國家圖書館站)。2013年,北京地鐵9號線。[1][20][21]據2020年3月北京地鐵官網顯示,北京地鐵9號線為南北走向,北起國家圖書館,途經白石橋南、白堆子、北京西站、豐臺東街等地,南...
wordpress,typecho,Z-Blog,emlog,boblog哪個最輕快?事實上,速度不僅僅取決于某個程序。節目需要選擇合適的節目,節目是否能滿足自己的需要。WordPress是目前廣泛使用的開源程序。國內網站如愛凡納,理學網和cnBeta都是用WordPress開發的,速度也很好。這主要取決于服務器在各個方面的優化。同時,W Ordpress有很多資源,很多問題可以很快解決。但是,其...
qq綠鉆和黃鉆區別?綠鉆和黃鉆的區別是:的綠鉆是指音樂給用戶提供的一些特權服務,黃鉆是空間的會員。不同的會員所對應的特權不同,綠鉆可以用來下載高質量音樂,黃鉆則可以給空間添加背景,裝飾,文字,等的美化還有其他的特權例如的vip和svip等,可以根據所需進行購買。黃鉆有什么用?有什么好處?開哪個鉆最劃來?騰訊的鉆都是各有功能的! 黃鉆主要是空間裝扮,皮膚等可以免費用,好處就是空間比普通用戶的弄得漂亮...