銀行家算法

1.設計目的與要求

1.1設計目的

????????了解銀行家算法中使用的數據結構和求安全序列算法,并進一步加深對避免死鎖算法及其實現過程的理解。

1.2設計要求

????????通過編寫和調試一個系統動態分配資源的簡單模擬程序,觀察死鎖產生的條件,并采用適當的算法,有效地防止和避免死鎖的發生。

2.設計思想及系統平臺

2.1設計思想

????????基本思想分為兩個模塊,一是銀行家算法模塊,二是安全性檢查模塊。當有進程申請資源時,先檢查系統是否能夠滿足進程的請求,此時程序進入安全性檢查模塊,如果安全就分配,不安全就拒絕申請。

????????本算法的數據結構:

? ? ? ? 1)可利用資源向量Available。這是一個含有m個元素的數組,其中的每一個元素代表一類可利用的資源數目。

? ? ? ? 2)最大需求矩陣Max。這是一個n×m的矩陣,定義了系統中n個進程中的每一個進程對m類資源的最大需求。

? ? ? ? 3)分配矩陣Allocation。這也是一個n×m的矩陣,定義了系統中每一類資源當前已分配給每一進程的資源數。

? ? ? ? 4)需求矩陣Need。這也是一個n×m的矩陣,用以表示每一個進程尚需的各類資源數。

????????由數學知識可知,Need[i,j]=Max[i,j]-Allocation[i,j]。

2.2系統平臺及使用語言

????????CodeBlocks,C++

3.詳細算法描述

1)初始化函數Init()

????????用戶輸入數據,初始化可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、 需求矩陣NEED。

?

2)銀行家算法Order()

????????當進程Pi發出資源請求后,系統按以下步驟進行檢查:

????????①如果Request[i,j]<=Need[i,j],便轉向步驟②;否則出錯,因為它請求的資源數已超過它的需求最大值。

????????②如果Request[i,j]<=Available[j],便轉向步驟③;否則,表示當前資源不足,Pi須等待

????????③系統試探著把資源分配給進程Pi,并修改下面數據結構中的數值:Available[j]= Available[j]-Request i[j]、Allocation[i,j]= Allocation[i,j]+Request[i,j]、Need[i,j]= Need[i,j]-Request[i,j]

????????④系統執行安全性算法,檢查此次資源分配后系統是否處于安全狀態。若安全,才正式將資源分配給進程Pi;否則,恢復原來的資源分配狀態,讓進程Pi等待。

?

3)安全性檢查算法Safecheck()

????????①設置兩個向量:工作向量Work,表示系統可提供給進程繼續運行所需的各類資源數目,初始化Work=Available;Finish,表示系統是否有足夠的資源分配給進程,初始化Finish[i]=false;當有足夠資源分配給進程時,再令Finish[i]=true。

????????②從進程集合中找到一個能滿足下述條件的進程:Finish[i]=false;Need[i,j]≤Work[j];若找到,執行步驟③,否則,執行步驟④。

????????③假設進程Pi獲得資源后,可順利執行,直至完成,并釋放出分配給它的資源,故應執行:Work[j]= Work[j]+Allocation[i,j];Finish[i]=true;go to step ②

????????④如果所有進程的Finish[i]=true都滿足,則表示系統處于安全狀態;否則,系統處于不安全狀態。

4.源代碼

