银行家算法设计报告

合集下载

银行家算法实验报告

银行家算法实验报告

银行家算法实验报告银行家算法实验报告引言:在计算机科学领域中,银行家算法是一种用于避免死锁的资源分配算法。

它是由荷兰计算机科学家艾兹赫尔·迪科斯彻在1965年提出的。

银行家算法通过合理的资源分配和安全性检查,确保系统中的进程能够安全地执行,避免了资源竞争和死锁的发生。

本篇文章将详细介绍银行家算法的原理、实验设计和结果分析。

一、银行家算法的原理银行家算法基于资源的最大需求和可用性进行资源分配。

它将系统中的资源分为若干类别,并为每个类别分配一个初始数量。

当进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。

算法的核心思想是避免分配资源后导致系统无法满足其他进程的资源需求,从而避免死锁的发生。

二、实验设计为了验证银行家算法的有效性,我们设计了一个模拟实验。

实验中,我们创建了一个包含多个进程和资源的系统,并模拟了进程对资源的请求和释放。

每个进程都有自己的资源需求和最大需求量,系统中的资源总量也是有限的。

首先,我们初始化系统的资源数量和每个进程的最大需求量。

然后,模拟进程的请求和释放过程。

当一个进程请求资源时,银行家算法会检查该请求是否能够满足,如果满足则分配资源,否则将进程置于等待状态。

当一个进程释放资源时,系统将回收该资源并重新分配给其他进程。

实验的关键是设计合理的资源分配策略和进程请求顺序,以模拟不同的场景。

我们通过调整进程的最大需求量和资源数量,观察系统的运行情况和死锁的发生情况。

三、实验结果分析通过多次实验,我们得出了以下结论:1. 资源数量的合理分配对避免死锁非常重要。

如果资源数量过少,无法满足进程的最大需求量,系统容易发生死锁。

如果资源数量过多,系统的资源利用率低,效率低下。

因此,需要根据系统的实际需求合理分配资源数量。

2. 进程的最大需求量与资源数量的关系也是影响死锁的重要因素。

当进程的最大需求量超过系统资源数量的一半时,系统容易发生死锁。

银行家算法实验报告

银行家算法实验报告

银行家算法实验报告银行家算法是为了实现避免出现死锁的状态而采取的一种算法,本实验则是用C语言实现。

一、银行家算法数据结构1、可利用资源数量Avail。

这是一个含M个元素的数组,其中每一个元素代表一类可用的资源数目,定义为int型,Avail[m]。

2、最大需求矩阵Max。

这是一个nxm的二维矩阵,它定义了系统中n个进程的每一个进程对m类资源的最大需求,定义为int型,Max[n][m]。

3、分配矩阵Alloc。

这是一个nxm的二维矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。

定义为int型,Alloc[n][m]。

4、需求矩阵Need。

这也是一个nxm的二维矩阵,用以表示每一个进程尚需的各类资源数。

定义为int型,Need[n][m]。

5、请求资源数目Request。

这是一个含M个元素的数组,它表示进程请求的资源数目,定义为int型,Request[m]。

6、系统当前可用的资源矩阵Work,这是一个含M个元素的数组,表示系统还可以分配的资源数目,用于对安全算法的检测。

定义为int型,Work[m]。

7、记录安全序号的数组sequence,用于记录系统的安全信号,便于在后面输出。

定义为int型,sequence[n].二、银行家算法过程步骤如下:1、判断请求的资源是否超过他所宣布需要的最大值,即如果request[j]>need[i][j],则判断出错,否则继续执行。

2、判断请求的资源是否超过系统可分配的数目,即如果request[j]>Avail[j],则判断出错,否则继续执行。

3、系统试探着把资源分配给进程Pi。

并修改其中的数据Avail、Alloc、Need。

4、系统进行安全性算法的检查。

三、安全性算法其中有两个信号量,Work和Finish。

分别用于表示系统可提供给进程的继续运行所需的各类资源的数目,含m个int型的元素。

而Finish用于标识系统是否有足够的资源分配给进程,使之运行完成,默认为1(不能),从而只有在finish都为0时才能表示安全算法成功。

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

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

银行家算法实验报告一、实验题目为了了解系统的资源分配情况,假定系统的任何一种资源在任一种资源在任意时刻只能被一个进程使用。

任何进程已经占用的资源只能由进程自己释放,而不能任由其他进程抢占。

当进程申请的资源不能满足时,必须等待。

因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。

而银行家算法是避免死锁的一种重要方法。

通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法二、实验要求要求编写系统进行资源调度的程序,模拟进程的资源分配算法,了解死锁的产生和避免的办法。

一个是随机动态地进行资源分配的模拟程序,即只要系统当前剩余资源满足进程的当前要求,就立即将资源分配给进程,以观察死锁产生情况;一个是采用银行家算法,有效地避免死锁的产生。

要求用银行家算法和随机算法实现资源分配。

1.设计3-4个并发进程,共享系统的10个同类不可抢占的资源。

各进程动态进行资源的申请和释放。

2.用银行家算法和随机算法分别设计一个资源分配程序,运行这两个程序,观察系统运行情况,并对系统运行的每一步情况进行显示。

二、总的设计思想及语言环境、工具等1.算法设计思路银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。

这时系统将该进程从进程集合中将其清除。

此时系统中的资源就更多了。

反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他,请进程等待。

