课程设计银行家算法的模拟实现.docx

上传人:b****3 文档编号:10861042 上传时间:2023-05-28 格式:DOCX 页数:15 大小:18.85KB
下载 相关 举报
课程设计银行家算法的模拟实现.docx_第1页
第1页 / 共15页
课程设计银行家算法的模拟实现.docx_第2页
第2页 / 共15页
课程设计银行家算法的模拟实现.docx_第3页
第3页 / 共15页
课程设计银行家算法的模拟实现.docx_第4页
第4页 / 共15页
课程设计银行家算法的模拟实现.docx_第5页
第5页 / 共15页
课程设计银行家算法的模拟实现.docx_第6页
第6页 / 共15页
课程设计银行家算法的模拟实现.docx_第7页
第7页 / 共15页
课程设计银行家算法的模拟实现.docx_第8页
第8页 / 共15页
课程设计银行家算法的模拟实现.docx_第9页
第9页 / 共15页
课程设计银行家算法的模拟实现.docx_第10页
第10页 / 共15页
课程设计银行家算法的模拟实现.docx_第11页
第11页 / 共15页
课程设计银行家算法的模拟实现.docx_第12页
第12页 / 共15页
课程设计银行家算法的模拟实现.docx_第13页
第13页 / 共15页
课程设计银行家算法的模拟实现.docx_第14页
第14页 / 共15页
课程设计银行家算法的模拟实现.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

课程设计银行家算法的模拟实现.docx

《课程设计银行家算法的模拟实现.docx》由会员分享,可在线阅读,更多相关《课程设计银行家算法的模拟实现.docx(15页珍藏版)》请在冰点文库上搜索。

课程设计银行家算法的模拟实现.docx

课程设计银行家算法的模拟实现

1 课设简介:

    1.1 课程设计题目

银行家算法的模拟实现

    1.2 课程设计目的

通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。

    1.3 课程设计内容

模拟实现动态资源分配。

同时要求编写和调试一个系统动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。

2 实验原理分析:

银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程张勇;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。

防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。

通过这个算法可以用来解决生活中的实际问题,如银行贷款等。

3 程序结构分析:

3.2 程序模块划分

3.2.1.银行家算法:

设进程i提出请求Request[n],则银行家算法按如下规则进行判断。

(1)如果Request[n]>Need[i,n],则报错返回。

(2)如果Request[n]>Available,则进程i进入等待资源状态,返回。

(3)假设进程i的申请已获批准,于是修改系统状态:

   Available=Available-Request

   Allocation=Allocation+Request

   Need=Need-Request

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

3.2.2.安全性检查

(1)设置两个工作向量Work=Available;Finish[M]=False

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

  Finish[i]=False

  Need<=Work

  如找到,执行(3);否则,执行(4)

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

   Work=Work+Allocation

   Finish=True

   GOTO2