#include <iostream>
#include <vector>
using namespace std;
#define MAX 20
int n_process;//表示進程的個數
int n_resource;//表示資源的個數
int Resource[MAX];//表示資源的總數
int Max[MAX][MAX];//表示進程對每類資源的最大需求量
int Allocation[MAX][MAX];//表示系統給進程已分配每類資源的數目
int Need[MAX][MAX];//表示進程還需各類資源數目
int Available[MAX];//表示系統當前剩下的資源
int Work[MAX];//表示安全性檢查的中間變量
bool Finish[MAX];//表示資源是否被安全性檢查過
vector<int> Safeorder;//表示安全序列
void Menu()
{cout << "------------銀行家算法----------------" << endl;cout << "*          1.初始化數據              *" << endl;cout << "*          2.申請資源                *" << endl;cout << "*          3.顯示資源分配情況        *" << endl;cout << "*          4.退出                    *" << endl;cout << "--------------------------------------" << endl;cout << "請選擇:";
}
//檢查初始化數值是否合理
void checkInit()
{if (n_resource)for (int i = 0; i < n_process; i++){for (int j = 0; j < n_resource; j++){if (Max[i][j] < 0){cout << "Max[" << i << "][" << j << "]輸入值小于0!" << endl;}if (Allocation[i][j] < 0){cout << "Allocation[" << i << "][" << j << "]輸入值小于0!" << endl;}if (Allocation[i][j]>Max[i][j]){cout << "Allocation[" << i << "][" << j << "]的值大于Max[" << i << "][" << j << "]輸入值" << endl;}}}for (int i = 0; i < n_resource; i++){if (Available[i]<0){cout << "Available[" << i << "]的值小于0!" << endl;}}cout << "檢查完畢,輸入無誤!" << endl;
}
//初始化進程和資源
int Init()
{if (n_resource != 0 && n_process != 0){cout << "已經初始化過了!" << endl;return 1;}cout << "請分別輸入資源個數和進程個數,中間用空格隔開:" << endl;cin >> n_resource >> n_process;cout << "請輸入各個資源的總擁有量:" << endl;for (int i = 0; i < n_resource; i++){cin >> Resource[i];}for (int i = 0; i < n_process; i++){cout << "P" << i << "對各個資源的最大需求量:" << endl;for (int j = 0; j < n_resource; j++){cin >> Max[i][j];}cout << "P" << i << "各個資源已分配量:" << endl;for (int j = 0; j < n_resource; j++){cin >> Allocation[i][j];}for (int j = 0; j < n_resource; j++){Need[i][j] = Max[i][j] - Allocation[i][j];}}for (int i = 0; i < n_resource; i++){int sum[MAX] = { 0 };for (int j = 0; j < n_process; j++){switch(i){case 0:case 1:case 2:sum[i] += Allocation[j][i];break;}}Available[i] = Resource[i] - sum[i];}checkInit();return 1;
}
//安全性檢查
bool Safecheck()
{//清空原來的安全序列Safeorder.clear();//Work初始化為Availablefor (int i = 0; i < n_resource; i++){Work[i] = Available[i];}//還沒開始檢查,設置標志為falsefor (int i = 0; i < n_process; i++){Finish[i] = false;}//開始安全性檢查int count = 0;for (int k = 0; k < n_process; k++){for (int i = 0; i < n_process; i++){if (Finish[i] == false){count = 0;for (int j = 0; j < n_resource; j++){if (Need[i][j] <= Work[j])count++;}//如果進程所需的各個資源數都沒有超過系統現有的對應資源數if (count == n_resource){for (int j = 0; j < n_resource; j++){//將Work賦值為 第i個進程各個已分配資源數+系統現有的對應資源數Work[j] = Work[j] + Allocation[i][j];}Finish[i] = true;Safeorder.push_back(i);//加入到安全序列}}}}count = 0;//安全的進程數for (int i = 0; i < n_process; i++){if (Finish[i] == true)count++;}if (count == n_process)return true;elsereturn false;
}
//請求進程
int Order()
{int n = -1; //請求資源的進程號int *Request = new int[n_resource];//表示請求的各個資源數量cout << "請輸入你要請求的進程號:";cin >> n;cout << "請輸入你要請求各個資源的數量,中間用空格隔開:" << endl;for (int i = 0; i< n_resource; i++){cin >> Request[i];}//開始判斷//請求量大于該進程的最大需求量,出錯for (int i = 0; i < n_resource; i++){if (Need[n][i] < Request[i]){cout << "輸入錯誤,請求量不能比該進程的最大需求量還大!" << endl;return 1;}}//請求量大于當前空閑資源量,出錯for (int i = 0; i < n_resource; i++){if (Available[i] < Request[i]){cout << "拒絕,當前空閑資源不夠!" << endl;return 1;}}//請求量合理,試圖分配資源給請求進程,并做安全性檢查for (int i = 0; i < n_resource; i++){Available[i] -= Request[i];Allocation[n][i] += Request[i];Need[n][i] -= Request[i];}//安全性檢查bool Is_safe=Safecheck();if (Is_safe == true){cout << "系統已經分配資源給P" << n << "進程了!" << endl;cout << "其中一個安全序列為:" << endl;for (int i = 0; i < Safeorder.size(); i++){cout << "P" << Safeorder.at(i) << "->";}cout << "End" << endl ;}//不安全,恢復試分配之前的現場else{cout << "不能分配資源,否則系統會處于不安全狀態!" << endl;for (int i = 0; i < n_resource; i++){Available[i] += Request[i];Allocation[n][i] -= Request[i];Need[n][i] += Request[i];}}return 1;
}
//顯示資源分配情況
void Display()
{cout << endl;cout << "進程 \t Max \t Allocation\tNeed\tAvailable" << endl;for (int i = 0; i < n_process; i++){cout << " P" << i << " \t";for (int j = 0; j < n_resource; j++){cout << Max[i][j] << " ";}cout << "\t   ";for (int j = 0; j < n_resource; j++){cout << Allocation[i][j] << " ";}cout << "\t";for (int j = 0; j < n_resource; j++){cout << Need[i][j] << " ";}cout << "\t  ";for (int j = 0; i==0&&j < n_resource; j++){cout << Available[j] << " ";}cout << endl;}cout << endl;
}int main()
{int choose = 0;while (1){Menu();cin >> choose;switch (choose){case 1:Init();break;case 2:Order();break;case 3:Display();break;case 4:cout << "系統已退出!";return 1;default:cout << "輸錯了,重輸" << endl;break;}}
}

