操作系統—銀行家演算法

来源:http://www.cnblogs.com/ABook/archive/2016/06/22/5608721.html
-Advertisement-
Play Games

參考http://blog.csdn.net/yaopeng_2005/article/details/6935235 對小鵬_加油的代碼進行了部分修改,並加入了自己的文檔註釋 定義全局變數,以及主函數main 初始化變數Init函數 銀行家演算法Bank函數 安全性演算法Safe函數 顯示showda ...


參考http://blog.csdn.net/yaopeng_2005/article/details/6935235  

對小鵬_加油的代碼進行了部分修改,並加入了自己的文檔註釋

定義全局變數,以及主函數main

 1 #include <iostream>
 2 using namespace std;
 3 #define MAXPROCESS 50                        //最大進程數
 4 #define MAXRESOURCE 100                      //最大資源數
 5 int AVAILABLE[MAXRESOURCE];                  //可用資源數組
 6 int MAX[MAXPROCESS][MAXRESOURCE];            //最大需求矩陣
 7 int ALLOCATION[MAXPROCESS][MAXRESOURCE];     //分配矩陣
 8 int NEED[MAXPROCESS][MAXRESOURCE];           //需求矩陣
 9 int REQUEST[MAXPROCESS][MAXRESOURCE];        //進程需要資源數
10 bool FINISH[MAXPROCESS];                     //系統是否有足夠的資源分配
11 int p[MAXPROCESS];                           //記錄序列
12 int m,n;                                     //m個進程,n個資源
13 void Init();    //初始化變數
14 bool Safe();    //安全檢測
15 void Bank();    //銀行家演算法
16 void showdata(int,int);    //顯示輸出系統信息
17 int main()
18 {
19     Init();
20     Safe();
21     Bank();
22 }

 

初始化變數Init函數

 1 /*初始化變數*/
 2 void Init()                
 3 {
 4     int i,j;
 5     cout << "請輸入進程的數目:";
 6     cin >> m;
 7     cout << "請輸入資源的種類:";
 8     cin >> n;
 9     cout << "請輸入每個進程最多所需的各資源數,按照" << m << "x" << n << "矩陣輸入" << endl;
10     for(i=0;i<m;i++)
11         for(j=0;j<n;j++)
12             cin >> MAX[i][j];
13     cout << "請輸入每個進程已分配的各資源數,也按照" << m << "x" << n << "矩陣輸入" << endl;
14     for(i = 0; i < m; i++)
15         for(j = 0; j < n; j++)
16         {
17             cin >> ALLOCATION[i][j];
18             NEED[i][j] = MAX[i][j] - ALLOCATION[i][j];
19             if(NEED[i][j] < 0)
20             {
21                 cout << "您輸入的第" << i+1 << "個進程所擁有的第" << j+1 << "個資源數錯誤,請重新輸入:" << endl;
22                 j--;
23                 continue;
24             }
25         }
26         cout << "請輸入各個資源現有的數目:" << endl;
27         for(i = 0; i < n; i++)
28             cin >> AVAILABLE[i];
29 } 

 

