Chinaunix首页 | 论坛 | 博客
  • 博客访问: 351597
  • 博文数量: 159
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 182
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-02 10:42
文章分类

全部博文(159)

文章存档

2015年(18)

2014年(132)

2013年(9)

分类: C/C++

2013-12-09 22:15:22

利用银行家算法避免死锁

1. 银行家算法中的数据结构

(1) 可利用资源向量Available

这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有Rj类资源K个

(2) 最大需求矩阵Max

这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K

(3) 分配矩阵Allocation

这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。?

(4) 需求矩阵Need

这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

Need[i,j]=Max[i,j] - Allocation[i,j]

2. 银行家算法

设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查

(1) 如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2) 如果Requesti[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。

(3) 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:

Available[j] := Available[j]-Requesti[j];

Allocation[i,j] := Allocation[i,j]+Requesti[j];

Need[i,j] := Need[i,j]-Requesti[j];

(4) 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

3. 安全性算法

(1) 设置两个向量:

工作向量Work它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work := Available;

Finish它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i] := false; 当有足够资源分配给进程时,再令Finish[i] := true。

(2) 从进程集合中找到一个能满足下述条件的进程:

① Finish[i]=false;

② Need[i,j]≤Work[j]

若找到,执行步骤(3),否则,执行步骤(4)。

