银行家算法实验报告

时间:2024.4.27

实验目的

根据银行家算法的思想,编写程序,解决并发进程的死锁问题。

实验内容

进程的死锁避免算法。编写一段程序,模拟银行家算法,解决进程的死锁问题。 利用VC++6.0实现上述程序设计和调试操作,根据提示输入相应的资源请求,对于算法操作的成功与否提供一定的提示框。

实验心得

虽然基础一般,但是我仍然坚持把程序拿下,这是让自己很欣慰的事,本次实验不仅让我对银行家算法有了更深入的理解,并且还让我的编程能力得到了较大提高,希望能有更多这样的机会,借此较好的锻炼自己,从而更好的掌握和运用自己的专业知识,提高能力水平。


第二篇:银行家算法


           计算机操作系统实验报告

银行家算法

班   别:

姓   名:

学   号:

            指导老师:


一、实验名称:银行家算法

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

三、实验设计:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。

四、实验代码:

#include <iostream.h>

#include <stdio.h>

#include <windows.h>

#define MAX_PROCESS 32              //最大进程数

#define MAX_RESOURCE 64              //最大资源类别

int PROCESS_NUM;              //实际总进程数

int RESOURCE_NUM;               //实际资源类别数

int Available[MAX_RESOURCE];                 //可利用资源向量

int Max[MAX_PROCESS][MAX_RESOURCE];          //最大需求矩阵

int Allocation[MAX_PROCESS][MAX_RESOURCE];   //分配矩阵

int Need[MAX_PROCESS][MAX_RESOURCE];         //需求矩阵

int Request_PROCESS;                       //发出请求的进程

int Request_RESOURCE_NEMBER[MAX_RESOURCE];     //请求资源数

void Read_Available_list();      //读入可用资源Available

void Read_Max_list();           //读入最大需求矩阵Max

void Read_Allocation_list();    //读入已分配矩阵Allocation

void PrintInfo();               //打印各数据结构信息

void Read_Request();                         //输入请求向量

void Allocate_Source();         //开始正式分配资源(修改Allocation_list.txt)

void Recover_TryAllocate();     //恢复试分配前状态

int Test_Safty();               //安全性检测

void RunBanker();               //执行银行家算法

//读入可用资源Available

void Read_Available_list()     

{

         FILE *fp;

         if((fp=fopen("Available_list.txt","r"))==NULL)

         {

                   cout<<"错误,文件打不开,请检查文件名"<<endl;

                   exit(0);

         }

         fscanf(fp,"%d",&RESOURCE_NUM);

         int i=0;

         while(!feof(fp))

         {

                   fscanf(fp,"%d",&Available[i]);

                   i++;

         }       

         fclose(fp);

}

//读入最大需求矩阵Max

void Read_Max_list()     

{

         FILE *fp;

         if((fp=fopen("Max_list.txt","r"))==NULL)

         {

                   cout<<"错误,文件打不开,请检查文件名"<<endl;

                   exit(0);

         }

         fscanf(fp,"%d",&PROCESS_NUM);

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

                   for(int j=0;j<RESOURCE_NUM;j++)

                            fscanf(fp,"%d",&Max[i][j]);

         fclose(fp);

}

//读入已分配矩阵Allocation

void Read_Allocation_list()     

{

         FILE *fp;

         if((fp=fopen("Allocation_list.txt","r"))==NULL)

         {

                   cout<<"错误,文件打不开,请检查文件名"<<endl;

                   exit(0);

         }

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

                   for(int j=0;j<RESOURCE_NUM;j++)

                            fscanf(fp,"%d",&Allocation[i][j]);

         fclose(fp);

}

//设置需求矩阵Need

void Set_Need_Available()                                           

{                

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

                   for(int j=0;j<RESOURCE_NUM;j++)

                   {

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

                            Available[j]=Available[j]-Allocation[i][j];

                   }

}

//打印各数据结构信息

void PrintInfo()