2.语言环境、工具计算机基本配置要求:操作系统:WIN 98/2000/XP/2003 等Windows平台内存:256MB及以上主存64KB(Memory)(以KB为单位分配)开发语言:Visual C++ 6.0四、数据结构与模块说明(功能与框图)五、源程序(指导老师验收通过)#include<string.h>#include<iostream.h>#define FALSE 0#define TRUE 1#define W 10 //最大进程数W=10#define R 20 //最大资源总数R=20int M ;int N ;int ALL_RESOURCE[W];int AVAILABLE[R]; //可利用资源向量int MAX[W][R]; //最大需求矩阵int ALLOCATION[W][R]; //分配矩阵int NEED[W][R]; //需求矩阵int Request[R]; //进程请求向量void inputdata(); //数据输入void showdata(); //数据显示void changdata(int k);//进程请求资源数据改变void restoredata(int k); //数据恢复int chksec(int s); //系统安全性的检测int chkmax(int s); //检测最大需求void bank(); //检测分配的资源是否合理void main(){ int i,j;inputdata();for(i=0;i<M;i++){ j=chksec(i);if (j==0) break;}if (i>=M)cout<<"错误提示:经安全性检查发现,系统的初始状态不安全\n"<<endl;else{ cout<<"提示:经安全性检查发现,系统的初始状态安全!"<<endl;bank();}}void inputdata(){ int i=0,j=0,p;cout<<"请输入总进程数:"<<endl;do{cin>>M;if (M>W) cout<<endl<<"总进程数超过了程序允许的最大进程数,请重新输入:"<<endl;}while (M>W);cout<<endl;cout<<"请输入资源的种类数:"<<endl;do {cin>>N;if (N>R)cout<<endl<<"资源的种类数超过了程序允许的最大资源种类数,请重新输入:"<<endl; }while (N>R);cout<<endl;cout<<"请依次输入各类资源的总数量,即设置向量all_resource:"<<endl;for(i=0;i<N;i++) cin>>ALL_RESOURCE[i];cout<<endl;cout<<"请依次输入各进程所需要的最大资源数量,即设置矩阵max:"<<endl;for (i=0;i<M;i++){for (j=0;j<N;j++){do { cin>>MAX[i][j];if (MAX[i][j]>ALL_RESOURCE[j])cout<<endl<<"该最大资源数量超过了声明的该资源总数,请重新输入:"<<endl; }while (MAX[i][j]>ALL_RESOURCE[j]);}}cout<<endl;cout<<"请依次输入各进程已经占据的各类资源数量,即设置矩阵allocation:"<<endl;for (i=0;i<M;i++){for (j=0;j<N;j++){do{ cin>>ALLOCATION[i][j];if (ALLOCATION[i][j]>MAX[i][j])cout<<endl<<"已占有的资源数量超过了声明的最大资源数量,请重新输入:"<<endl;}while (ALLOCATION[i][j]>MAX[i][j]);}}cout<<endl;for (i=0;i<M;i++)for(j=0;j<N;j++)NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for (j=0;j<N;j++){ p=ALL_RESOURCE[j];for (i=0;i<M;i++){ p=p-ALLOCATION[i][j];AVAILABLE[j]=p;if(AVAILABLE[j]<0)AVAILABLE[j]=0;}}}void showdata(){ int i,j;cout<<"各种资源的总数量,即向量all_resource为:"<<endl;cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];cout<<endl<<endl;cout<<"当前系统中各类资源的可用数量,即向量available为:"<<endl; cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];cout<<endl<<endl;cout<<"各进程还需要的资源数量,即矩阵need为:"<<endl<<endl;for (i=0;i<M;i++){ cout<<"进程P"<<i<<": ";for (j=0;j<N;j++)cout<<NEED[i][j]<<" ";cout<<endl;}cout<<endl;cout<<"各进程已经得到的资源量,即矩阵allocation为: "<<endl<<endl;for (i=0;i<M;i++){ cout<<"进程P"<<i<<": ";for (j=0;j<N;j++)cout<<ALLOCATION[i][j]<<" ";cout<<endl;} cout<<endl;}void changdata(int k){ int j;for (j=0;j<N;j++){AVAILABLE[j]=AVAILABLE[j]-Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];NEED[k][j]=NEED[k][j]-Request[j];}}void restoredata(int k){int j;for (j=0;j<N;j++){ AVAILABLE[j]=AVAILABLE[j]+Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];NEED[k][j]=NEED[k][j]+Request[j];}}int chksec(int s){int WORK,FINISH[W];int i,j,k=0;for(i=0;i<M;i++)FINISH[i]=FALSE;for(j=0;j<N;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<M);for(i=0;i<M;i++)if(FINISH[i]==FALSE){ return 1;}} return 0;}int chkmax(int s){ int j,flag=0;for(j=0;j<N;j++){if (MAX[s][j]==ALLOCATION[s][j]){ flag=1;AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];MAX[s][j]=0;}} return flag;}c{int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){i=-1;while(i<0||i>=M){ cout<<"请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重新输入!):"; cout<<"p";cin>>i;if(i<0||i>=M)cout<<"输入的进程号不存在,重新输入!"<<endl;}cout<<"请输入进程P"<<i<<"申请的资源数:"<<endl;for (j=0;j<N;j++){ cout<<" 资源"<<j<<": ";cin>>Request[j];if(Request[j]>NEED[i][j]){ cout<<"进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}else{ if(Request[j]>AVAILABLE[j]){ cout<<"进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}}}if(flag=='Y'||flag=='y'){ changdata(i);if(chksec(i)){ cout<<endl;cout<<"该分配会导致系统不安全本次资源申请不成功,不予分配"<<endl;cout<<endl;restoredata(i);}else{ cout<<endl;cout<<"经安全性检查,系统安全,本次分配成功,且资源分配状况如下所示:"<<endl;cout<<endl;showdata();if(chkmax(i)){cout<<"在资源分配成功之后,由于该进程所需的某些资源的最大需求量已经满足,"<<endl;cout<<"因此在进程结束后系统将回收这些资源!"<<endl;cout<<"在资源收回之后,各进程的资源需求和分配情况如下所示:"<<endl;showdata();}}}cout<<endl;cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";cin>>flag; }}六、运行结果分析1.输入进程数、资源种类数、各类资源总数量、各进程所需要的最大资源数量、各进程所已经占据的各类资源数量2.经安全性检验,系统状态安全,进程P0申请资源3.经安全性检验,系统状态安全,进程P0获得所申请资源4.进程P3申请资源5.经安全性检验,系统状态安全,进程P3获得所申请资源6.进程P1申请资源7.经安全性检验,系统状态安全,进程P1获得所申请资源8.进程P2申请资源9.经安全性检验,系统状态安全,进程P2获得所申请资源5.进程P1申请资源6.经安全性检验,系统状态安全,进程P1获得所申请资源七、总结这次实验中我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

银行家算法课程设计报告

银行家算法课程设计报告

《计算机操作系统》课程设计报告——设计题目:银行家算法学院:计算机科学与工程专业:计算机科学与技术班级:学号:姓名:指导老师:目录1绪论--------------------------------------------2 1.1题目描述------------------------------------21.2设计目的------------------------------------21.3设计要求------------------------------------21.4目的----------------------------------------21.5有关概念的解释------------------------------3 2 概要设计---------------------------------------32.1算法思路------------------------------------32.2银行家算法步骤------------------------------3 2.3安全性算法步骤------------------------------4 2.4源程序结构分析------------------------------4 3 程序流程图-----------------------------------63.1系统主要过程流程图---------------------------6 3.2银行家算法流程图-----------------------------7 3.3安全性算法流程图-----------------------------84 测试-------------------------------------------95、设计心得-------------------------------------136、参考文献-------------------------------------137、实验代码-------------------------------------131绪论1.1题目描述:银行家算法是一种最具有代表性的避免死锁的算法。

操作系统_银行家算法报告

操作系统_银行家算法报告

实验四:银行家算法的实现一.实验目的(1)加深了解有关资源申请、避免死锁等概念。

(2)体会和了解死锁和避免死锁的具体实施方法。

二.实验属性该实验为设计性实验。

三.实验仪器设备及器材普通PC386以上微机四.实验要求本实验要求2学时完成。

本实验要求完成如下任务:(1)设计进程对各类资源最大申请表示及初值的确定。

(2)设定系统提供资源的初始状况。

(3)设定每次某个进程对各类资源的申请表示。

(4)编制程序,依据银行家算法,决定其资源申请是否得到满足。

(5)显示资源申请和分配时的变化情况。

五、实验设计及其思路数据结构:Available[m] 用来表示可利用资源的数目初始值是该类全部可用资源的数目。