(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work[j] := Work[j]+Allocation[i,j];?

Finish[i] := true;?

go to step 2;

(4) 如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

总结:银行家算法分为两部分:

第一部分是资源预分配算法,即对某进程的一个资源请求,先进行模拟分配,然后运行银行家算法的第二部分,找出是否存在安全序列

第二部分安全性算法,找出当前系统状态是否有安全序列。


点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. #define true 1
  4. #define false 0

  5. int Available[10];        //可使用资源向量
  6. int Max[10][10];        //最大需求矩阵
  7. int Allocation[10][10] = { 0 };    //分配矩阵
  8. int Need[10][10] = { 0 };    //需求矩阵

  9. int Work[10];            //工作向量
  10. int Finish[10];            //状态标志
  11. int Request[10][10];        //进程申请资源向量
  12. int Pause[10];

  13. int i, j;
  14. int n;                //系统资源总数
  15. int m;                //总的进程数
  16. int a;                //当前申请的进程号
  17. int l, e;            //计数器
  18. int b = 0, c = 0, f = 0, g;    //计数器

  19. void mainenter()        //主要的输入部分代码
  20. {
  21.     printf("请输入系统总共有的资源数:");
  22.     scanf("%d", &n);
  23.     printf("请输入总共有多少个进程:");
  24.     scanf("%d", &m);
  25.     for (i = 1; i <= n; i++) {
  26.         printf("第%d类资源有的资源实例:", i);
  27.         scanf("%d", &Available[i]);
  28.     }
  29.     for (i = 1; i <= m; i++) {
  30.         for (j = 1; j <= n; j++) {
  31.             printf("进程P[%d]对第%d类资源的最大需求量:", i, j);
  32.             scanf("%d", &Max[i][j]);
  33.             Need[i][j] = Max[i][j];
  34.         }
  35.     }
  36. }

  37. void mainrequest()        //进程提出新申请的代码部分
  38. {
  39.     printf("请输入申请资源的进程:");
  40.     scanf("%d", &a);
  41.     for (i = 1; i <= n; i++) {
  42.         printf("请输入进程P[%d]对%d类资源的申请量:", a, i);
  43.         scanf("%d", &Request[a][i]);
  44.         if (Request[a][i] > Need[a][i])
  45.             printf("\n出错!进程申请的资源数多于它自己申报的最大量\n");
  46.         if (Request[a][i] > Available[i])
  47.             printf("\n P[%d]必须等待\n", a);
  48.     
  49.         //以下是试探性分配
  50.         Available[i] = Available[i] - Request[a][i];
  51.         Allocation[a][i] = Allocation[a][i] + Request[a][i];
  52.         Need[a][i] = Need[a][i] - Request[a][i];
  53.         Work[i] = Available[i];
  54.     }
  55.     for (i = 1; i <= n; i++) {
  56.         Pause[i] = Available[i];//Pause[i]只是一个暂时寄存的中间变量,为防止在下面
  57.         //安全性检查时修改到Available[i]而代替的一维数组
  58.         Finish[i] = false;
  59.     }
  60.     for (g = 1; g <= m; g++) {     //m个进程分别要求申请资源
  61.         for (i = 1; i <= m; i++) {//每个进程要求分配资源检查是否安全
  62.             b = 0;    //计数器初始化
  63.             for (j = 1; j <= n; j++) {
  64.                 if (Need[i][j] <= Pause[j]) {
  65.                     b = b + 1;
  66.                 }
  67.                 if (Finish[i] == false && b == n) {
  68.                     for (l = 1; l <= n; l++) {
  69.                         Pause[l] = Pause[l] + Allocation[i][l];
  70.                     }
  71.                     Finish[i] = true;
  72.                     printf("$$ %d ", i);    //依次输出进程安全序列之一中每个元素
  73.                 }
  74.             }
  75.         }
  76.     }
  77.     printf("\n");
  78.     for (i = 1; i <= m; i++) {
  79.         if (Finish[i] == true)
  80.             f = f + 1;    //统计Finish[i]==true的个数
  81.     }
  82.     if (f == m) {
  83.         printf("safe static");
  84.         f = 0;        //将计数器f重新初始化,为下一次提出新的进程申请做准备
  85.     } else {
  86.         printf(" unsafe static ");    //以下代码为当系统被判定为不安全状态时
  87.         //返回提出申请前的状态
  88.         for (i = 1; i <= n; i++) {
  89.             Available[i] = Available[i] + Request[a][i];
  90.             Allocation[a][i] = Allocation[a][i] - Request[a][i];
  91.             Need[a][i] = Need[a][i] + Request[a][i];
  92.         }
  93.     }
  94. }

  95. void mainprint()
  96. {
  97.     printf("当前的系统状态\n");
  98.     printf(" 目前占有量 最大需求量 尚需要量 \n进程");
  99.     for (i = 1; i <= n; i++)
  100.         for (j = 1; j <= n; j++) {
  101.             printf(" %d类", j);
  102.         }
  103.     for (i = 1; i <= m; i++) {
  104.         printf("\nP[%d]", i);
  105.         for (j = 1; j <= n; j++) {
  106.             printf(" %d ", Allocation[i][j]);
  107.         }
  108.         for (j = 1; j <= n; j++) {
  109.             printf(" %d ", Max[i][j]);
  110.         }
  111.         for (j = 1; j <= n; j++) {
  112.             printf(" %d ", Need[i][j]);
  113.         }
  114.     }
  115.     printf("\n\n系统剩余资源量: ");
  116.     for (i = 1; i <= n; i++) {
  117.         printf(" %d ", Available[i]);
  118.     }
  119.     printf("\n");
  120. }

  121. void main()
  122. {
  123.     int k, h = 1;
  124.     while (h) {
  125.         {
  126.             printf("\n\n ★ 欢迎使用本程序 ★\n");
  127.             printf("\n\n 1:输入系统的资源数、申请进程数、每个类资源的实例数");
  128.             printf("\n 2:…………………………………… 输入进程的资源申请");
  129.             printf("\n 3:…………………………………………… 输出系统状态");
  130.             printf("\n 4:………………………………………………… 退出程序");
  131.             printf("\n\n please choose ");
  132.             scanf("%d", &k);
  133.         }
  134.         switch (k) {
  135.         case 1:
  136.             mainenter();
  137.             break;
  138.         case 2:
  139.             mainrequest();
  140.             break;
  141.         case 3:
  142.             mainprint();
  143.             break;
  144.         case 4:
  145.             h = 0;
  146.             break;
  147.         }
  148.         printf("\n");
  149.     }
  150.     printf("\n\n 谢谢使用 \n");
  151.     printf("\n\n See you next time!!!\n\n\n");
  152. }
[root@liixun 2011级计科1班作业---11---银行家算法---C语言实现---030---毕赖子]# gcc -o banker banker.c
[root@liixun 2011级计科1班作业---11---银行家算法---C语言实现---030---毕赖子]# ./banker


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 1
请输入系统总共有的资源数:3
请输入总共有多少个进程:5
第1类资源有的资源实例:10
第2类资源有的资源实例:5
第3类资源有的资源实例:7
进程P[1]对第1类资源的最大需求量:7
进程P[1]对第2类资源的最大需求量:5
进程P[1]对第3类资源的最大需求量:3
进程P[2]对第1类资源的最大需求量:3
进程P[2]对第2类资源的最大需求量:2
进程P[2]对第3类资源的最大需求量:2
进程P[3]对第1类资源的最大需求量:9
进程P[3]对第2类资源的最大需求量:0
进程P[3]对第3类资源的最大需求量:2
进程P[4]对第1类资源的最大需求量:2
进程P[4]对第2类资源的最大需求量:2
进程P[4]对第3类资源的最大需求量:2
进程P[5]对第1类资源的最大需求量:4
进程P[5]对第2类资源的最大需求量:3
进程P[5]对第3类资源的最大需求量:3

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    0    0    7    5    3    7    5    3
P[2]   0    0    0    3    2    2    3    2    2
P[3]   0    0    0    9    0    2    9    0    2
P[4]   0    0    0    2    2    2    2    2    2
P[5]   0    0    0    4    3    3    4    3    3

系统剩余资源量:      10    5    7

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose
请输入申请资源的进程:1
请输入进程P[1]对1类资源的申请量:0
请输入进程P[1]对2类资源的申请量:1
请输入进程P[1]对3类资源的申请量:0
$$ 1 $$ 2 $$ 3 $$ 4 $$ 5
safe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    1    0    7    5    3    7    4    3
P[2]   0    0    0    3    2    2    3    2    2
P[3]   0    0    0    9    0    2    9    0    2
P[4]   0    0    0    2    2    2    2    2    2
P[5]   0    0    0    4    3    3    4    3    3

系统剩余资源量:      10    4    7

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 2
请输入申请资源的进程:2
请输入进程P[2]对1类资源的申请量:2
请输入进程P[2]对2类资源的申请量:0
请输入进程P[2]对3类资源的申请量:0
$$ 1 $$ 2 $$ 3 $$ 4 $$ 5
safe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    1    0    7    5    3    7    4    3
P[2]   2    0    0    3    2    2    1    2    2
P[3]   0    0    0    9    0    2    9    0    2
P[4]   0    0    0    2    2    2    2    2    2
P[5]   0    0    0    4    3    3    4    3    3

系统剩余资源量:      8    4    7

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

please choose 2
请输入申请资源的进程:3
请输入进程P[3]对1类资源的申请量:3
请输入进程P[3]对2类资源的申请量:0
请输入进程P[3]对3类资源的申请量:2
$$ 2 $$ 3 $$ 4 $$ 5 $$ 1
safe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    1    0    7    5    3    7    4    3
P[2]   2    0    0    3    2    2    1    2    2
P[3]   3    0    2    9    0    2    6    0    0
P[4]   0    0    0    2    2    2    2    2    2
P[5]   0    0    0    4    3    3    4    3    3

系统剩余资源量:      5    4    5

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

  please choose 2
请输入申请资源的进程:4
请输入进程P[4]对1类资源的申请量:2
请输入进程P[4]对2类资源的申请量:1
请输入进程P[4]对3类资源的申请量:1
$$ 2 $$ 4 $$ 5 $$ 1 $$ 3
safe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    1    0    7    5    3    7    4    3
P[2]   2    0    0    3    2    2    1    2    2
P[3]   3    0    2    9    0    2    6    0    0
P[4]   2    1    1    2    2    2    0    1    1
P[5]   0    0    0    4    3    3    4    3    3

系统剩余资源量:      3    3    4

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 2
请输入申请资源的进程:5
请输入进程P[5]对1类资源的申请量:0
请输入进程P[5]对2类资源的申请量:0
请输入进程P[5]对3类资源的申请量:2
$$ 2 $$ 4 $$ 5 $$ 1 $$ 3
safe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    1    0    7    5    3    7    4    3
P[2]   2    0    0    3    2    2    1    2    2
P[3]   3    0    2    9    0    2    6    0    0
P[4]   2    1    1    2    2    2    0    1    1
P[5]   0    0    2    4    3    3    4    3    1

系统剩余资源量:      3    3    2

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 2
请输入申请资源的进程:2
请输入进程P[2]对1类资源的申请量:1
请输入进程P[2]对2类资源的申请量:0
请输入进程P[2]对3类资源的申请量:2
$$ 2 $$ 4 $$ 5 $$ 1 $$ 3
safe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    1    0    7    5    3    7    4    3
P[2]   3    0    2    3    2    2    0    2    0
P[3]   3    0    2    9    0    2    6    0    0
P[4]   2    1    1    2    2    2    0    1    1
P[5]   0    0    2    4    3    3    4    3    1

系统剩余资源量:      2    3    0

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

please choose 2
请输入申请资源的进程:5
请输入进程P[5]对1类资源的申请量:3
  P[5]必须等待
请输入进程P[5]对2类资源的申请量:3
请输入进程P[5]对3类资源的申请量:0

 unsafe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 2
请输入申请资源的进程:1
请输入进程P[1]对1类资源的申请量:0
请输入进程P[1]对2类资源的申请量:2
请输入进程P[1]对3类资源的申请量:0

 unsafe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    1    0    7    5    3    7    4    3
P[2]   3    0    2    3    2    2    0    2    0
P[3]   3    0    2    9    0    2    6    0    0
P[4]   2    1    1    2    2    2    0    1    1
P[5]   0    0    2    4    3    3    4    3    1

系统剩余资源量:      2    3    0

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

please choose 2
请输入申请资源的进程:1
请输入进程P[1]对1类资源的申请量:0
请输入进程P[1]对2类资源的申请量:1
请输入进程P[1]对3类资源的申请量:0
$$ 2 $$ 4 $$ 5 $$ 1 $$ 3
safe static


            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 3
当前的系统状态
        目前占有量     最大需求量      尚需要量
进程  1类  2类  3类  1类  2类  3类  1类  2类  3类
P[1]   0    2    0    7    5    3    7    3    3
P[2]   3    0    2    3    2    2    0    2    0
P[3]   3    0    2    9    0    2    6    0    0
P[4]   2    1    1    2    2    2    0    1    1
P[5]   0    0    2    4    3    3    4    3    1

系统剩余资源量:      2    2    0

 

            ★ 欢迎使用本程序 ★


  1:输入系统的资源数、申请进程数、每个类资源的实例数
  2:……………………………………  输入进程的资源申请
  3:……………………………………………  输出系统状态
  4:…………………………………………………  退出程序

 please choose 4

 

       谢谢使用


  See you next time!!!


[root@liixun 2011级计科1班作业---11---银行家算法---C语言实现---030---毕赖子]#

 

 

 

 

 

 

 

阅读(1544) | 评论(0) | 转发(1) |
0

上一篇:约瑟夫问题实现

下一篇:镜像二叉树

给主人留下些什么吧!~~