程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 操作系統—銀行家算法,銀行家算法

操作系統—銀行家算法,銀行家算法

編輯:C++入門知識

操作系統—銀行家算法,銀行家算法


參考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)後,系統能否將資源分配?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved