1. 程式人生 > >作業系統:銀行家演算法(避免死鎖)

作業系統:銀行家演算法(避免死鎖)

演算法介紹:


程式實現:

/*****************************************************

			程式:銀行家演算法實現
			作者:小單
			時間: 2013年11月5日

******************************************************/
#include <iostream>
#include <string>
using namespace std;

#define MAXPROCESS  50  //所能執行的程序最大數
#define MAXRESOURCE 50  //資源最大數

//銀行家演算法中的資料結構
int Available[MAXRESOURCE];  //可用資源向量
int Max[MAXPROCESS][MAXRESOURCE];   //最大需求矩陣
int Allocation[MAXPROCESS][MAXRESOURCE];  //分配矩陣
int Need[MAXPROCESS][MAXRESOURCE];   //需求矩陣
int Request[MAXPROCESS][MAXRESOURCE];  //請求向量

//安全性演算法中的資料結構
int Work[MAXRESOURCE];    //工作向量
bool Finish[MAXPROCESS];    //表示是否有足夠的資源分配給程序
int SafeSeries[MAXPROCESS];  //安全序列

////////////////////////////////////////////////////
int n;  //當前系統中的程序數
int m;   //當前系統中的資源數



//////////////////////////////////////////////////////////
//演算法初始化
void InitAlgorithm()
{
	cout << "請輸入系統所要執行的程序總數:";
	cin >> n;
	cout << "請輸入系統中分配的資源種類數:";
	cin >> m;
	int i,j;

	//可利用資源向量的初始化
	cout << "請分別輸入" << m << "類資源的當前可利用資源數目:";
	for( i = 0; i < m; ++i )
	{
		cin >> Available[i];
	}

	//最大需求矩陣的初始化
	cout << "請輸入各程序對各資源的最大需求矩陣(按"
		<< n << "*" << m << "矩陣格式輸入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Max[i][j];
		}
	}

	//分配矩陣的初始化
	cout << "請輸入分配矩陣(按"
		<< n << "*" << m << "矩陣格式輸入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Allocation[i][j];
		}
	}

	//需求矩陣的初始化
	cout << "請輸入此刻的需求矩陣(按"
	<< n << "*" << m << "矩陣格式輸入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Need[i][j];
		}
	}

}

//輸出資源分配情況
void PrintSrcAlloc()
{
	int i,j;
	for( i = 0; i < n; ++i )
	{
		cout << "程序P" << i << "的總體分配情況:" << endl;
		cout << "\tMax: ";
		for( j = 0; j < m; ++j )
		{
			cout << Max[i][j] << " ";
		}
		cout << endl;

		cout << "\tAllocation:";
		for( j = 0; j < m; ++j )
		{
			cout << Allocation[i][j] << " ";
		}
		cout << endl;

		cout << "\tNeed:";
		for( j = 0; j < m; ++j )
		{
			cout << Need[i][j] << " ";
		}
		cout << endl;
		cout << endl;
	}

	cout << "可利用資源情況:";
	for( i = 0; i < m; ++i )
	{
		cout << Available[i] << " ";
	}
	cout << endl;
	cout << endl;

}

//輸出此時程序iProcess利用安全性演算法的分析情況
void PrintSafeSeries( int iProcess )
{
	int j;
	cout << "程序P" << iProcess << "的安全性分析情況:" << endl;
	cout << "\tWork: ";
	for( j = 0; j < m; ++j )
	{
		cout << Work[j] << " ";
	}
	cout << endl;
	
	cout << "\tNeed:";
	for( j = 0; j < m; ++j )
	{
		cout << Need[iProcess][j] << " ";
	}
	cout << endl;
	
	cout << "\tAllocation:";
	for( j = 0; j < m; ++j )
	{
		cout << Allocation[iProcess][j] << " ";
	}
	cout << endl;
	
	cout << "\tWork + Allocation:";
	for( j = 0; j < m; ++j )
	{
		cout << Work[j] + Allocation[iProcess][j] << " ";
	}
	cout << endl;

	cout << "Finish[" << iProcess << "] = " << Finish[iProcess] << endl;
	cout << endl;


}

//判斷是否存在安全序列
bool IsSafe()
{
	int i;
	for( i = 0; i < n; ++i )
	{
		if( !Finish[i] )
			return false;  //不存在安全序列
	}
	return true;//存在安全序列
}

//介面
void Menu()
{
	cout << "\t\t ==========================================="  << endl;
	cout << "\t\t|                                           |" << endl;
	cout << "\t\t|         程式:銀行家演算法的模擬實現        |" << endl;
	cout << "\t\t|         作者:小單                        |" << endl;
	cout << "\t\t|         時間:2013.11.5                   |" << endl;
	cout << "\t\t|                                           |" << endl;
	cout << "\t\t ==========================================="  << endl;
}


//選出滿足條件的程序
//函式返回程序編號
//若不存在滿足條件的,則返回false,否則返回true
bool SelectProcess( int &iProcNum )
{
	iProcNum = -1;
	int i, j;
	for( i = 0; i < n; ++i )
	{
  		if ( Finish[i] )  //Finish[i] != false
		{
			continue;
		}
		for ( j = 0; j < m; ++j )
		{
			if ( Need[i][j] > Work[j] )
			{
				break;
			}
		}
		if ( j == m )  //滿足條件
		{
			iProcNum = i;
			return true;  
		}
	}
	return false;
}