MAX[n][m] 用来定义n个进程中的每一个进程对m类资源的最大需求Allocation[i][j] 用来表示i个进程中的每一个进程对j类资源已经拥有的数值Need[i][j] 用来表示i个进程中的每一个进程对j类资源还需要的数值在此程序中通过输入输出流从txt文档中读取数据进入以上数据数组中通过控控制台向request[i][j]数组输入值 此数组用来表示进程i 向j 资源请求申请资源个数 银行家算法流程图开始进程发出资源请求(request )所需要资源小于目前最大值Request<=need所需要资源小于可利用值Request<=avilable把资源分配给此进程并改变相关数值安全性算法 返回值是Y否出错(该系统无法执行此类进程)该进程暂时无法获得此资源 需等待还原相关数据是否分配成功结束是是否安全性算法流程图六 输出结果向其中输入三组数据1 p1发出请求向量request (1,0,2) 正确结果为分配资源2 p4发出请求向量request (3,3,0) 正确结果会产生安全问题要等待3 p0发出请求向量request (0,2,0)正确结果产生安全隐患需等待开始定义可以用的资源数目work 还有是否能在有限的资源条件下完成线程的标志finish ,并给他们所有的线程都可以顺利完成count 等于进程总数 尽可能多的找到满足(finish==false 和need<=work 这两个条件的线程)并对资源做相应的更改更改次数用count 计录 返回 N返回Y 结束是 否七、代码#include<iostream.h>#include<fstream.h>#include<stdio.h>int *avilable;//表示现在可利用的各类资源的数目int **max1;//用二维数组存储各给线程最多能够申请到个资源的数目int **allocation;//用二维数组存储目前各个线程已占用各类资源的数量int **need;//用二维数组存储目前每个进程还需要各类资源的数量方能完成工作int*xiancheng;//用来存储安全序列int m,n;//m用来记录资源的总数,n用来计算进程的总数void show();//用来向控制台输出allocation,needmax1,avilable的数据int correct();//安全性算法void createavilable();//为目前可利用资源赋初值void createmax();//为每一个进程对各类资源的最大需求赋初值void createallocation();//为目前各个进程已经申请到的资源赋初值void createneed();//为完成该进程所需要的各类资源数量赋初值int banker();//银行家算法int main(){ int choice=1;createavilable();createmax();createallocation();createneed();while(choice!=0){banker();cout<<"请输入你的选择(1继续,2重来 0 退出)"<<endl;cin>>choice;if(choice==1) show();if(choice==2){createavilable();createmax();createallocation();createneed(); }}return 0;}void createavilable(){ifstream inFile;int i;i=0;inFile.open("avilable.txt");//从txt文件中读取数据为其赋值inFile>>m;inFile.get();avilable=new int[m];cout<<"avilable:"<<endl;cout<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;while(inFile){inFile>>avilable[i];cout<<avilable[i]<<'\t';//显示到控制台上char c;inFile.get(c);//用来准确定读取时位真正的结束位置i++;}cout<<endl;}void createmax(){ifstream inFile1;inFile1.open("max.txt");inFile1>>n;inFile1.get();max1=new int*[n];//实现为二维数组动态分配内存for(int k=0;k<n;k++)max1[k]=new int[m];cout<<"max:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for(int i=0;i<n;i++){ cout<<"p"<<i<<'\t';for(int j=0;j<m;j++){ if(inFile1) inFile1>>max1[i][j];cout<<max1[i][j]<<'\t';}cout<<endl;}}void createallocation(){ifstream inFile1;inFile1.open("allocation.txt");allocation=new int*[n];for(int k=0;k<n;k++)allocation[k]=new int[m];cout<<"allocation:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for(int i=0;i<n;i++){ cout<<"p"<<i<<'\t';for(int j=0;j<m;j++){ if(inFile1) inFile1>>allocation[i][j]; cout<<allocation[i][j]<<'\t';}cout<<endl;}}void createneed(){need=new int*[n];for(int k=0;k<n;k++)need[k]=new int[m];cout<<"need:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for(int i=0;i<n;i++){ cout<<"p"<<i<<'\t';for(int j=0;j<m;j++){ need[i][j]=max1[i][j]-allocation[i][j];//根据max allocation和need的关系为need赋值cout<<need[i][j]<<'\t';}cout<<endl;}}int correct(){int *work;//工作向量bool *finish,flag;//finish用来表示进程是否可以在特定的资源下完成工作,flag用来标记循环是否结束int i, k,count1,count;work=new int[m];xiancheng=new int[m];for( i=0;i<m;i++)work[i]=avilable[i];finish=new bool[n];//初值都为falsefor(k=0;k<n;k++)finish[k]=false;count=0;do{for(i=0;i<n;i++){flag=false;count1=0;for(k=0;k<m;k++)if(need[i][k]<=work[k]) count1++;//判断i个进程对各类资源的需要是小于该类资源的工作数量并记录小于的个数else break;if(count1==m&&finish[i]==false)//判断对每类资源来说都是所需小于工作数量并且该类线程并没有完成任务{ for(k=0;k<m;k++){work[k]=work[k]+allocation[i][k];finish[i]=true;flag=true;}xiancheng[count]=i;count++;}}}while(flag==true);//可能多的找到满足(finish==false和need<=work 这两个条件的线程)并对资源做相应的更改更改次数用count计录cout<<count<<endl;if(count==n)return 1;elsereturn 0;}int banker(){int *request,i,j,count;request=new int[m];//资源请求i=count=0;cout<<"哪个进程请求资源"<<endl;cin>>j;cout<<"请依次输入a,b,c资源的请求数"<<endl;while(i<m) {cin>>request[i]; i++;}for(i=0;i<m;i++)if(request[i]<=need[j][i]) count++;else break;if(count!=m) //判断所需要资源小于目前最大值Request<=need {cout<<"此操系统不能完成这个进程"<<endl;return 0;}count=0;for(i=0;i<m;i++)if(request[i]<=avilable[i]) count++;else break;if(count!=m)//所需要资源小于可利用值Request<=avilable {cout<<"现在可利用资源不能满足需要,需要等候"<<endl; return 0;}for(i=0;i<m;i++){avilable[i]=avilable[i]-request[i];allocation[j][i]=allocation[j][i]+request[i];need[j][i]=need[j][i]-request[i];}if(correct()==1)//安全性算法{cout<<"可以将资源分配给"<<"p"<<j<<"进程,其中安全序列可以是:"<<endl;for(i=0;i<n;i++)cout<<"p"<<xiancheng[i]<<'\t';cout<<endl;}else{cout<<"因为会造成系统不安全,所以不分配资源给"<<"p"<<j<<"进程"<<endl;for(i=0;i<m;i++){avilable[i]=avilable[i]+request[i];allocation[j][i]=allocation[j][i]-request[i];need[j][i]=need[j][i]+request[i];}}return 0;}void show(){ int i,j;cout<<"avilable:"<<endl;cout<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for( i=0;i<m;i++)cout<<avilable[i]<<'\t';cout<<endl;cout<<"max:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for( i=0;i<n;i++){ cout<<"p"<<i<<'\t';for( j=0;j<m;j++){cout<<max1[i][j]<<'\t';}cout<<endl;}cout<<"allocation:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl; for(i=0;i<n;i++){ cout<<"p"<<i<<'\t'; for( j=0;j<m;j++){cout<<allocation[i][j]<<'\t';}cout<<endl;}cout<<"need:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl; for( i=0;i<n;i++){cout<<"p"<<i<<'\t';for( j=0;j<m;j++){cout<<need[i][j]<<'\t';}cout<<endl;}}。

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

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

操作系统课程设计报告题目:银行家算法操作系统课程设计报告题目:银行家算法摘要在多道操作系统中,可以利用多个进程并发执行来改善系统资源利用率,提高系统的吞吐量,但也可能发生人们不想看到的危险——死锁。

为了解决这个问题,人们引入了多种机制处理死锁问题。

本文主要介绍了操作系统如何运用银行家算法和安全性算法避免死锁的产生。

同时运用Java编程语言模拟计算机内部资源分配的过程。

让读者对银行家算法有更深刻的认识。

