银行家算法实验报告

时间:2024.4.20

计算机学院《操作系统》课程设计报告

设计题目:银行家算法的实现

姓名:

学号:

班级: 06网络工程班

完成日期: 2009613

银行家算法分析、设计与实现

一、           设计理论描述

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

(1) 模拟一个银行家算法;

(2) 初始化时让系统拥有一定的资源;

(3) 用键盘输入的方式申请资源;

(4) 如果预分配后,系统处于安全状态,则修改系统的资源分配情况;

(5) 如果预分配后,系统处于不安全状态,则提示不能满足请求,

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

银行家算法. 顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。

把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.

二、算法描述及数据结构模型

   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)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
2.安全性检查
(1)设置两个工作向量Work=Available;Finish[M]=False
(2)从进程集合中找到一个满足下述条件的进程,
   Finish [i]=False
   Need<=Work
   如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
    Work=Work+Allocation
    Finish=True
    GO TO 2
(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

3.数据结构

#define False 0

#define True 1

int Max[100][100]={0};//各进程所需各类资源的最大需求

int Avaliable[100]={0};//系统可用资源

char name[100]={0};//资源的名称

int Allocation[100][100]={0};//系统已分配资源

int Need[100][100]={0};//还需要资源

int Request[100]={0};//请求资源向量

int temp[100]={0};//存放安全序列

int Work[100]={0};//存放系统可提供资源

int M=100;//作业的最大数为100

int N=100;//资源的最大数为100

void showdata()//显示资源矩阵

三、源代码

#include<iostream.h>

#include<string.h>

#include<stdio.h>

#define False 0

#define True 1

int Max[100][100]={0};//各进程所需各类资源的最大需求

int Avaliable[100]={0};//系统可用资源

char name[100]={0};//资源的名称

int Allocation[100][100]={0};//系统已分配资源

int Need[100][100]={0};//还需要资源

int Request[100]={0};//请求资源向量

int temp[100]={0};//存放安全序列

int Work[100]={0};//存放系统可提供资源

int M=100;//作业的最大数为100

int N=100;//资源的最大数为100

void showdata()//显示资源矩阵

{

   int i,j;

   cout<<"系统目前可用的资源[Avaliable]:"<<endl;

   for(i=0;i<N;i++)

    cout<<name[i]<<" ";

   cout<<endl;

   for (j=0;j<N;j++)

      cout<<Avaliable[j]<<" ";//输出分配资源

   cout<<endl;

   cout<<"             Max      Allocation     Need"<<endl;

   cout<<"进程名      ";

   for(j=0;j<3;j++){

      for(i=0;i<N;i++)

     cout<<name[i]<<" ";

   cout<<"      ";

   }

   cout<<endl;

   for(i=0;i<M;i++){

    cout<<" "<<i<<"         ";

    for(j=0;j<N;j++)

     cout<<Max[i][j]<<" ";

    cout<<"      ";

    for(j=0;j<N;j++)

     cout<<Allocation[i][j]<<" ";

    cout<<"      ";

    for(j=0;j<N;j++)

     cout<<Need[i][j]<<" ";

    cout<<endl;

   }

}

int changdata(int i)//进行资源分配

{

int j;

for (j=0;j<M;j++) {

      Avaliable[j]=Avaliable[j]-Request[j];

      Allocation[i][j]=Allocation[i][j]+Request[j];

      Need[i][j]=Need[i][j]-Request[j];

}

return 1;

}

int safe()//安全性算法

{

int i,k=0,m,apply,Finish[100]={0};

int j;

int flag=0;

Work[0]=Avaliable[0];

Work[1]=Avaliable[1];

Work[2]=Avaliable[2];

for(i=0;i<M;i++){

   apply=0;

   for(j=0;j<N;j++){

    if (Finish[i]==False&&Need[i][j]<=Work[j]){  

     apply++;

     if(apply==N){

      for(m=0;m<N;m++)

         Work[m]=Work[m]+Allocation[i][m];//变分配数

         Finish[i]=True;

      temp[k]=i;

      i=-1;

         k++;

      flag++;

     }

    }

   }

}

for(i=0;i<M;i++){

   if(Finish[i]==False){

     cout<<"系统不安全"<<endl;//不成功系统不安全

     return -1;

   }

}

    cout<<"系统是安全的!"<<endl;//如果安全,输出成功

    cout<<"分配的序列:";

for(i=0;i<M;i++){//输出运行进程数组

       cout<<temp[i];

    if(i<M-1) cout<<"->";

}

   cout<<endl;

   return 0;

}

void share()//利用银行家算法对申请资源对进行判定

{

char ch;

int i=0,j=0;

ch='y';

cout<<"请输入要求分配的资源进程号(0-"<<M-1<<"):";

    cin>>i;//输入须申请的资源号

cout<<"请输入进程 "<<i<<" 申请的资源:"<<endl;

for(j=0;j<N;j++)

{

   cout<<name[j]<<":";

   cin>>Request[j];//输入需要申请的资源

}

      for (j=0;j<N;j++){

      if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错

   {

     cout<<"进程 "<<i<<"申请的资源大于它需要的资源";

           cout<<" 分配不合理,不予分配!"<<endl;

     ch='n';

           break;

}

       else {

             if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则

     {                         //出错

     cout<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";

       cout<<" 分配出错,不予分配!"<<endl;

       ch='n';

     break;

       }

    }

    }

    if(ch=='y') {

       changdata(i);//根据进程需求量变换资源

    showdata();//根据进程需求量显示变换后的资源

       safe();//根据进程需求量进行银行家算法判断

    }

}

void addresources(){//添加资源

    int n,flag;

cout<<"请输入需要添加资源种类的数量:";

cin>>n;

flag=N;

N=N+n;

for(int i=0;i<n;i++){

   cout<<"名称:";

   cin>>name[flag];

   cout<<"数量:";

   cin>>Avaliable[flag++];

}

showdata();

safe();

}

void delresources(){//删除资源

char ming;

int i,flag=1;

cout<<"请输入需要删除的资源名称:";

do{

    cin>>ming;

for(i=0;i<N;i++)

   if(ming==name[i]){

    flag=0;

    break;

   }

if(i==N)

   cout<<"该资源名称不存在,请重新输入:";

}

while(flag);

for(int j=i;j<N-1;j++)

{

   name[j]=name[j+1];

   Avaliable[j]=Avaliable[j+1];

    }

N=N-1;

showdata();

safe();

}

void changeresources(){//修改资源函数

cout<<"系统目前可用的资源[Avaliable]:"<<endl;

    for(int i=0;i<N;i++)

    cout<<name[i]<<":"<<Avaliable[i]<<endl;

cout<<"输入系统可用资源[Avaliable]:"<<endl;

cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2];

cout<<"经修改后的系统可用资源为"<<endl;

for (int k=0;k<N;k++)

    cout<<name[k]<<":"<<Avaliable[k]<<endl;

showdata();

safe();

}