//安全性演算法
bool SafeAlgorithm()
{
	int i,j;

	//初始化Finish向量
	for( i = 0; i < n; ++i )
	{
		Finish[i] = false;
	}

	//初始化工作向量
	for ( j = 0; j < m; ++j )
	{
		Work[j] = Available[j];
	}

	int iProcNum;
	//選擇滿足條件的程序
	i = 0;
	while( SelectProcess( iProcNum) )
	{
		Finish[iProcNum] = true;
		PrintSafeSeries( iProcNum );  //輸出此時利用安全性演算法的分析情況
		int k;
		for ( k = 0; k < m; ++k )
		{
			Work[k] += Allocation[iProcNum][k];
		}
		SafeSeries[i++] = iProcNum;  //程序號加入安全序列陣列

		
	}

	if( IsSafe() )
	{
		return true;  //存在一個安全序列
	}

	return false;  //不存在一個安全序列

}


//銀行家演算法
void BankAlgorithm()
{
	int i,j;
	cout << "請輸入請求分配的程序號(0 - " << n-1 << "): ";
	cin >> i;
	cout << "請依次輸入程序P" << i << "對" << m << "類資源的請求分配量: ";
	for( j = 0; j < m; ++j )
	{
		cin >> Request[i][j];
	}

	//步驟一
	for( j = 0; j < m; ++j )
	{
		if( Request[i][j] > Need[i][j] )
		{
			cout << "請求的資源已超過該資源宣佈的最大值,請求資源失敗!!" << endl;
			return;
		}
	}

	//步驟二
	for( j = 0; j < m; ++j )
	{
		if( Request[i][j] > Available[j] )
		{
			cout << "沒有足夠的資源,請求資源失敗!!" << endl;
			return;
		}
	}

	//步驟三
	//系統試探著把資源分配給程序Pi,並修改相應的數值
	for ( j = 0; j < m; ++j )
	{
		Available[j] -= Request[i][j];
		Allocation[i][j] += Request[i][j];
		Need[i][j] -= Request[i][j];
	}

	//步驟四
	//系統執行安全性演算法
	if ( !SafeAlgorithm() ) //檢測到不安全,則恢復原來的狀態
	{
		for ( j = 0; j < m; ++j )
		{
			Available[j] += Request[i][j];
			Allocation[i][j] -= Request[i][j];
			Need[i][j] += Request[i][j];
		}	
	}

}



int main()
{
	Menu();
	InitAlgorithm();
	PrintSrcAlloc();  //列印當前資源情況
	system("pause");
	SafeAlgorithm();
	while(1)
	{
		string flag;
		if( IsSafe() )
		{
			//存在安全序列
			cout << "恭喜!!資源分配成功!!" << endl;
			int i;
			cout << "此時刻存在的一個安全序列為:";
			for ( i = 0; i < n - 1; ++i )
			{
				cout << "P" << SafeSeries[i] << "-->";
			}
			cout << "P" << SafeSeries[i] << endl;
			cout << "繼續操作嗎?[Y/N]:";
			cin >> flag;
		}
		else
		{
			cout << "資源分配失敗!!" << endl;
			cout << "繼續操作嗎?[Y/N]:";
			cin >> flag;
		}

		if ( flag == "Y" || flag == "y" )
		{
			;
		}
		else
		{
			break;
		}
		BankAlgorithm(); //執行銀行家演算法

	}


	return 0;

}

程式測試結果如下:


相關推薦

作業系統銀行家演算法避免

演算法介紹: 程式實現: /***************************************************** 程式:銀行家演算法實現 作者:小單 時間: 2013年11月5日 ***********************

作業系統銀行家演算法避免

銀行家演算法是用來避免死鎖的,該方法將系統的狀態分為安全和不安全,只要系統處於安全狀態,便可避免死鎖的發生。之所以成為銀行家演算法,是由於該演算法能用於銀行系統現金貸款的發放而得名。 安全狀態的定義為:系統按照某種程序順序,如,來為程序分配資源,直到最大需求,使每個程序都能

C語言作業系統——磁碟排程演算法FCFS/SSTF/CSAN

首先設定disk_scheduling.h標頭檔案#include "stdio.h"#include "math.h"#include "windows.h"#define MAX 50void FCFS(int num[],int first,int count);//先

作業系統輪轉排程演算法c語言描述

/*輪轉排程演算法*/ #include<stdio.h> #include<malloc.h> #define N 100 typedef struct RR{int arivaltime;int gotime,copytime;int final

又是二分避免迴圈

You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For examp

作業系統銀行家演算法避免

  (3)  P4請求資源:P4發出請求向量Request4(3,3,0),系統按銀行家演算法進行檢查:   ① Request4(3,3,0)≤Need4(4,3,1);   ② Request4(3,3,0)≥Available(2,3,0),讓P4等待。(附:作業系統第三版這裡寫成了≤符號,需更正)