{

         cout<<"进程个数: "<<PROCESS_NUM<<"\t"<<"资源个数: "<<RESOURCE_NUM<<endl;

         cout<<"可用资源向量Available:"<<endl;

         int i,j;

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

                   cout<<Available[i]<<"\t";

         cout<<endl;

         cout<<"最大需求矩阵Max:"<<endl;

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

         {

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

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

                   cout<<endl;

         }

         cout<<"已分配矩阵Allocation:"<<endl;

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

         {

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

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

                   cout<<endl;

         }

         cout<<"需求矩阵Need:"<<endl;

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

         {

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

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

                   cout<<endl;

         }

}

//输入请求向量

void Read_Request()                         

{                         

         cout<<"输入发起请求的进程(0-"<<PROCESS_NUM-1<<"):";

         cin>>Request_PROCESS;

         cout<<"输入请求资源的数目:按照这样的格式输入 x x x:";

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

                   cin>>Request_RESOURCE_NEMBER[i];

}

//开始正式分配资源(修改Allocation_list.txt)

void Allocate_Source()

{                      

         cout<<'\n'<<"开始给第"<<Request_PROCESS<<"个进程分配资源..."<<endl;

         FILE *fp;

         if((fp=fopen("Allocation_list.txt","w"))==NULL)

         {

                   cout<<"错误,文件打不开,请检查文件名"<<endl;

                   exit(0);

         }

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

         {

                   for(int j=0;j<RESOURCE_NUM;j++)

                            fprintf(fp,"%d  ",Allocation[i][j]);

                   fprintf(fp,"\n");

         }

         cout<<"分配完成,已更新Allocation_list.txt"<<endl;

         fclose(fp);

}

//恢复试分配前状态

void Recover_TryAllocate()

{

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

         {

                   Available[i]=Available[i]+Request_RESOURCE_NEMBER[i];

                   Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]-Request_RESOURCE_NEMBER[i];

              Need[Request_PROCESS][i]=Need[Request_PROCESS][i]+Request_RESOURCE_NEMBER[i];

         }

}

//安全性检测

//返回值:0:未通过安全性测试; 1:通过安全性测试

int Test_Safty()

{                       

         cout<<'\n'<<"进入安全性检测!"<<endl;

         int i,j;

    int Work[MAX_RESOURCE];   //定义工作向量

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

                   Work[i]=Available[i];

         }

    bool Finish[MAX_PROCESS];  //定义布尔向量

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

                   Finish[i]=false;

         int safe[MAX_RESOURCE];   //用于保存安全序列

   

         bool found=false;   //判断在一轮查找中是否找到符合条件的进程

         int FinishCount=0;       //找到满足条件的进程i的数目

         while(FinishCount<5)

         {

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

                   {

                            if(Finish[i]==true) //检查是否满足条件Finish[i]==false

                                     continue;

                            bool HasResource=true;

                            for(j=0;j<RESOURCE_NUM;j++)    //检查是否满足条件Need[i]<=Work

                                     if(Need[i][j]>Work[j])

                                               HasResource=false;

                            if(HasResource)

                            {

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

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

                                     Finish[i]=true;

                                     safe[FinishCount]=i;

                                     FinishCount++;

                                     found=true;

                            }

                   }

                   if(found)

                   {

                            found=false;

                   }else

                            break;               

         }

    for(i=0;i<PROCESS_NUM;i++)   //判断是否所有进程满足Finish[i]==true

         {

                   if(Finish[i]==true)

                            continue;

                   else

                   {

                            cout<<"未通过安全性测试,不分配"<<endl;

                            return 0;

                   }

         }

         cout<<'\n'<<"找到一个安全序列:";

    for(i=0;i<PROCESS_NUM;i++)    //打印安全序列

         {

                   cout<<"P"<<safe[i];

                   if(i!=PROCESS_NUM-1)

                            cout<<"--->";

         }

         cout<<'\n'<<"已通过安全性测试!"<<endl;

         return 1;

}