关键字:死锁银行家算法安全性算法资源分配IAbstractIn much road OS, improve the systematic handling capacity, but also may people happened not thinking of dangerous dead lock seeing that to come to improve system resource utilization ratio being able to make use of many course concurrency to carry out. Have led into various mechanism for problem , people resolving this handle lock fast problem. The main body of a book has been introduced mainly how to apply the banker algorithm and the security algorithm to avoid lock fast creation. Wield Java programming language analog computer inside resource assignment process at the same time. Let reader have deeper cognition to banker algorithm.Key words: Algorithmic algorithmic security of dead lock banker resource assignmentII目录中文摘要 (I)英文摘要 (II)1绪论 (1)2需求分析 (2)3概要设计 (3)4详细设计 (4)5测试与分析 (6)6总结 (11)7参考文献 (12)附录 (13)1绪论银行家算法诞生的背景:操作系统作为裸机上安装的第一层软件,起着控制和管理计算机内部软硬件资源,合理组织计算机工作流程,提高计算机工作效率,用户和计算机硬件接口的重要作用。

银行家算法实验报告

银行家算法实验报告

银行家算法实验报告实验目的:了解和掌握银行家算法,进一步熟悉进程和如何避免死锁。

实验内容:1、主要程序结构(a)resource allocation algorithm如果要求的资源量+占有的资源总的资源需求量可以carry out allocation(b) test for safety algorithm注:《--- 》中的内容为未具体写明但说明其功能的程序段bool safe(struct state new ){bool possible = true,found=false;process rest[n];//正在执行的进程号int p=n;// 正在执行的进程数量int currentavail[m];//可用资源的一个副本《---为rest和currentavail赋值---》while(possible==true&&p>0){int g=0;《---寻找可以执行完成的进程---》if(found==true){int c=0;《---假设可以执行完的进程以完成,及currentavail[*]=currentavail[*]+new.alloc[g][*];---》rest[g] = -1;--p;found =false;}else{possible=false;}}return possible;}2、实验步骤1)设计结构体#ifndef STATE_H_#define m 3#define n 5struct state{int resource[m];int available[m];int claim[n][m];int alloc[n][m];} ;#define STATE_H_#endif /* STATE_H_ */2)设计实现程序的结构的具体程序Safe算法的具体代码bool safe(struct state new ){bool possible = true,found=false;process rest[n]; //正在执行的进程号int f=0,p=n;// 正在执行的进程数量do{rest[f]=f;++f;}while(f<n);int currentavail[m]; //可用资源的一个副本int i=0;do{currentavail[i]=new.available[i];++i;}while(i<m);while(possible==true&&p>0){int g=0;/*------------------寻找可以执行完成的进程------------------------------------------*/ while(g<n){int h = 0;/*while(h<m){if((new.claim[g][h]-new.alloc[g][h])<=currentavail[h]&&rest[g]!=(-1)){if(h==m-1){found=true;}}++h;}if(found==true)break;++g;}/*-------------------------------------------------------------------------------------*/ if(found==true){int c=0;while(c<m){currentavail[c]=currentavail[c]+new.alloc[g][c];c++;}rest[g] = -1;--p;found =false;}else{possible=false;}}return possible;}实验代码:/*============================================================================ Name : pre.cAuthor :Version :Copyright : Your copyright noticeDescription : Hello World in C, Ansi-style============================================================================ */#include <stdio.h>#include <stdlib.h>#include"state.h"#define bool int#define process int#define false 0#define true 1int main(void) {bool alloc(int,int[],struct state );struct state sta1={{10,5,7},{3,3,2},{{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}},{{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}};int request[m];int k=0;while(k>=0){puts("输入要改变资源的进程号");scanf("%d",&k);puts("输入要改变的资源");int i =0;while(i<m){scanf("%d",&request[i]);i++;}if(alloc(k,request,sta1)==true){i=0;puts("输出个进程占用的资源");while(i<n){int j=0;printf("%d ",i);while(j<m){if(i==k){sta1.alloc[k][j]=request[j]+sta1.alloc[k][j];sta1.available[j]=sta1.available[j]-request[j];}printf("%d ",sta1.alloc[i][j]);j++;}printf("\n");++i;}}puts("银行家算法");}return 0;}bool alloc(int l,int request[m],struct state nest){bool safe(struct state news);bool t = false;int i=0;while(i<m){if(nest.alloc[l][i]+request[i]>nest.claim[l][i]){puts("!!resource request error!!");return false;}else if(request[i]>nest.available[i]){puts("suspend process");return false;}else{if(i==m-1){int f=0;while(f<m){nest.alloc[l][f]=nest.alloc[l][f]+request[f];nest.available[f]=nest.available[f]-request[f];f++;}if(safe(nest)==true){t=true;}else{puts(" no safe suspend process");t=false;}}}i++;}return t;}bool safe(struct state new ){bool possible = true,found=false;process rest[n];int f=0,p=n;do{rest[f]=f;++f;}while(f<n);int currentavail[m];int i=0;do{currentavail[i]=new.available[i];++i;}while(i<m);while(possible==true&&p>0){int g=0;while(g<n){int h = 0;while(h<m&&(new.claim[g][h]-new.alloc[g][h])<=currentavail[h]&&rest[g]!=(-1)){if(h==m-1){found=true;}++h;}if(found==true)break;++g;}if(found==true){int c=0;while(c<m){currentavail[c]=currentavail[c]+new.alloc[g][c];c++;}rest[g] = -1;--p;found =false;}else{possible=false;}}return possible;}。

银行家算法实验报告绪论

银行家算法实验报告绪论

一、实验背景在计算机系统中,资源分配和死锁问题是操作系统领域的重要研究课题。

在多进程环境下,进程之间会共享系统资源,如CPU、内存、磁盘等。

然而,当多个进程同时申请资源时,可能会出现死锁现象,导致系统瘫痪。

为了避免死锁,研究者提出了多种资源分配算法,其中最具代表性的就是银行家算法。

银行家算法最初由Edsger Dijkstra于1965年提出,旨在解决银行在贷款业务中可能出现的死锁问题。

该算法通过模拟银行家在贷款业务中的决策过程,对资源分配进行动态规划,以确保系统处于安全状态,从而避免死锁的发生。

二、实验目的本次实验旨在通过实现银行家算法,加深对资源分配、死锁和安全性概念的理解,并掌握以下内容:1. 了解资源分配的基本原理和死锁的概念。

2. 掌握银行家算法的原理和实现方法。

3. 能够运用银行家算法对系统资源进行动态分配,并确保系统处于安全状态。

4. 分析实验结果,验证银行家算法的有效性。

三、实验原理1. 资源分配资源分配是指操作系统将资源分配给进程的过程。

在多进程环境下,资源分配策略需要考虑以下因素:(1)资源的类型和数量。

(2)进程对资源的最大需求。

(3)进程当前已分配的资源。

(4)系统可利用的资源。

2. 死锁死锁是指多个进程在执行过程中,因争夺资源而相互等待,导致系统无法继续执行的现象。

产生死锁的必要条件包括:(1)互斥条件:资源不能被多个进程同时占用。

(2)请求和保持条件:进程在等待资源时,仍保持已占有的资源。

(3)不剥夺条件:进程不能被强制剥夺已占有的资源。

(4)循环等待条件:存在一个进程序列,其中每个进程都在等待前一个进程所持有的资源。

3. 安全状态安全状态是指系统可以按照某种顺序为每个进程分配资源,使得所有进程都可以顺利完成的状态。

判断系统是否处于安全状态的方法如下:(1)计算每个进程的最大需求。

(2)计算系统可利用的资源。

(3)从最大需求中减去已分配的资源,得到剩余需求。

(4)判断剩余需求是否小于等于系统可利用的资源。

银行家算法实验报告

银行家算法实验报告

银行家算法实验报告引言:在计算机科学领域,由于资源的有限性,进程资源分配问题一直备受关注。

而银行家算法被广泛应用于操作系统中,用于确保资源的安全分配。

本文旨在介绍银行家算法的原理和应用,并通过实验报告来验证该算法的有效性和可行性。

1. 银行家算法简介银行家算法是由美国学者Dijkstra提出的一种资源分配和避免死锁的算法。

其基本思想是通过银行家的原则来避免系统陷入死锁状态,保证资源分配的安全性和可行性。

银行家算法适用于具有多个进程和多个资源的并发系统中。

2. 银行家算法原理银行家算法基于两个重要的概念:安全性和可分配性。

安全性表示在系统当前状态下,是否存在一种资源分配序列可以使系统避免死锁状态。

可分配性表示系统是否能够满足进程对资源的请求。

银行家算法的实现需要以下几个关键步骤:(1) 初始化:对每个进程设置最大需求量、已分配资源量和需求资源量。

(2) 效验:判断系统当前状态下资源是否满足所有进程的需求,即判断系统是否处于安全状态。

(3) 分配:若系统处于安全状态,则根据某种资源分配策略,为进程分配资源。

(4) 请求:进程请求资源。

(5) 回收:进程释放资源。

3. 银行家算法的实验验证为了验证银行家算法的有效性和可行性,我们设置了一个简单的实验环境,模拟一个有限的资源系统,包含3个进程和3种不同类型的资源。

实验过程如下:(1) 初始化:对每个进程设置最大需求量、已分配资源量和需求资源量。

设置3个进程的最大需求量分别为{5, 4, 3},已分配资源量分别为{1, 2, 2},需求资源量分别为{3, 2, 0}。

(2) 效验:判断系统当前状态下资源是否满足所有进程的需求。

经过实验验证,我们发现系统当前状态下资源无法满足进程2的资源需求。

为了保证系统的安全性和避免死锁,根据银行家算法原理,我们将不满足资源需求的进程2暂停,并回滚到初始状态。

重新调整资源分配后,系统进入了安全状态。

(3) 分配:为进程1和进程3分配资源。

银行家算法课程设计实验报告

银行家算法课程设计实验报告

银行家算法课程设计实验报告摘要:本文主要介绍了一种新的实验方法——银行家算法课程设计实验,针对算法教学的实验设计,特别是在银行家算法这一领域,运用Visual C++ 语言,给出了一种实验实现及其相应的实验报告。

实验的通过对 Visual C++ 的开发环境及语法的掌握,实验证明了银行家算法的可行性和实际应用的安全性。

关键词:银行家算法;Visual C++;实验设计;实验报告1. 绪论随着网络技术的不断发展和深化,如今网络系统的仿真实验,尤其是银行家算法的仿真实验的需求量日益增大,该实验将把网络系统设计中的概念、原理以及运用的方法用于系统的实际应用,更直观地表达出网络实验中的概念。

本实验希望通过对 Visual C++语言的开发环境及语法的掌握,实现银行家算法在计算机系统中的运用,实现这种算法的可行性和实际应用的安全性,从而使网络系统仿真实验更加简单有效的实现。

2. 实验目的(1)熟悉 Visual C++ 语言的开发环境及语法;(2)了解银行家算法基本原理及其实现;(3)验证银行家算法的可行性及实际应用的安全性;(4)为网络系统仿真实验提供一种新的实验方法。

3. 实验内容(1)Visual C++编程环境的熟悉;(2)实现银行家算法的仿真实验;(3)验证银行家算法的可行性和实际应用的安全性;(4)实验报告的编写。

4. 实验环境实验环境主要包括实验平台、操作系统、语言编程工具和文本编辑器。

实验平台:实验所使用的计算机硬件平台为:Intel 酷睿i5-8400 处理器、 DDR4 8G 内存及 GTX 1050TI 4G 显卡;操作系统:实验所使用的操作系统为 Windows 10 家庭版;语言编程工具:实验所使用的语言编程工具为 Visual Studio 2017;文本编辑器:实验所使用的文本编辑器为 Notepad。

5. 实验过程实验过程主要包括 Visual C++ 编程环境的熟悉、银行家算法的仿真实现及实验报告的编写。

银行家算法实验设计报告

银行家算法实验设计报告

实验三银行家算法班级:xxxxxxxxxxxxxx姓名:xxxx 学号:xxxxxxxxxxxxxxxxxxxxxxxxx上级日期:2018年10月成绩:___________________________一、实验目的:银行家算法是避免死锁的一种重要方法,通过一个简单的银行家算法程序加深了解有关资源申请,避免死锁等概念,并体会和了解死锁以及避免死锁的具体实施方法。

二、实验内容1、程序流程图系统主要运行过程流程图银行家算法流程图安全性算法流程图2、程序源码1.//#define M 52.//#define N 33.#include <stdio.h> //本实验中使用到的库函数4.#include <stdlib.h>5.#include <string.h>6.7.int max[5][1]; //开始定义银行家算法中需要用到的数据8.int allocation[5][1];9.int need[5][1];10.int available[1];11.int request[5][1];12.char *finish[5];13.int safe[5];14.int n,i,m;15.int k=0;16.int j=0;17.int work[1];18.int works[5][1];19.20.void line() //美化程序,使程序运行时更加明朗美观21.{22. printf("------------------------------------------------\n");23.}24.25.void start() //表示银行家算法开始26.{27. line();28. printf(" 银行家算法开始\n");29. printf(" -- 死锁避免方法 \n");30. line();31.}32.33.void end() //表示银行家算法结束34.{35. line();36. printf(" 银行家算法结束,谢谢使用\n");37. line();38.}39.40.void input() //输入银行家算法起始各项数据41.{42.for (n=0;n<5;n++)43. {44. printf("请输入进程P%d的相关信息:\n",n);45. printf("Max:");46.for (m=0;m<1;m++)47. scanf("%d",&max[n][m]);48. printf("Allocation:");49.for (m=0;m<1;m++)50. scanf("%d",&allocation[n][m]);51.for (m=0;m<1;m++)52. need[n][m]=max[n][m]-allocation[n][m];53. }54. printf("请输入系统可利用资源数Available:");55.for (m=0;m<1;m++)56. scanf("%d",&available[m]);57.}58.59.void output() //输出系统现有资源情况60.{61. line();62. printf("资源情况 Max Allocation Need Available\n");63. printf("进程 A A A A \n");64. line();65.for(n=0;n<5;n++)66. {67. printf("P%d%3d%3d%3d",n,max[n][0],allocation[n][0],need[n][0]);68.if (n==0)69. printf("%3d%3d\n",available[0]);70.else71. printf("\n");72. }73. line();74.}75.76.void change() //当Request[i,j]<=Available[j]时,系统把资源分配给进程P[i],Available[j]和Need[i,j]发生改变77.{78.for (m=0;m<1;m++)79. {80. available[m]-=request[i][m];81. allocation[i][m]+=request[i][m];82. need[i][m]-=request[i][m];83. }84.}85.86.void outputsafe() //输出安全序列的资源分配表87.{88. printf("该安全序列的资源分配图如下:\n");89. line();90. printf("资源情况 Work Need Allocation Work+Allocation Finish\n");91. printf("进程 A A A A \n");92. line();93.for(n=0;n<5;n++)94. printf("P%d%9d%3d%3d%5d%12s\n",safe[n],works[safe[n]][0],need[safe[n]][0],allocation[safe[n]][0],works[safe[n]][0]+allocation[safe[n]][0],finish [n]);95. line();96.}97.98.int check() //安全性算法99.{100. printf("开始执行安全性算法……\n");101.for (m=0;m<1;m++) //数组work和finish初始化102. work[m]=available[m];103.for (n=0;n<5;n++)104. {105. finish[n]="false";106. safe[n]=0;107. }108. k=0;109.for (m=0;m<5;m++)110.for (n=0;n<5;n++)111.if(strcmp(finish[n],"false")==0 && need[n][0]<=work[0] ) //查找可以分配资源但尚未分配到资源的进程112. {113. safe[k]=n; //以数组safe[k]记下各个进程得到分配的资源的顺序114. works[safe[k]][0]=work[0];115.116.117. work[0]+=allocation[n][0]; //进程执行后释放出分配给它的资源118.119.120. finish[n]="ture"; //finish[n]变为1以示该进程完成本次分121. k++;122. }123.for (m=0;m<5;m++) //判断是否所有进程分配资源完成124. {125.if (strcmp(finish[m],"false")==0)126. {127. printf("找不到安全序列,系统处于不安全状态。

银行家算法设计报告

银行家算法设计报告

基于银行家算法的研究摘要1.研究的目的和意义加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程占用:第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源:第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。

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

通过这个算法可用解决生活中的实际问题,如银行贷款等.2.研究的内容及方法银行家算法是最有代表性的避免死锁的算法,由于该算法能用于银行系统现金贷款的发放而得名。

其实现思想是:允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。

关键词:银行家算法安全死锁目录摘要 (i)1绪论 (1)1.1前言 (1)1.2本文主要研究内容 (1)2需求分析 (2)2.1死锁的概念 (2)2.2关于死锁的一些概念 (2)2.3资源分类 (2)2.4产生死锁的必要条件 (2)2.5死锁预防 (3)2.6银行家算法 (3)3概要设计 (4)3.1设计思路 (4)3.2 数据结构 (4)3.3主要函数说明 (5)4详细设计 (6)4.1算法描述 (6)4.1.1银行家算法 (6)4.1.2 安全性检查算法 (7)4.2函数的实现过程 (7)4.3程序流程图 (9)5测试结果 (10)6结果分析 (12)7总结 (13)源程序清单 (14)1绪论1.1前言银行家算法是避免死锁的一种重要方法。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

银行家算法实验报告c语言

银行家算法实验报告c语言

银行家算法实验报告c语言银行家算法实验报告引言:计算机科学中的银行家算法是一种资源分配和避免死锁的算法。

它是由艾德加·戴克斯特拉(Edsger Dijkstra)在1965年提出的。

银行家算法通过判断一个系统是否处于安全状态来决定是否分配资源给进程。

本实验旨在使用C语言实现银行家算法,并通过一系列的实例来验证其有效性。

一、实验背景银行家算法是为了解决资源分配中的死锁问题而提出的。

在多进程系统中,每个进程都需要一定数量的资源来完成任务。

然而,如果资源分配不当,可能会导致死锁的发生,即所有进程都陷入无法继续执行的状态。

银行家算法通过合理地分配资源,避免了死锁的发生。

二、实验目的本实验的主要目的是通过C语言实现银行家算法,并通过实例验证其正确性和有效性。

具体而言,我们将模拟一个系统中的多个进程,并为每个进程分配资源。

然后,我们将使用银行家算法来判断系统是否处于安全状态,从而决定是否继续分配资源。

三、实验过程1. 创建进程和资源我们首先创建了5个进程和3种资源。

每个进程需要的资源数量是随机生成的,以模拟真实情况下的资源需求。

2. 分配资源根据银行家算法的原则,我们按照以下步骤来分配资源:- 首先,检查每个进程的资源需求是否小于等于系统当前可用的资源数量。

- 如果满足条件,将资源分配给该进程,并更新系统剩余资源数量。

- 如果不满足条件,暂时不分配资源给该进程,继续检查下一个进程。

3. 判断系统状态在每次资源分配后,我们需要判断系统是否处于安全状态。

为此,我们使用银行家算法的核心原则:只有当系统能够为每个进程提供所需的资源时,系统才是安全的。

我们通过遍历所有进程来检查其资源需求是否小于等于系统剩余资源数量,如果满足条件,说明系统是安全的。

4. 实例验证我们进行了多个实例验证,以确保银行家算法的正确性。

在每个实例中,我们模拟了不同的进程和资源需求,并观察系统的状态。

通过比较实验结果和预期结果,我们验证了银行家算法的有效性。

银行家算法实验报告

银行家算法实验报告

实验二银行家算法一、实验内容简要描述1.实验目标:加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

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

2.实验要求:银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。

用银行家算法实现资源分配。

设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。

进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。

二、报告主要内容1.设计思路A、设计进程对各在资源最大申请表示及初值确定。

B、设定系统提供资源初始状态。

C、设定每次某个进程对各类资源的申请表示。

D、编制程序,依据银行家算法,决定其申请是否得到满足。

2.主要数据结构假设有M个进程N类资源,则有如下数据结构:MAX[M*N] M个进程对N类资源的最大需求量AVAILABLE[N] 系统可用资源数ALLOCATION[M*N] M个进程已经得到N类资源的资源量NEED[M*N] M个进程还需要N类资源的资源量3. 主要代码#include <iostream.h>#include "stdio.h"//#include "windows.h"const unsigned short c = 3;//资源类数const unsigned short t = 5;//进程数void Print(); //用于打印输出表格的函数void Input();//用于输入的函数void tryfenpei(int i);//试分配函数void refenpei(int i);//恢复数据函数void checksafe(int s);//安全检测函数//定义初始化数组int Available[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c];int in;//用户选择的进程号/*----------------------------------------------------------------*/int main(int argc, char *argv[]){int i;char ch='Y';cout<<"初始化数据"<<endl;Input();//输入相关数据函数Print();//打印输出相关数据表函数cout<<"初始化完成!..."<<endl<<endl<<endl;do{if(ch=='Y'||ch=='y'){cout<<"欢迎进入实验!请稍后..."<<endl;// Sleep(1000);cout<<"已顺利进入实验..."<<endl;cout<<"请输入发起请求的进程号(0-4):";while(cin>>in){if(!(0<=in&&in<=4)){cout<<"不存在该进程,请重新输入"<<endl;}else break;};cout<<"您输入的是"<<"p["<<in<<"]"<<" 进程"<<endl;cout<<"该进程需求量为:";for(i=0;i<c;i++)cout<<Need[in][i]<<" ";cout<<endl;cout<<"请输入请求资源的数目:";//输入格式为X for(i=0;i<c;i++){while(cin>>Request[i]){if(Request[i]<0) cout<<"错误!输入的数字无效."<<endl;elseif(Request[i]>Need[in][i]) cout<<"错误!超出进程需求量"<<endl<<endl;if(Request[i]>Available[i]) cout<<"错误!系统还没有足够的可用资源量满足进程需要"<<endl<<endl;else break;}}cout<<"输入成功,您输入的是:"<<Request[0]<<" "<<Request[1]<<" "<<Request[2];cout<<endl;cout<<"开始执行银行家算法,下面进行试分配..."<<endl;tryfenpei(in);//分配函数//Sleep(1000);cout<<"试分配完成!"<<endl;cout<<"进入安全性检测..."<<endl;//Sleep(1000);checksafe(in);//安全性检测函数cout<<"需要继续实验吗?(y-继续n终止)";}elseif(ch=='N'||ch=='n'){cout<<"感谢您的使用,祝您愉快!"<<endl<<"正在退出..."<<endl;break;}elsecout<<"输入无效!请重新输入."<<endl;}while(cin>>ch);return 0;}/*---------------------main函数结束----------------------------------*//*-------------------------输出函数----------------------------------*/void Print(){int i,j;cout<<" 进程个数:"<<t<<" 资源个数:"<<c<<endl;cout<<"正在更新数据..."<<endl;//Sleep(1500);cout<<"|-----|----------|------------|----------|-----------|"<<endl;cout<<"|----|最大需求矩阵|已分配矩阵-|-需求矩阵-可用资源向量|"<<endl;cout<<"|\ 资源| Max | Allocation | Need | Available |"<<endl;cout<<"| \ | A B C | A B C | A B C | A B C |"<<endl;cout<<"|进程\ | | | | |"<<endl; cout<<"|-----|----------|------------|----------|-----------|"<<endl;for(i=0;i<5;i++){cout<<"| p"<<i<<" | ";for(j=0;j<3;j++){cout<<Max[i][j]<<" ";}cout<<"|";for(j=0;j<3;j++){cout<<" "<<Allocation[i][j];}cout<<" |";for(j=0;j<3;j++){cout<<" "<<Need[i][j];}cout<<" |";if(i==0){for(j=0;j<3;j++){cout<<" "<<Available[j];}cout<<" |";}if(i>0){cout<<" |";}cout<<endl;}cout<<"|-----|----------|------------|----------|-----------|"<<endl;}/*-------------------------输出函数结束--------------------------------*//*--------------------------输入函数----------------------------------*/void Input(){for(int j=0;j<c;j++){cout<<"请输入Available["<<j<<"]:";while(cin>>Available[j]){if(Available[j]<0)cout<<"输入数字无效,请重新输入"<<endl;else break;};}for(int k=1;k<4;k++)//其他三个属性和一次打印输出表{for(int l=0;l<t;l++)//五个进程循环输入{for(int m=0;m<c;m++)//三个类资源ABC循环输入{if(k==1&&m<t){cout<<"请输入Max["<<l<<"]["<<m<<"]:";while(cin>>Max[l][m]){if(Max[l][m]<0)cout<<"输入数字无效,请重新输入"<<endl;else break;};}if(k==2&&m<t){cout<<"请输入Allocation["<<l<<"]["<<m<<"]:";while(cin>>Allocation[l][m])if(Allocation[l][m]<0)cout<<"输入数字无效,请重新输入"<<endl;else break;//cout<<"Allocation["<<l<<"]["<<m<<"]="<<Allocation[l][m]<<endl;}if(k==3&&m<t)Need[l][m]=Max[l][m]-Allocation[l][m];}}}}//*-------------------------输入函数结束----------------------------------*//*-------------------------试分配函数----------------------------------*/void tryfenpei(int i){for(int f=0;f<c;f++){Available[f] = Available[f] - Request[f];Allocation[i][f] = Allocation[i][f] + Request[f];Need[i][f] = Need[i][f]-Request[f];}}/*-------------------------试分配函数结束----------------------------------*//*-------------------------恢复数据函数----------------------------------*/void refenpei(int i){for(int f=0;f<c;f++){Available[f] = Available[f] + Request[f];Allocation[i][f] = Allocation[i][f] - Request[f];Need[i][f] = Need[i][f]+Request[f];//cout<<Available[f]<<" "<<Allocation[i][f]<<" "<<Need[i][f]<<endl;}}/*-------------------------恢复数据函数结束----------------------------------*//*-------------------------安全检测函数----------------------------------*/void checksafe(int s){int Work,flag,temp[t],i,j,l=0,k=0;bool Finish[t];for(i=0;i<t;i++)Finish[i]=false;for(j=0;j<3;j++){Work=Available[j];//cout<<"Work="<<Work<<endl;for(i=0;i<t;i++){if(Finish[i]==true) l++;//用l是否达到5来判断这条进程A类资源或者B类资源是否通过安全检测,C类资源没有经过这里}if(l==5)//一共有三类资源A B C,一条进程下面的安全性检测只检测了A类。

银行家算法全报告

银行家算法全报告
{ work[0]=work[0]+allocation[p][0]; work[1]=work[1]+allocation[p][1]; work[2]=work[2]+allocation[p][2]; result[p]=s;count++; printf("P%d->",p);
} }
if(count==5) printf("\n 各进程顺利执行!\n"); else printf("\n 资源分配足,产生死锁!\n");
五、实验过程原始记录(数据、图表、计算等) #include<stdio.h> int main(int argc, char *argv[]) {
int claim[5][3] = {{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //进程 运行申请的总资源
int allocation[5][3] = {{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; int p,s = 0; //p 代表进程 s 代表资源的种类 int count=0; //每个进程成功分配自动加 1 int need[5][3] = {{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //进程 还需要的每种资源数 int result[5] = {-1,-1,-1,-1,-1}; //进程是否得到了满足 int work[3] = {3,3,2}; printf("总资源:\n\tA\tB\tC\n\t10\t5\t7\n");
七、实验心得 银行家算法是为了使系统保持安全状态。把操作系统看作是银行家,操作系

实验三银行家算法实验报告

实验三银行家算法实验报告

实验三银行家算法实验报告一、实验目的银行家算法是一种用于避免死锁的算法,本次实验旨在通过编程实现银行家算法,并通过模拟银行家算法的运行过程来加深对该算法的理解。

二、实验过程及结果1. 系统设计为了模拟银行家算法的运行过程,需要设计一个包含多个进程和资源的系统。

每个进程都有一定的最大需求资源数和已分配资源数。

系统中还有一定数量的可用资源,进程可以请求资源和释放资源。

2. 算法实现在程序中实现银行家算法需要以下几个关键的函数:(1)银行家算法的主函数:实现进程的请求资源和释放资源操作,并在此过程中判断是否产生死锁;(2)安全检查函数:用于判断系统状态是否安全,即是否存在一个安全序列,如果存在则表示系统处于安全状态,否则表示系统处于不安全状态;(3)资源请求函数:用于进程请求资源的操作,根据银行家算法的要求进行判断;(4)资源释放函数:用于进程释放资源的操作。

3. 算法运行通过对编写的程序进行多次运行测试,模拟不同进程对资源的请求和释放,观察系统是否能够始终处于安全状态。

在每次运行中,记录并输出系统的安全序列和进程的状态等信息。

4. 实验结果分析通过实验运行结果的分析,可以得出以下结论:(1)银行家算法能够有效地避免死锁的发生;(2)系统中资源的分配和释放过程需要合理,否则可能导致系统陷入死锁;(3)资源的分配策略对系统的安全状态有重要影响。

三、实验总结通过本次实验,深入了解了银行家算法的原理和实现过程,并通过编程实践加深了对该算法的理解。

银行家算法是一种重要的死锁避免算法,能够保证系统处于安全状态下运行,并且能够合理地分配系统资源,避免系统陷入死锁。

四、参考文献[1] 《操作系统概念》,Abraham Silberschatz,Peter B. Galvin,Greg Gagne,电子工业出版社,2014年五、附录(示例代码省略)以上是本次实验的实验报告,通过实验我们深入了解了银行家算法,了解了它在操作系统中的应用和重要性。

银行家算法实验报告

银行家算法实验报告

银行家算法一、课题内容和要求银行家算法是一种最有代表性的避免死锁的算法。

在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

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

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

总体要求如下:(1)模拟一个银行家算法;(2)了解算法中用的各种数据结构;(3)系统的初始状态信息从文本文件读取;(4)判断是否存在安全序列,输出任意一个安全序列即可;(5)判断系统是否可以满足进程的请求。

此次课程设计的主要内容时模拟实现动态资源分配。

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

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

三、概要设计1.银行家算法的设计思路先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。

若请求合法,则进行试分配。

最后对试分配后的状态调用安全性检查算法进行安全性检查。

若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。

2.银行家算法中用到的主要数据结构可利用资源向量 int Available[j] j为资源的种类。

最大需求矩阵 int Max[i][j] i为进程的数量。

分配矩阵 int Allocation[i][j]需求矩阵 int need[i][j]= Max[i][j]- Allocation[i][j]申请各类资源数量 int Request i[j] i进程申请j资源的数量工作向量 int Work[x] int Finish[y]3.银行家算法bank()进程i发出请求申请k个j资源,Request i[j]=k(1)检查申请量是否不大于需求量:Request i[j]<=need[i,j],若条件不符重新输入,不允许申请大于需求量。

银行家算法实验报告

银行家算法实验报告
目录
1 需求分析....................................................................................................................................... 2
1.1 输入的形式和输入值的范围.......................................................................... 2 1.2 输出的形式...................................................................................................... 3 1.3 程序所能达到的功能...................................................................................... 4 1.4 测试数据 ...................................................................................................... 4
7) 该进程所需的各资源数目。输入类型为 int 的数组,形式类似“各资源现 有数目” ,但应该注意,其范围应当不大于剩余资源的数量,即 Request[i]<=Available[i]。
1.2 输出的形式
1) 首先要求用户输入初始化数据,系统将依次输出以下提示: 请输入进程的数目: 请输入资源的种类数目: 请输入每个进程最多所需的各资源数目: 请输入每个进程已分配的各资源数目: 请输入各个资源现有的数目: 当输入第四项“每个进程已分配的各资源数目”时,输入的已分配资源数若 大于每个进程最多所需的各资源数,即 Allocation[i][j]>Max[i][j],系统将提示哪 个进程的第几个资源分配出错,提示如下: 您输入的第 n 个进程所拥有的第 m 个资源数错误! 2) 完成数据初始化后,将列出系统的进程及资源情况,形式如下: 现系统的进程及资源情况如下: Available: 资源 A:a Need: 进程 0:a0 进程 1:a1 „„ Allocation: 进程 0:a0 进程 1:a1 „„ 3) 接着演示进程申请资源,系统将依次输出以下提示: 请输入要申请资源的进程号: 请输入进程所请求的各资源的数目: b0 b1 c0 c1 b0 b1 c0 c1 资源 B:b 资源 C:c „„
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于银行家算法的研究摘要1.研究的目的和意义加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程占用:第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源:第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。

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