(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

3.2.3.数据结构

假设有M个进程N类资源,则有如下数据结构:

#defineW10

#defineR20

intA;                     //总进程数

intB;                    //资源种类

intALL_RESOURCE[W];       //各种资源的数目总和

intMAX[W][R];            //M个进程对N类资源最大资源需求量

intAVAILABLE[R];         //系统可用资源数

intALLOCATION[W][R];     //M个进程已经得到N类资源的资源量

intNEED[W][R];           //M个进程还需要N类资源的资源量

intRequest[R];           //请求资源个数

3.2.4.主要函数说明

voidshowdata();          //主要用来输出资源分配情况

voidchangdata(int);      //主要用来输出资源分配后后的情况

voidrstordata(int);      //用来恢复资源分配情况,如:

银行家算法时,由于分配不安全则要恢复资源分配情况

intchkerr(int);          //银行家分配算法的安全检查

voidbank()  ;            //银行家算法

银行家算法的课程设计

(二)VC++6.02008-01-2815:

29源程序

4 数据结构分析

假设有M个进程N类资源,则有如下数据结构:

#defineW10

#defineR20

intA;                     //总进程数

intB;                    //资源种类

intALL_RESOURCE[W];       //各种资源的数目总和

intMAX[W][R];            //M个进程对N类资源最大资源需求量

intAVAILABLE[R];         //系统可用资源数

intALLOCATION[W][R];     //M个进程已经得到N类资源的资源量

intNEED[W][R];           //M个进程还需要N类资源的资源量

intRequest[R];           //请求资源个数

5 各子模块相关函数代码

voidshowdata();          //主要用来输出资源分配情况

voidchangdata(int);      //主要用来输出资源分配后后的情况

voidrstordata(int);      //用来恢复资源分配情况,如:

银行家算法时,由于分配不安全则要恢复资源分配情况

intchkerr(int);          //银行家分配算法的安全检查

voidbank()  ;            //银行家算法

6   程序运行结果分析

    6.1 示例数据

      EG:

          进程总数:

2

          总资源种类:

1

          总资源数:

资源0:

12

          进程0的0类资源:

12

          进程0的1类资源:

1

          进程0已占有0类:

11

          进程0已占有1类:

0

          资源0总数:

12

          系统可用资源数:

1

          进程P0还需资源0:

1

          进程P1还需资源0:

1

          依次分配给P0、P1一个资源后,系统一个循环时间片完成

7 心得体会

银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程张勇;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。

防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。

通过这个算法可以用来解决生活中的实际问题,如银行贷款等。

 

参考文献:

[1]严蔚敏、吴伟民.《数据结构(C语言版)》.北京:

清华大学出版社,2007.4.

[2]谭浩强等.《C程序设计(第二版)》.北京:

清华大学出版社,2005.9.

相关工具:

MicrosoftVirualC++6.0

8程序源代码

操作系统课程设计做完了:

银行家算法

(一) 代码(2008-06-3003:

20:

32)

标签:

教育 杂谈 

分类:

日记

#include"string.h"

#include"iostream"

#include"iomanip"

usingnamespacestd;

#defineFALSE0

#defineTRUE1

#defineW10

#defineR20

intFINISH[W];

intA;//总进程个数

intB;//总资源种类

intALL_RESOURCE[W];//各种资源的数目总和

intMAX[W][R];//A个进程对B类资源最大资源需求量

intAVAILABLE[R];//系统可用资源数

intALLOCATION[W][R];//A个进程已经得到B类资源的资源量

intNEED[W][R];//A个进程还需要B类资源的资源量

intRequest[R];//请求资源个数

voidshowdata()//函数showdata,输出资源分配情况

{

  inti,j;

  

cout<<"————————————————————————"<

  cout<<"各种资源的总数量(all):

"<

  cout<<" ";

  for(j=0;j<<"P?

<

<

:

>

  cout<<" ";

  for(j=0;j<<"P资源?

<

:

?

<

  cout<<"各进程还需要的资源量(need):

"<

  cout<<"     ";

  for(j=0;j<

  for(i=0;i

  {

    cout<<"进程p"<

";

    for(j=0;j<

  }

  cout<

  cout<<"—————————————————————";

  cout<<"各进程已经得到的资源量(allocation):

"<

  

  cout<<"     ";

  for(j=0;j<

  for(i=0;i

  {

    cout<<"进程p"<

";

    for(j=0;j<

  }

  cout<

  

}

voidchangdata(intk)//函数changdata,改变可用资源和已经拿到资源和还需要的资源的值

{

  intj;

  for(j=0;j

  {AVAILABLE[j]=AVAILABLE[j]-Request[j];

    ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

    NEED[k][j]=NEED[k][j]-Request[j];

  }

}

voidrstordata(intk)//函数rstordata,恢复可用资源和已经拿到资源和还需要的资源的值

{ intj;

  for(j=0;j

  {AVAILABLE[j]=AVAILABLE[j]+Request[j];

    ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];

    NEED[k][j]=NEED[k][j]+Request[j];

  }

}

intchkerr(ints)//函数chkerr,检查是否安全

{intWORK;//FINISH[W]

   inti,j,k=0;

   for(i=0;i

   for(j=0;j

    {

       WORK=AVAILABLE[j];

       i=s;

       do

           {

         if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)

           {

                  WORK=WORK+ALLOCATION[i][j];

                  FINISH[i]=TRUE;

                  i=0;

           }

         else

           {

    i++;

           }

           }while(i

       for(i=0;i

       if(FINISH[i]==FALSE)

           {

           cout<

           cout<<"系统不安全!

!

!

本次资源申请不成功!

!

!

"<

           cout<

           return1;

    cout<<"进程p"<<"状态:

 P阻塞?

<

           }

    }

   cout<

   cout<<"经安全性检查,系统安全,本次分配成功。

"<

   cout<

   return0;

}

 voidset()

 {

 intt[10];

 for(inti=0;i

  t[i]=0;

  for(intj=0;j }

 for(i=0;i

  if(t[i]==B)

  {cout<<"进程p"<<"状态:

 运行结束?

<

  for(intk=0;k

   AVAILABLE[k]=AVAILABLE[k]+ALLOCATION[i][k];

      ALLOCATION[i][k]=0;

  }

  else

   cout<<"进程p"<<"状态:

 等待调用?

<

 }

voidbank()  //银行家算法

{

    int i=0,j=0;

    charflag='Y';

    

    while(flag=='Y'||flag=='y')

    {

      i=-1;

      while(i<0||i>=A)

       {

        cout<<"请输入需申请资源的进程号(从P0到P"<<",否则重输入!

):

";

        cout<<"p";cin>>i;

        if(i<0||i>=A)cout<<"输入的进程号不存在,重新输入!

"<

       }

     cout<<"请输入进程P"<<"申请的资源数:

"<

        for(j=0;j

  {

 

          cout<<"资源"<<":

P?

;<>

             cout<<"申请不合理,出错!

请重新选择!

"<

             flag='B';

             break;

   }

                 else

     {

                    if(Request[j]>AVAILABLE[j])//若请求的资源数大于可用资源数

     {

                     cout<<"进程P"<<"申请的资源数大于系统可用"<

";

                     cout<<"申请不合理,出错!

请重新选择!

"<

                     flag='B';

                     break;

     }

     }

  }

    if(flag=='Y'||flag=='y')

    {

     changdata(i);//调用changdata(i)函数,改变资源数

     if(chkerr(i))//若系统不安全

  {

           rstordata(i);//调用rstordata(i)函数,恢复资源数

           showdata();  //输出资源分配情况

  }

     else {    //若系统安全

     showdata();//输出资源分配情况

  set();

  }

    }

     else     //若flag=B||flag=vb

     showdata();

  

     cout<

     cout<<"是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:

";

     cin>>flag;

    }

 

}

voidmain()//主函数

{

  inti=0,j=0,p;

  

  cout<<"==================================================="<

  cout<

  cout<<"欢迎进入操作系统课程设计"<

  cout<

  cout<<"   银行家算法"<

  cout<

  

  cout<<"               ----06教育胡亮061114060"<

  cout<

  cout<<"==================================================="<

  cout<

  cout<<"请输入总进程数:

"<

  cin>>A;

  cout<<"请输入总资源种类:

"<

  cin>>B;

  cout<<"请输入总资源数(all_resource):

"<

  for(i=0;i

  {cout<<"资源"<<":

";cin>>ALL_RESOURCE[i];}

  cout<<"依次输入各进程所需要的最大资源数量(max):

"<

  for(i=0;i<>

  {

     for(j=0;j<>

  {

       do

        {cout<<"进程"<<"所需";

   

   cout<<"类资源的数目:

";

         cin>>MAX[i][j];

         if(MAX[i][j]>ALL_RESOURCE[j])//最大需求量小于资源的总数

         cout<<"所需资源超过了声明的该资源总数,请重新输入"<

         }while(MAX[i][j]>ALL_RESOURCE[j]);

     }

}

cout<<"依次输入各进程已经占据的资源数量(allocation):

"<

for(i=0;i

{

   for(j=0;j

    {

      do

        {cout<<"进程"<<"已占有";

   

   cout<<"类资源的数目:

";

         cin>>ALLOCATION[i][j];

         if(ALLOCATION[i][j]>MAX[i][j])

         cout<<"占有资源超过了所需的最大资源,请重新输入"<

         }while(ALLOCATION[i][j]>MAX[i][j]);

        }

    }

    //初始化资源数量

     for(j=0;j

     {p=ALL_RESOURCE[j];

        for(i=0;i

         {

          p=p-ALLOCATION[i][j];//减去已经被占据的资源

          AVAILABLE[j]=p;

          if(AVAILABLE[j]<0)

          AVAILABLE[j]=0;

          }

    }

     for(i=0;i

     for(j=0;j

        NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];

     showdata();

     bank();

  

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2