void RunBanker(){              //执行银行家算法

         cout<<endl;

         cout<<"开始执行银行家算法..."<<endl;

         for(int i=0;i<RESOURCE_NUM;i++)  //检查是否满足条件Request<=Need

                   if(Request_RESOURCE_NEMBER[i]>Need[Request_PROCESS][i])

                   {

                            cout<<"\n第"<<Request_PROCESS<<"个进程请求资源不成功"<<endl;

                            cout<<"原因:超出该进程尚需的资源的最大数量!"<<endl;

                            return;

                   }

         for(i=0;i<RESOURCE_NUM;i++)   //检查是否满足条件Request<=Available

                   if(Request_RESOURCE_NEMBER[i]>Available[i])

                   {

                            cout<<"\n第"<<Request_PROCESS<<"个进程请求资源不成功"<<endl;

                            cout<<"原因:系统中无足够的资源!"<<endl;

                            return;

                   }

                   else{

                            //试分配,更新各相关数据结构

                            Available[i]=Available[i]-Request_RESOURCE_NEMBER[i];

                       Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]+Request_RESOURCE_NEMBER[i];

                  Need[Request_PROCESS][i]=Need[Request_PROCESS][i]-Request_RESOURCE_NEMBER[i];

                   }

         cout<<endl<<"试分配完成..."<<endl;

         if(Test_Safty())    //使用安全性算法检查,若满足,则正式分配

                   Allocate_Source();

         else                //否则恢复试分配前状态

                   Recover_TryAllocate();

}

void main()

{

         char c;

         Read_Available_list();

         Read_Max_list();

         Read_Allocation_list();

         Set_Need_Available();

         PrintInfo();

         while(1)

         {

                   Read_Request();

                   RunBanker();

                   cout<<"\n\n需要继续吗?(y-继续;n-终止)";

                   cin>>c;

                   if(c=='n')

                            break;

                   cout<<endl<<endl;

                   PrintInfo();

         }

}

五、       实验结果运行图

六、       实验总结

系统运行过程中,如果有多个进程同时运行就会容易造成死锁,银行家的运用会使系统资源得到合理运用,避免了死锁,使系统时时处于按全状态。

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

实验报告附录3程序源代码:#include<stdio.h>#include<stdlib.h>#include<conio.h>#definem50intno1;//进程数intno2;//资源数intr;i…

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

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

银行家算法+实验报告

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

银行家算法实验报告

计算机学院操作系统课程设计报告设计题目银行家算法的实现姓名学号班级06网络工程班完成日期20xx年6月13日银行家算法分析设计与实现一设计理论描述本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序观...

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

洛阳理工学院实验报告17273747576777

银行家算法实验报告

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

银行家算法实验报告

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

编程模拟银行家算法实验报告

武汉理工大学华夏学院课程设计报告书课程名称操作系统原理题目编程序模拟银行家算法系名信息工程系专业班级计应20xx姓名王汝平学号10225509118指导教师苏永红20xx年7月6日课程设计任务书1学生姓名王汝平...

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

南京信息工程大学实验实习报告实验实习名称银行家算法实验实习日期20xx1213得分指导教师姜青山计算机系专业软件工程年级20xx班次2班姓名李梅学号20xx2344055实验目的1根据设计题目的要求充分地分析和...

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

操作系统银行家算法CopyRightNigHtMaRe20xx年12月30日操作系统银行家算法课程设计报告姓名赵明学号070609313班级07计科9班专业计算机科学与技术操作系统银行家算法CopyRightN...

操作系统课程设计实验报告-用C++实现银行家算法

操作系统实验报告2学院计算机科学与技术学院班级计091学号姓名时间20xx1230目录1实验名称32实验目的33实验内容34实验要求35实验原理36实验环境47实验设计471数据结构设计472算法设计673功能...

银行家算法实验报告

操作系统课程设计报告题目银行家算法院系计算机学院专业计算机科学与技术班级学生学号指导教师20xx年01月摘要银行家算法是一个用来预防系统进入死锁状态的算法用它可以判断系统的安全性如果系统当前处于安全状态则可以为...

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