銀行家演算法Bank函數

 1 /*銀行家演算法*/
 2 void Bank()               
 3 {
 4     int i,cusneed,flag = 0;    //cousneed資源進程號
 5     char again;    //鍵盤錄入一個字元用於判斷是否繼續請求資源
 6     while(1)
 7     {
 8         showdata(n,m);
 9         cout << endl;
10         /*請求資源*/
11         while(true)
12         {
13             cout << "請輸入要申請資源的進程號(註:第1個進程號為0,依次類推)" << endl;
14             cin >> cusneed;
15             if (cusneed > m)
16             {
17                 cout << "沒有該進程,請重新輸入" << endl;
18                 continue;
19             }
20             cout << "請輸入進程所請求的各資源的數量" << endl;
21             for(i = 0; i < n; i++)
22                 cin >> REQUEST[cusneed][i];
23             for(i = 0; i < n; i++)
24             {
25                 if(REQUEST[cusneed][i] > NEED[cusneed][i])    //如果用戶選擇的線程的第i個資源請求數>該線程該資源所需的數量
26                 {
27                     cout << "您輸入的請求數超過進程的需求量!請重新輸入!" << endl;
28                     continue;
29                 }
30                 if(REQUEST[cusneed][i] > AVAILABLE[i])    //如果用戶選擇的線程的第i個資源請求數>系統現有的第i個資源的數量
31                 {
32                     cout << "您輸入的請求數超過系統有的資源數!請重新輸入!" << endl;
33                     continue;
34                 }
35             }
36             break;
37         }
38         /*如果請求合理,那麼開始銀行家演算法計算*/
39         /*先將申請的資源進行分配*/
40         for(i = 0; i < n; i++)
41         {
42             AVAILABLE[i] -= REQUEST[cusneed][i];            //系統可用資源減去申請了的
43             ALLOCATION[cusneed][i] += REQUEST[cusneed][i];    //線程被分配的資源加上已申請了的
44             NEED[cusneed][i] -= REQUEST[cusneed][i];        //線程還需要的資源減去已申請得到的
45         }
46         /*判斷分配申請資源後的系統是否安全;如果不安全則將分配的申請資源還回系統*/
47         if(Safe())    //AVAILABLE  ALLOCATION  NEED變動之後,是否會導致不安全
48             cout << "同意分配請求!" << endl;
49         else
50         {
51             cout << "您的請求被拒絕!" << endl;
52             /*資源還回系統*/
53             for(i = 0; i < n; i++)
54             {
55                 AVAILABLE[i] += REQUEST[cusneed][i];
56                 ALLOCATION[cusneed][i] -= REQUEST[cusneed][i];
57                 NEED[cusneed][i] += REQUEST[cusneed][i];
58             }
59         }
60         /*對進程的需求資源進行判斷;是否還需要資源;即NEED數組是否為0*/
61         for (i = 0; i < n; i++)
62             if (NEED[cusneed][i] <= 0)
63                 flag++;
64         if (flag == n)    //如果該進程各資源都已滿足條件,則釋放資源
65         {
66             for (i = 0; i < n; i++)
67             {
68                 AVAILABLE[i] += ALLOCATION[cusneed][i];
69                 ALLOCATION[cusneed][i] = 0;
70                 NEED[cusneed][i] = 0;
71             }
72             cout << "線程" << cusneed << " 占有的資源被釋放!" << endl;
73             flag = 0;
74         }
75         for(i = 0; i < m; i++)    //分配好了以後將進程的標識FINISH改成false
76             FINISH[i] = false;
77         /*判斷是否繼續申請*/
78         cout << "您還想再次請求分配嗎?是請按y/Y,否請按其它鍵" << endl;
79         cin >> again;
80         if(again == 'y' || again == 'Y')
81             continue;
82         break;
83     }
84 }

 

安全性演算法Safe函數

 1 /*安全性演算法*/
 2 bool Safe() 
 3 {
 4     int i, j, k, l = 0;
 5     int Work[MAXRESOURCE];    //工作數組
 6     /*工作數組賦值,與AVAILABLE數組相同*/
 7     for (i = 0; i < n; i++)
 8         Work[i] = AVAILABLE[i];
 9     /*FINISH數組賦值,初始為全部false*/
10     for (i = 0; i < m; i++)
11         FINISH[i] = false;    //FINISH記錄每個進程是否安全
12     while (l < m)    //正常的話,共執行m次
13     {
14         int init_index = l;
15         for (i = 0; i < m; i++)
16         {
17             if (FINISH[i] == true)    //如果這個進程安全則繼續下一個迴圈
18                 continue;
19             for (j = 0; j < n; j++)
20                 if (NEED[i][j] > Work[j])
21                     break;
22             if (j == n)
23             {
24                 FINISH[i] = true;
25                 for (k = 0; k < n; k++)
26                     Work[k] += ALLOCATION[i][k];
27                 p[l++] = i;//記錄進程號    
28             }
29             else    //如果超過繼續迴圈下一個進程
30                 continue;
31         }
32         if (l==init_index)
33         {
34             cout << "系統是不安全的" << endl;
35             return false;
36         }
37     }
38     cout << "系統是安全的" << endl;
39     cout << "安全序列:" << endl;
40     for (i = 0; i < l; i++)
41     {
42         cout << p[i];
43         if (i != l - 1)
44             cout << "-->";
45     }
46     cout << endl;
47     return true;
48 }

 