通过这个算法可用解决生活中的实际问题,如银行贷款等.2.研究的内容及方法银行家算法是最有代表性的避免死锁的算法,由于该算法能用于银行系统现金贷款的发放而得名。

其实现思想是:允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。

关键词:银行家算法安全死锁目录摘要 (i)1绪论 (1)1.1前言 (1)1.2本文主要研究内容 (1)2需求分析 (2)2.1死锁的概念 (2)2.2关于死锁的一些概念 (2)2.3资源分类 (2)2.4产生死锁的必要条件 (2)2.5死锁预防 (3)2.6银行家算法 (3)3概要设计 (4)3.1设计思路 (4)3.2 数据结构 (4)3.3主要函数说明 (5)4详细设计 (6)4.1算法描述 (6)4.1.1银行家算法 (6)4.1.2 安全性检查算法 (7)4.2函数的实现过程 (7)4.3程序流程图 (9)5测试结果 (10)6结果分析 (12)7总结 (13)源程序清单 (14)1绪论1.1前言银行家算法是避免死锁的一种重要方法。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

银行家算法确实能保证系统时时刻刻都处于安全状态,但它要不断检测每个进程对各类资源的占用和申请情况,需花费较多的时间。

现在的大部分系统都没有采用这个算法,也没有任何关于死锁的检查。