void addprocess(){//添加作业

    int flag=M;

M=M+1;

cout<<"请输入该作业的最打需求量[Max]"<<endl;

for(int i=0;i<N;i++){

   cout<<name[i]<<":";

   cin>>Max[flag][i];

   Need[flag][i]=Max[flag][i]-Allocation[flag][i];

}

showdata();

safe();

}

int main()//主函数

{

    int i,j,number,choice,m,n,flag;

char ming;

cout<<"*****************单处理机系统进程调度实现*****************"<<endl;

cout<<"请首先输入系统可供资源种类的数量:";

cin>>n;

N=n;

for(i=0;i<n;i++)

{

   cout<<"资源"<<i+1<<"的名称:";

   cin>>ming;

   name[i]=ming;

   cout<<"资源的数量:";

   cin>>number;

   Avaliable[i]=number;

}

cout<<endl;

cout<<"请输入作业的数量:";

cin>>m;

M=m;

cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[Max]:"<<endl;

for(i=0;i<m;i++)

   for(j=0;j<n;j++)

    cin>>Max[i][j];

do{

    flag=0;

    cout<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;

    for(i=0;i<m;i++)

    for(j=0;j<n;j++){

      cin>>Allocation[i][j];

       if(Allocation[i][j]>Max[i][j])

       flag=1;

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

   }

   if(flag)

    cout<<"申请的资源大于最大需求量,请重新输入!\n";

}

while(flag);

    showdata();//显示各种资源

    safe();//用银行家算法判定系统是否安全

    while(choice)

{

    cout<<"**************银行家算法演示***************"<<endl;

    cout<<"               1:增加资源    "<<endl;

    cout<<"               2:删除资源    "<<endl;

    cout<<"               3:修改资源    "<<endl;

    cout<<"               4:分配资源    "<<endl;

    cout<<"               5:增加作业    "<<endl;

    cout<<"               0:离开        "<<endl;

    cout<<"*******************************************"<<endl;

    cout<<"请选择功能号:";

    cin>>choice;

    switch(choice)

    {

      case 1: addresources();break;

      case 2: delresources();break;

   case 3: changeresources();break;

   case 4: share();break;

   case 5: addprocess();break;

   case 0: choice=0;break;

   default: cout<<"请正确选择功能号(0-5)!"<<endl;break;

    }

}

    return 1;

}

