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

时间:2024.4.20

银行家算法

【开发语言及实现平台或实验环境】

C++

Microsoft Visual Studio 6.0

【实验目的】

(1)进一步理解利用银行家算法避免死锁的问题;

(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。

(3)理解和掌握安全序列、安全性算法

【实验要求】

(1)了解和理解死锁;

(2)理解利用银行家算法避免死锁的原理;

(3)会使用某种编程语言。

【实验原理】

一、安全状态

指系统能按照某种顺序如<P1,P2,…,Pn>(称为<P1,P2,…,Pn>序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。

二、银行家算法

假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。系统按下述步骤进行安全检查:

(1)如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。

(2)如果Requesti≤Available则继续以下检查,否则显示系统无足够资源,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等待。

三、安全性算法

(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[i]+Allocation[i,j];

Ø   Finish[i]∶=true;

Ø   go to step 2;

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

【实验步骤】

       参考实验步骤如下:

(1)参考图1-1所示流程图编写安全性算法。

 


(2)编写统一的输出格式。

       每次提出申请之后输出申请成功与否的结果。如果成功还需要输出变化前后的各种数据,并且输出安全序列。

(3)参考图1-2所示流程图编写银行家算法。

(4)编写主函数来循环调用银行家算法。

 


【参考代码】

#include<iostream>

#include<string.h>

#include<stdio.h>

#define False 0

#define True 1

using namespace std;

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;//进程的最大数为

int N=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;

       }

}

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

{

       int j;

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

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

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

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

       }

      

}

void deletejob(int i)

{int j,count=0;

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

             

              if(Need[i][j]==0)

              {

                     count++;

              }

       }

       if(count==N)

       {

              cout<<"!!!!!!!!!!!!!此作业需求的资源已经分配完毕,自动释放!!!!!!!!!!!!"<<endl;

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

              {

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

              }

              M--;

       }

}

int safe()//安全性算法

{

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

       int j;

      

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

       {

       Work[i]=Avaliable[i];

       }

       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++;

                                  

                            }

                     }

              }

       }

       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);//根据进程需求量变换资源

              deletejob(i);

              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<<"\t---------------------------------------------------"<<endl;

       cout<<"\t||                                               ||"<<endl;

       cout<<"\t||               银行家算法的实现                ||"<<endl;

       cout<<"\t||                                               ||"<<endl;

       cout<<"\t||                 binbinwangbin                 ||"<<endl;

       cout<<"\t||                                               ||"<<endl;

       cout<<"\t||                                               ||"<<endl;

       cout<<"\t---------------------------------------------------"<<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<<"\t-------------------银行家算法演示------------------"<<endl;

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

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

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

              cout<<"\t---------------------------------------------------"<<endl;

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

              cin>>choice;

              switch(choice)

              {

                     case 1: addprocess();break;

                     case 2: share();break;

                     case 0: choice=0;break;

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

              }

       }

    return 1;

}

更多相关推荐:
计算机操作系统银行家算法实验报告

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

操作系统实验报告--C语言实现银行家算法

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

银行家算法+实验报告

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

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

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

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

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

银行家算法实验报告

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

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

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

银行家算法_实验报告

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

《银行家算法的模拟实现》—实验报告

银行家算法的模拟实现实验报告题目银行家算法的模拟实现专业班级组员指导老师一实验目的死锁会引起计算机工作僵死因此操作系统中必须防止本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程...

操作系统实验四银行家算法

操作系统实验实验四银行家算法学号1215108019姓名李克帆班级12电子2班华侨大学电子工程系实验目的1理解银行家算法2掌握进程安全性检查的方法与资源分配的方法实验内容与基本要求编制模拟银行家算法的程序并以下...

操作系统课程设计_银行家算法

操作系统银行家算法CopyRightNigHtMaRe20xx年12月30日操作系统银行家算法课程设计报告姓名赵又廷学号012646234班级05计科12班专业计算机科学与技术操作系统银行家算法CopyRigh...

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

银行家算法实验报告一实验题目为了了解系统的资源分配情况假定系统的任何一种资源在任一种资源在任意时刻只能被一个进程使用任何进程已经占用的资源只能由进程自己释放而不能任由其他进程抢占当进程申请的资源不能满足时必须等...

操作系统银行家算法实验报告(30篇)