操作系统—银行家算法

参考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)后,系统能否将资源分配?

时间: 2024-10-23 21:32:46

操作系统—银行家算法的相关文章

C语言实现 操作系统 银行家算法

嘿嘿,今晚心血来潮,在宿舍把银行家算法实现了. /************************************************** 银行家算法: 主要的思想是 舍大取小,先满足小的,最后才满足大的. author: lyb date: 2014/10/15 ***************************************************/ #include <stdio.h> #include <stdlib.h> #include <

操作系统: 银行家算法的分析和代码实现(c++语言)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行. 在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待.为实现银行家算法,系统必须设置若干数据结构. 1)各种资源总数向量resource 是一个含有m个元素的数组,其中

操作系统之银行家算法

一.需求分析 1.进程的状态有:就绪,等待和完成.当系统不能满足进程的资源请求时,进程出于等待状态.资源需求总量表示进程运行过程中对资源的总的需求量.已占资源量表示进程目前已经得到但还为归还的资源量.因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量.陷入每个进程的资源需求总量不应超过系统拥有的资源总量. 2.银行家算法分配资源的原则是:当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁.若能,则让进程等待,

【操作系统】银行家算法

[操作系统]银行家算法 2017-05-10 若愚 上次介绍了死锁的相关概念,以及各种解决办法.今天讲的是死锁避免里面的银行家算法.请多多指教~ 一.算法的背景 算法由迪杰斯特拉在1965年提出. 在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还.银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要.在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程. 二.算

操作系统之银行家算法避免死锁

银行家算法避免死锁 要求: 完成程序数据结构的设计,数据的录入. 完成进程需求矩阵的输出,包括最大需求矩阵,尚需资源矩阵,可获得资源显示. 完成某进程请求资源试分配. 完成安全性检查. 1.         试探分配 当进程pi提出资源申请时,系统执行下列步骤: (1)若Request[i][j]≤Need[i][j],转(2): 否则错误返回 (2)若Request[i][j]≤Available[j], 转(3):否则进程等待 (3)试探着把资源分配给进程Pi,则有: Available[j

操作系统:银行家算法(避免死锁)

算法介绍: 程序实现: /***************************************************** 程序:银行家算法实现 作者:小单 时间: 2013年11月5日 ******************************************************/ #include <iostream> #include <string> using namespace std; #define MAXPROCESS 50 //所能执行的

《操作系统、预防进程死锁的银行家算法》

预防进程死锁的银行家算法 原文:https://blog.csdn.net/houchaoqun_xmu/article/details/55540792 一.概念介绍和案例解析 银行家算法中的数据结构 可利用资源向量Available:   这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.如果Available[j]=K,则表示系统中现有Rj类资源K个. 最大需求矩阵Max:   

银行家算法 C++实现

操作系统中预防死锁的银行家算法,测试用例来自<计算机操作系统(第四版)>113页例题. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #define Process_Max 100 //进程数量最大值 #define Resource_Max 100 //资源种类最大值 using namespace std; int Available[Resou

银行家算法

我们可以把操作系统作为一个银行家.操作系统管理的资金相当于银行家的资源.过程向操作系统请求分配相当于用户资源,银行贷款. 为了保证资金的安全性,银行规定: (1) 当资金客户最大需求不超过可用资金的银行家可以接受客户; (2) 贷款,但贷款的总数不能超过最大需求量; (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款; (4) 当顾客得到所需的所有资金后,一定能在有限的时间里归还所有的资金. 银行家算法数据结构 1)可利用资源向量A