顯示showdata函數

 1 /*顯示*/
 2 void showdata(int n,int m)
 3 {
 4     int i,j;
 5     cout << endl << "-------------------------------------------------------------" << endl;  
 6     cout << "系統可用的資源數為:    ";
 7     for (j = 0; j < n; j++)
 8         cout << "    " << AVAILABLE[j];         
 9     cout << endl << "各進程還需要的資源量:" << endl; 
10     for(i = 0; i < m; i++)   
11     {
12         cout << "    進程" << i << ":";   
13         for(j = 0; j < n; j++)
14             cout << "     " << NEED[i][j];   
15         cout << endl;   
16     }   
17     cout << endl << "各進程已經得到的資源量:    " << endl << endl;
18     for (i = 0; i < m; i++)   
19     {
20         cout << "    進程" << i << ":";   
21         for (j = 0; j < n; j++)
22             cout << "     " << ALLOCATION[i][j];
23         cout << endl;   
24     }  
25     cout << endl; 
26 }

原博主使用了goto函數,我覺得這個函數還是儘量少用。我對此進行了修改。

測試:在網上找了道銀行家演算法的題,在這裡坐下測試;

在銀行家演算法中,若出現下述資源分配情況,試問:

Process Allocation Max Available
P0 0 0 3 2 0 0 4 4 1 6 2 2
P1 1 0 0 0 2 7 5 0  
P2 1 3 5 4 3 6 10 10  
P3 0 3 3 2 0 9 8 4  
P4 0 0 1 4 0 6  6 10  

 

1)該狀態是否安全?

2)若進程P2提出請求Request(1,2,2,2)後,系統能否將資源分配?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在jsp頁面中輸出完整的時間,格式為"年 月 日 時:分:秒" ...
  • 在導入文件的時候,Python只搜索當前腳本所在的目錄,載入(entry point)入口腳本運行目錄和sys.path中包含的路徑例如包的安裝地址。所以如果要在當前腳本引用其他文件,除了將文件放在和腳本同一目錄下,還有以下幾種方法, 1. 將文件所在位置添加到sys.path中 2. 在文件目錄下 ...
  • 這是ZK學習筆記的下篇, 主要希望可以分享一些 ZK 的應用以及其應用原理 我本人的學習告一段落, 不過還遺留了一些ZK相關的任務開發和性能測試的任務, 留待以後完成之後再通過其他文章來進行分享了 ZK應用場景: 1. 一個服務多台機器, 快速修改配置 2. 服務的消費者如何動態知道服務有多少個提供 ...
  • 因為 PHP 那“集百家之長”的蛋疼語法,加上社區氛圍不好,很多人對新版本,新特征並無興趣。本文將會介紹自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目錄:PHP5.2 以前:autoload, PDO 和 MySQLi, 類型約束PHP5.2:JSON 支持PHP5.3:棄用的功能 ...
  • 這篇文章主要介紹了C++實現郵件群發的方法,較為詳細的分析了郵件發送的原理與C++相關實現技巧,非常具有實用價值,需要的朋友可以參考下 本文實例講述了C++實現郵件群發的方法。分享給大家供大家參考。具體如下:關於生成隨機QQ郵箱不精確的問題,在之後版本打算另寫一個採集器插件進行帳號採集,所以,這個軟 ...
  • 今天又看了下Hangout的源碼,一般來說一個開源項目有好幾種啟動方式——比如可以從命令行啟動,也可以從web端啟動。今天就看看如何設計命令行啟動... Apache Commons CLI Apache Commons CLI是開源的命令行解析工具,它可以幫助開發者快速構建啟動命令,並且幫助你組織 ...
  • 在牛客網上刷題的時候看見這麼一道題 這很明顯是對我對父子執行流的嚴峻考察,很好,我喜歡,然後我錯了。。。騰訊實習生招聘的時候線上筆試題也有類似的題目,不過是把-換成可hello world而已,可見還是蠻重要的。這種題目只要畫一下圖很快就能理解了 顯而易見的6次 貼出結果 那麼接下來來個升級版的 執 ...
  • 在項目中我們有時候會為集合類型設定一些預設的值,使用spring後,我們可以通過配置文件的配置,用setter方式為對象的集合屬性提供一些預設值,下麵就是一個簡單的例子。 首先我們創建了一個名為Collection的類,這個類中包含四中基本的集合屬性,實現屬性的set方法和覆蓋toString()方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...