银行家算法防止死锁-银行家算法 第2页

银行家算法防止死锁
前i 个申请共计占用的资源,进程当前已经运行到的位置等信息。

      模拟分配的程序部分,采用循环队列对各进程进行调度。

      3、物理设计

      全局变量的结构定义如下:

      bool avoid;
      struct info//进程信息
      {
         long tot,n;//最大占用资源, 申请次数
         long list[16];// 申请资源列表
         long pre[16];// 已占用资源数
         long p;// 已分配状况的指针
      }pro[4];
      long LeftRes;

      程序的结构定义如下:

      int main()//主函数
      {
         init(); 751com.cn
         allot();
      }
      void init()//函数功能:输入和初始化
      void allot()//函数功能:模拟资源分配过程
      allot()使用以下函数模拟分配过程:
      bool require(long x)//函数功能:尝试分配资源给进程x
      bool safe(long x)//函数功能:检查分配是否安全

      可以处理3 种资源的程序全局变量结构如下:

      //共有 3 种资源,3 个进程
      bool avoid;
      struct info//进程信息
      {
         long tot[4];//最大占用资源数
         long p[4];// 已经占有的资源数
      }pro[5];
      long LeftRes[4];//剩余资源数
      long qu[4];

四、测试结果

      对于一组会导致死锁的数据,分别选择采用和不采用避免算法

结果如下:

Avoid deadlock?(Y/N)Y
Please input the resourse-require lists of these 3 processes, one lists in a line:
2 3 4
2 3 3
3 1

=================================================================
Process1 :               2 3 4 (Sum=9)
Process2 :               2 3 3 (Sum=8)
Process3 :               3 1 (Sum=4)

=================================================================

Process1 require 2 unit(s) resourse......Success! LeftResourse=8
Process2 require 2 unit(s) resourse......Success! LeftResourse=6
Process3 require 3 unit(s) resourse......Success! LeftResourse=3
Process1 require 3 unit(s) resourse......Denied! Not safe
Process2 require 3 unit(s) resourse......Denied! Not safe
Process3 require 1 unit(s) resourse......Success! LeftResourse=2
Process3 finish. LeftResourse=6
Process1 require 3 unit(s) resourse......Denied! Not safe
Process2 require 3 unit(s) resourse......Success! LeftResourse=3
Process1 require 3 unit(s) resourse......Denied! Not safe
Process2 require 3 unit(s) resourse......Success! LeftResourse=0
Process2 finish. LeftResourse=8
Process1 require 3 unit(s) resourse......Success! LeftResourse=5
Process1 require 4 unit(s) resourse......Success! LeftResourse=1
Process1 finish. LeftResourse=10

Finish 751com.cn

如果不避免死锁:

Avoid deadlock?(Y/N)N
Please input the resourse-require lists of these 3 processes, one lists in a lin
e:
2 3 4
2 3 3
3 1

=================================================================
Process1 :               2 3 4 (Sum=9)
Process2 :          2 3 3 (Sum=8)
Process3 :          3 1 (Sum=4)

=================================================================

Process1 require 2 unit(s) resourse......Success! LeftResourse=8
Process2 require 2 unit(s) resourse......Success! LeftResourse=6
Process3 require 3 unit(s) resourse......Success! LeftResourse=3
Process1 require 3 unit(s) resourse......Success! LeftResourse=0
Process2 require 3 unit(s) resourse......Denied! No enough resourse
Process3 require 1 unit(s) resourse......Denied! No enough resourse
Process1 require 4 unit(s) resourse......Denied! No enough resourse
Already Deadlock

Finish

改进版本(可以使用3 种资源的程序)测试结果如下:

五、系统不足与经验体会 

      系统不能处理多种不同资源的情况,也缺乏处理大规模数据的能

力。 

      safe 函数的编写是程序成功的关键,其中利用 Change 标记的思

乡值得仔细体会。 

六、附录:源代码(带注释) 

//*******************************************************
//* 操作系统实验三 死锁                                                *
//* 实验学院一班(0436101) 张元竞(6040310110)                           *
//* 2006-10-15                                            *
//******************************************************/

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>

//共有 3 种资源,3 个进程
bool avoid;
struct info//进程信息 {
       long tot[4];//最大占用资源数
       long p[4];// 已经占有的资源数
}pro[5];
long LeftRes[4];//剩余资源数
long qu[4];

void init()//函数功能:输入和初始化
{
       char tmp[128];
       long i,j;

       // 以下由用户选择是否采用避免死锁算法
       printf("是否采用避免死锁算法?(Y/N)");
       gets(tmp);
       avoid=(tmp[0]=='Y' || tmp[0]=='y');

       //输入各进程的资源信息
       printf("请输入各进程的资源信息:\n");
       printf("依次输入各进程所需要的最大资源数量:\n");
       for (i=1;i<=3;i++)
       {
           for (j=1;j<=3;j++)
           {
                 scanf("%ld",&pro[i].tot[j]);
           }
       }
       printf("依次输入各进程已经占据的资源数量:\n");
       for (i=1;i<=3;i++)
       {
           for (j=1;j<=3;j++)
           {
                 do 751com.cn
                 {
                      scanf("%ld",&pro[i].p[j]);
                      if (pro[i].p[j]>pro[i].tot[j])
                            printf("\n  占有资源超过了声明的最大资源,请重新输入\n");
                 }while (pro[i].p[j]>pro[i].tot[j]);
           }
       }

       //初始化资源数量
       for (i=1;i<=3;i++)

上一页  [1] [2] [3] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有