1.2 本文主要研究内容(1)设计银行家算法,能够检测系统某一时刻是否安全,输出安全序列。

(2)实现安全性检测算法。

即在某一进程在某时刻提出Request时,检测系统是否能够满足该进程的请求,并得到一个安全序列,若能够得到一个安全序列,则系统能够满足它的请求,同意分配资源。

若不能够满足,则回到请求前状态。

(3)对于此次课程设计通过需求分析、概要设计、详细设计、测试与分析、总结、源程序清单等模块进行全面分析,以加深对死锁概念的理解,以及银行家算法避免死锁的过程。

能够利用银行家算法,有效避免死锁的发生,或检测死锁的存在。

2需求分析2.1死锁的概念所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

2.2关于死锁的一些结论1)参与死锁的进程最少是两个(两个以上进程才会出现死锁)2)参与死锁的进程至少有两个已经占有资源3)参与死锁的所有进程都在等待资源4)参与死锁的进程是当前系统中所有进程的子集注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。

2.3资源分类1)可剥夺资源2)不可剥夺资源2.4产生死锁的必要条件1、互斥条件(Mutual exclusion)一个资源每次只能被一个进程使用。

2、请求与保持条件(占有等待)(Hold and wait)一个进程因请求资源而阻塞时,对已获得的资源保持不放。