四、程序运行结果及分析

    T0 时刻的资源分配表(各种资源的数量分别为:10、5、7)

  运行结果

   

五、课程设计心得与体会

银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。

六.参考文献:

[1]《计算机操作系统》汤子瀛等:西安电子科技大学出版社

[2]《高级语言c++程序设计》刘璟等:高等教育出版社

 

更多相关推荐:
操作系统实验报告--C语言实现银行家算法

C语言实现银行家算法程序设计实验报告实验报告C语言实现银行家算法程序设计实验报告C语言实现银行家算法程序设计实验报告C语言实现银行家算法程序设计实验报告C语言实现银行家算法程序设计实验报告C语言实现银行家算法程...

计算机操作系统银行家算法实验报告

计算机操作系统实验报告一实验名称银行家算法二实验目的银行家算法是避免死锁的一种重要方法通过编写一个简单的银行家算法程序加深了解有关资源申请避免死锁等概念并体会和了解死锁和避免死锁的具体实施方法三问题分析与设计1...

银行家算法+实验报告

淮海工学院计算机工程学院实验报告书课程名操作系统原理题目银行家算法班级学号511021012姓名操作系统原理实验报告1一实验目的银行家算法是操作系统中避免死锁的典型算法本实验可以加深对银行家算法的步骤和相关数据...

操作系统实验报告(银行家算法c语言描述)

洛阳理工学院实验报告17273747576777

银行家算法实验报告

计算机操作系统实验报告何美西109253030212一实验名称银行家算法二实验目的银行家算法是避免死锁的一种重要方法通过编写一个简单的银行家算法程序加深了解有关资源申请避免死锁等概念并体会和了解死锁和避免死锁的...

银行家算法实验报告

银行家算法银行家算法姓名学号报告日期操作系统实验三1银行家算法一实验目的通过实验加深对多实例资源分配系统中死锁避免方法银行家算法的理解掌握Windows环境下银行家算法的实现方法同时巩固利用WindowsAPI...

操作系统银行家算法实验报告

银行家算法开发语言及实现平台或实验环境CMicrosoftVisualStudio60实验目的1进一步理解利用银行家算法避免死锁的问题2在了解和掌握银行家算法的基础上编制银行家算法通用程序将调试结果显示在计算机...

操作系统 银行家算法实验报告

计算机操作系统课程设计题目银行家算法分析学院计算机与软件学院专业网络工程班级20xx级1班学号20xx1346001姓名方锡指导教师岳键起止时间20xx52020xx63一实验报告设计背景11产生死锁的原因我们...

银行家算法实验报告--谢璐

操作系统试验姓名谢路班级软件0912学号题目银行家算法报告20xx年12月13日星期一实验银行家算法一实验目的银行家算法是一种最有代表性的避免死锁的算法在避免死锁方法中允许进程动态地申请资源但系统在进行资源分配...

操作系统实验报告 银行家算法

昆明理工大学信息工程与自动化学院学生实验报告201201学年第二学期课程名称操作系统开课实验室年月日一实验目的通过编写银行家算法要求学生进一步掌握如何实现死锁的避免进一步熟练使用数组进行程序的设计及实现二实验原...

银行家算法实验报告 mfc

XXXXXXX学院计算机操作系统课程设计死锁的避免银行家算法专业班级XXXXXXX成员王x蔡x王xx提交时间xxxx年xx月xx日一问题描述11银行家算法银行家算法是一种最有代表性的避免死锁的算法在避免死锁方法...

银行家算法_实验报告

课程设计报告课程设计名称共享资源分配与银行家算法系部专业班级姓名学号指导教师年月日目录一课程设计目的和意义3二方案设计及开发过程31课题设计背景32算法描述33数据结构44主要函数说明45算法流程图5三调试记录...

银行家算法实验报告(37篇)