?實驗報告:https://download.csdn.net/download/sjhdxpz/88212618

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35167.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35167.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35167.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023.8.7論文閱讀

文章目錄 CMUNeXt: An Efficient Medical Image Segmentation Network based on Large Kernel and Skip Fusion摘要本文方法實驗結果 Boundary Difference Over Union Loss For Medical Image Segmentation&#xff08;損失函數&#xff09;摘要本文方法實驗結果 CMUNeXt: An E…

回歸預測 | MATLAB實現基于PSO-LSSVM-Adaboost粒子群算法優化最小二乘支持向量機結合AdaBoost多輸入單輸出回歸預測

回歸預測 | MATLAB實現基于PSO-LSSVM-Adaboost粒子群算法優化最小二乘支持向量機結合AdaBoost多輸入單輸出回歸預測 目錄 回歸預測 | MATLAB實現基于PSO-LSSVM-Adaboost粒子群算法優化最小二乘支持向量機結合AdaBoost多輸入單輸出回歸預測預測效果基本介紹模型描述程序設計參考…

【基礎操作】Linux打開terminal,Anaconda默認進入的虛擬環境(python版本)設置(自行指定)

為了免除每次打開terminal都要輸入 conda activate … 的麻煩&#xff0c;可以這么設置。 1. 打開terminal&#xff0c;然后輸入命令 vim ~/.bashrc2. 然后在文件末尾添加 conda activate your_envs # your_envs是你的虛擬環境名稱3. 保存退出&#xff0c;重新打開就成功啦…

navicat連接postgresql報錯

navicat連接postgresql報錯 navicat連接postgresql報錯 現象 有小伙伴告訴我 安裝了新的postgresql 使用navicat連接&#xff0c;報錯 ERROR: column "datlastsysoid" does not existLINE 1: SELECT DISTINCT datlastsysoid FROM pg database column “datlastsy…

Go 語言類型轉換的陷阱

1 介紹 Go 語言作為強類型語言&#xff0c;在使用 Golang 開發項目時&#xff0c;經常會遇到類型轉換的場景&#xff0c;整型之間可以直接轉換&#xff0c;字節切片和字符串之間也可以直接轉換。 但是&#xff0c;如果整型和字符串之間做類型轉換&#xff0c;則需要使用 str…

.netcore grpc客戶端流方法詳解

一、客戶端流式處理概述 客戶端流式處理方法在該方法沒有接收消息的情況下啟動。 requestStream 參數用于從客戶端讀取消息。 返回響應消息時&#xff0c;客戶端流式處理調用完成。客戶端可以發送多個消息流到服務端&#xff0c;當所有客戶端消息流發送結束&#xff0c;調用請…

SpringBoot案例-部門管理-修改

目錄 前言 查看頁面原型&#xff0c;明確需求 頁面原型 需求 閱讀接口文件 思路分析 功能接口開發 控制層&#xff08;Controller類&#xff09; 業務層&#xff08;Service類&#xff09; 業務類 業務實現類 持久層&#xff08;Mapper類&#xff09; 接口測試 前…

Day 41

Day 41 343. 整數拆分 一個是j * dp[i - j]&#xff0c;相當于是拆分(i - j)&#xff0c;對這個拆分不理解的話&#xff0c;可以回想dp數組的定義。 dp[i] max({dp[i], (i - j) * j, dp[i - j] * j}); class Solution:def integerBreak(self, n: int) -> int:dp [0] *…

離線環境conda虛擬環境備份遷移--conda pack問題

1.第一步&#xff1a;創建虛擬環境 conda create -n pyenv --clone base 或者 conda create -n pyenv python3.8.5 --offline 命令執行結束&#xff0c;在路徑/xxxx/anaconda/envs 下看到pyenv 或者 conda info --envs 查看羅列虛擬環境 2.第二步&#xff1a;打包環境 conda …