3、不剥夺条件(不可抢占)(No pre-emption)进程已获得的资源,在未使用完之前,不能强行剥夺。

4、循环等待条件(Circular wait)若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

2.5死锁预防理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。

所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。

此外,也要防止进程在处于等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。

因此,对资源的分配要给予合理的规划。

2.6银行家算法我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

3概要设计3.1设计思路第一部分:银行家算法(扫描)1.如果Request<=Need,则转向2;否则,出错2.如果Request<=Available,则转向3,否则等待3.系统试探分配请求的资源给进程4.系统执行安全性算法第二部分:安全性算法1.设置两个向量(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别)3.进程P获得第i类资源,则顺利执行直至完成!并释放资源:Work=Work+Allocation; Finish[i]=true;转24. 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!3.2数据结构1.可利用资源向量矩阵AVAILABLE。

这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。

如果AVAILABLE [j]= K,则表示系统中现有R类资源K个操作系统课程设计2.最大需求矩阵MAX。

这是一个n*m的矩阵,用以表示每一个进程对m类资源的最大需求。

如果MAX [i,j]=K,则表示进程i需要R类资源的数目为K。

3.分配矩阵ALLOCATION。

这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。

如果ALLOCATION [i,j]=K,则表示进程i 当前已分得R类资源的数目为K。