避免銀行家演算法

概念 Dijksta提出(1965): 仿照銀行家發放貸款時採取的控制方式而設計的一種死鎖避免演算法。 應用條件 固定數量的程序中共享數量固定額資源 每個程序預先制定完成工作所需的最大資源

利用銀行家演算法避免的介紹與舉例

一、資料結構   1.多個程序: { P0,P1,P2,P4 } 代表1,2,3,4四個需要臨界資源的程序   2.幾種資源:{ A, B ,C } 代表A,B,C三種臨界資源   3.Max:最大需求矩陣(程序完成執行需要的各資源總量)     Allocation:分配矩陣(某個程序現在

避免銀行家演算法C++程式實現

 本篇博文為追憶曾經寫過的算法系列第二篇(20081021) 溫故知新 目的:具有代表性的死鎖避免演算法是Dijskstra給出的銀行家演算法。本實驗是基於銀行家演算法的思想通過編寫C++程式實現銀行家演算法的計算機程式化,使其更實用。同時也加深了有關自願申請、避免死

避免銀行家演算法

死鎖的定義>    如果一組程序中的每一個程序都在等待僅由該組程序中的其他程序才能引發的事件,那仫該組程序就是死鎖的. 產生死鎖的必要條件>     1).互斥條件:程序對所分配到的資源進行排它性使用,即在一段時間內,某資源只能被一個程序佔用。如果此時還有其他程

java面試題之產生的條件,以及如何避免銀行家算法,產生死後如何解決阿裏面試題

需求量 info 強行 進程 spa tro 否則 破壞 阻塞 死鎖產生的四個必要條件: 互斥:一個資源每次只能被一個進程使用(資源獨立) 請求與保持:一個進程因請求資源而阻塞時,對已獲得的資源保持不放(不釋放鎖) 不剝奪:進程已獲得的資源,在未使用之前,

11.避免銀行家算法

貸款 com 就是 資金 得到 利潤 log 完成 style 銀行家算法,顧名思義,是仿照銀行發放貸款采取的控制方式而設計的一種死鎖避免算法. 該算法的策略是實現動態避免死鎖.要明白此算法,就要明白銀行的貸款策略.   銀行的目的是讓利潤最大化,風險最低,為了控制

Java併發程式設計系列避免

避免死鎖 (1)避免一個執行緒同時獲取多個鎖 (2)避免一個執行緒在鎖內佔用多個資源,儘量保證每個鎖只佔用一個資源 (3)使用定時鎖,使用lock.trylock(timeout)替代內部鎖機制 (4)

產生的原因以及避免演算法

一.死鎖的概念 在多道程式系統中,雖可藉助於多個程序的併發執行,來改善系統的資源利用率,提高系統的吞吐量,但可能發生一種危險━━死鎖。所謂死鎖(Deadlock),是指多個程序在執行中因爭奪資源而造成的一種僵局(Deadly_Embrace),當程序處於這種僵

作業系統銀行家演算法安全序列不唯一

#include <stdio.h> #include <string.h> #define size 50 typedef struct bank { int process;//程序數 int resource;//資源數

《計算機作業系統》總結五

例如,對一條編譯的語句,該程序可以建立一個子程序執行編譯程式對使用者源程式進行編譯。類似地,子程序也可以繼續建立子程序去完成指定的功能。因此,一個作業就動態地轉換成了一組執行實體——程序族。當父程序遇到作業說明書中的“撤出作業”的語句時,將該作業從執行狀態改變為完成狀態,將作業及相關結果送入磁碟上的輸出井。作

作業系統銀行家演算法實現C語言

# 【作業系統】銀行家演算法實現(C語言) ##### 注意:本人編碼水平很菜。算是自己的一個總結。可能會有我還沒有發現的bug。如果有人發現後可以指出,不勝感激。 ## 1.銀行家演算法: > 我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於

面試官什麼是?怎麼排查?怎麼避免

突然發現我的圖解系統缺了「死鎖」的內容,這就來補下。 在面試過程中,死鎖也是高頻的考點,因為如果線上環境真多發生了死鎖,那真的出大事了。 這次,我們就來系統地聊聊死鎖的問題。 死鎖的概念; 模擬死鎖問題的產生; 利用工具排查死鎖問題; 避免死鎖問題的發生; 死鎖的概念 在多執行緒程式設計中,我們為了防

11.python並發入門part4 與遞歸

python lock 線程 互斥鎖 rlock 一、關於死鎖。死鎖,就是當多個進程或者線程在執行的過程中,因爭奪共享資源而造成的一種互相等待的現象,一旦產生了死鎖,不加人工處理,程序會一直等待下去,這也被稱為死鎖進程。下面是一個產生“死鎖”現象的例子:import threadingim

mysql 開發進階篇系列 14 問題(避免查看分析)

mysq cit 優化 業務流程 update span tro isp 問題 一. 概述   通常來說,死鎖都是應用設計問題,通過調整業務流程,數據庫對象設計,事務大小,以及訪問數據庫的sql語句,絕大部分死鎖都可以避免,下面介紹幾種避免死鎖的常用 方法.  1. 在應