ROS2 學習(一)介紹,環境搭建,以及個人安裝的一些建議

ROS2 學習 學習自b站課程&#xff1a;https://www.bilibili.com/video/BV16B4y1Q7jQ?p1 &#xff08;up主&#xff1a;古月居GYH&#xff09; ROS 介紹 Robot OS&#xff0c;為機器人開發提供了相對完善的 middleware&#xff0c;工具&#xff0c;軟件等。 ROS1 對嵌入式設…

計算機網絡(7) --- UDP協議和TCP協議

計算機網絡&#xff08;6&#xff09; --- https協議_哈里沃克的博客-CSDN博客https協議https://blog.csdn.net/m0_63488627/article/details/132112683?spm1001.2014.3001.5501 目錄 1.補充知識 1.PORT端口號 2.端口號范圍劃分 3.知名端口號 2.UDP協議 1.UDP報頭 2.U…

容器逃逸Docker cp(CVE-2019-14271)漏洞復現與分析

目錄 安裝 原理 EXP 參考 安裝 metarget安裝有點問題&#xff0c;所以我們直接指定安裝 可以用下面命令 查看包 apt-cache madison docker-ce 安裝 apt-get install -y docker-ce5:19.03.0~3-0~ubuntu-bionic 原理 EXP metarget/writeups_cnv/docker-cve-2019-14271 at …

Insert 1, Insert 2, Insert 3, ... 2023牛客暑期多校訓練營8 H

登錄—專業IT筆試面試備考平臺_牛客網 題目大意&#xff1a;給出一個長度為n的數組a&#xff0c;問有多少子串滿足其可以用多個排列穿插構成 1<n<1e6 思路&#xff1a;因為每個排列的起點都是1&#xff0c;所以我們大致的策略就是對于每一個1&#xff0c;記錄它往右最…

BGP小綜合

實驗題目如下&#xff1a; 實驗拓撲如下&#xff1a; 實驗要求如下&#xff1a; 【1】R2-7每臺路由器均存在一個環回接口用于建立鄰居&#xff0c;同時還存在一個環回來代表連接用戶的 接口;最終這些連接用戶的接口網絡需要可以和R1/8的環回通訊 【2】AS2網段地址1…

基于smardaten無代碼開發智能巡檢系統,讓無人機飛得更準

目錄 引言需求背景搭建思路開發過程&#xff08;1&#xff09;無人機設備數據接入&#xff08;2&#xff09;無人機巡檢任務管理&#xff08;3&#xff09;無人機三維防控監視&#xff08;4&#xff09;運防一體化大屏設計&#xff08;5&#xff09;異常告警管理&#xff08;6&…

面試總結-webpack/git

說說你對webpack的理解 webpack 是一個靜態模塊打包器&#xff0c;整個打包過程就像是一條生產線&#xff0c;把資源從入口放進去&#xff0c;經過一系列的加工&#xff08;loader&#xff09;&#xff0c;最終轉換成我們想要的結果&#xff0c;整個加工過程還會有監控&#x…

公共服務領域:西安新小區業主自立業主委員會年底分紅83萬以及103萬事件區塊鏈資金透明監管與投票解決方案的嘗試

公共服務領域:西安新小區業主自立業主委員會年底分紅83萬以及103萬事件區塊鏈資金透明監管與投票解決方案的嘗試 作者 重慶電子工程職業學院 | 向鍵雄 杜小敏 前言 本項目想法來源于,西安新小區業主開出物業自立業主委員會年底分紅83萬以及103萬事件,對于此類事件,我們刨…

微信小程序加載本地json和使用gulp壓縮js

加載本地json 創建json.js, data 里是json內容,exports 是數據出口 var data = [ {json1},{json2},{json3},{json10} ....] module.exports = {listData = data } 使用 這個require后面的參數是入口文件的文件路徑,但是注意必須是相對路徑,不能絕對路徑。 let json = re…

redis基礎(三十六)

安裝redis、配置redis 目錄 一、 概述 &#xff08;一&#xff09;NoSQL 1、類型 2、應用場景 &#xff08;二&#xff09;Redis 二、安裝 &#xff08;一&#xff09;編譯安裝 &#xff08;二&#xff09;RPM安裝 三、目錄結構 四、命令解析 五、redis登錄更改 1、…

2023國賽數學建模C題思路分析

文章目錄 0 賽題思路1 競賽信息2 競賽時間3 建模常見問題類型3.1 分類問題3.2 優化問題3.3 預測問題3.4 評價問題 4 建模資料 0 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 競賽信息 全國大學生數學建模…