4.需求矩阵NEED。

这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。

如果NEED [i,j]=K,则表示进程i还需要R类资源K个,才能完成其任务。

上述矩阵存在下述关系:NEED [i,j]= MAX[i,j]﹣ ALLOCATION[i,j]3.3主要函数说明a: void xx(int shu[][10],int i,int m)//输出各数组资源b: void input(int max[][10],int allocation[][10],intneed[][10],int available[],int n,int m) //输出资源分配情况c: int sec(int work[],int need[][10],int allocation[][10], int n,int m)//安全性算法,检查系统是否处于安全状态d: void main() //主函数4详细设计4详细设计4.1算法描述4.1.1银行家算法在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。

在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。

它是最具有代表性的避免死锁的算法。

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

(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。

(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否则,出错。

(3)系统试探分配资源,修改相关数据:AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

4.1.2 安全性检查算法(1)设置两个工作向量Work=AVAILABLE;FINISH(2)从进程集合中找到一个满足下述条件的进程,FINISH==false;NEED<=Work;如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的进程Finish= true,则表示安全;否则系统不安全4.2函数的实现过程1.主函数(main)的实现:输入已知条件,利用安全检测函数检测已知的进程分配情况是否为安全状况。

如果为安全,则输入需请求资源的进程号和所需资源数,否则结束主函数。

reqi为进程i的请求向量。

相关文档
最新文档