操作系统实验银行家算法模拟实现(强烈推荐)
《操作系统》课程实验报告银行家算法
《操作系统》课程实验报告实验名称:银行家算法姓名:学号:地点:指导老师:专业班级:一、实验目的:1)对死锁避免中的银行家算法做进一步的理解。
2)加深理解死锁的概念3)加深理解安全序列和安全状态的概念4)通过编程,掌握银行家算法分配资源的一步步实现过程二、实验内容:1)给出系统可用资源向量2)给出当前状态系统中各个进程的资源分配情况3)根据系统当前资源状态和各个进程的资源分配情况,判断系统是否处于安装状态,若系统处于安全状态,给出所有的安全序列和每一个安全序列所对应的资源分配图,若系统不处于安全序列,则发出死锁警告。
三、实验主要代码/**银行家算法(实现所有存在路径的查找)*///构造进程单位struct Process{string p_name; //进程的名称int Max[N]; //进程对于各个资源的最大需求数目int Allocation[N]; //进程已经得到的各个资源的数目int Need[N]; // 进程对各个资源所需要的数目};int p_num, s_num; // 进程数、资源种类static struct Process P[N];int Available[N]; //系统中各个资源可用的数目void dfs(int step){/**银行家算法(实现所有存在路径的查找)搜寻所有的安全序列 */for (int i = 0; i < p_num; i++){back_time++; // 找到当前安全序列的时间点int flag = 0;if (vis[i]) continue;//判断现有的系统资源是否满足该进程的需求for (int j = 0; j < s_num; j++){if (Available[j] < P[i].Need[j]){flag = 1;break;}}if (flag) continue;vis[i] = true;//该进程运行完毕ans[step] = i;//将这个可以运行的进程编号存入数组当中// 回收资源for (int j = 0; j < s_num; j++)Available[j] += P[i].Allocation[j];//如果所有的进程都全部执行完毕if (step == p_num)Print(ans, p_num);dfs(step + 1);vis[i] = false;for (int j = 0; j < s_num; j++)Available[j] -= P[i].Allocation[j];}}四、实验过程分析本次实验的主要任务是实现银行家算法,通过输入当前某一时刻系统的资源数目和所有进程相关的资源信息,然后通过算法的实现判断当前系统是否处于不安全状态,如果是处于安全状态那么找到所有的安全序列。
操作系统课程设计——银行家算法的模拟实现
实验报告附录3程序源代码:#include<string.h>#include<stdio.h>#include<stdlib.h># define m 50# define false 0#define true 1int no1; //进程数int no2; //资源数int r;int allocation[m][m],need[m][m],available[m],max[m][m];char name1[m],name2[m]; //定义全局变量void main(){void check();void print();int i,j,p=0,q=0;char c;int request[m],allocation1[m][m],need1[m][m],available1[m];printf("**********************************************\n");printf("* 银行家算法的设计与实现*\n");printf("**********************************************\n");printf("请输入进程总数:\n");scanf("%d",&no1);printf("请输入资源种类数:\n");scanf("%d",&no2);printf("请输入Max矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&max[i][j]); //输入已知进程最大资源需求量printf("请输入Allocation矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&allocation[i][j]); //输入已知的进程已分配的资源数for(i=0;i<no1;i++)for(j=0;j<no2;j++)need[i][j]=max[i][j]-allocation[i][j]; //根据输入的两个数组计算出need矩阵的值printf("请输入Available矩阵\n");for(i=0;i<no2;i++)scanf("%d",&available[i]); //输入已知的可用资源数print(); //输出已知条件check(); //检测T0时刻已知条件的安全状态if(r==1) //如果安全则执行以下代码{do{printf("\n请输入请求资源的进程号(0~4):\n");for(j=0;j<=no2;j++){scanf("%d",&i);if(i>=no1){printf("输入错误,请重新输入:\n");continue;}else break;}printf("\n请输入该进程所请求的资源数request[j]:\n");for(j=0;j<no2;j++)scanf("%d",&request[j]);for(j=0;j<no2;j++)if(request[j]<=need[i][j]) p=0;//判断请求是否超过该进程所需要的资源数if(p)printf("请求资源超过该进程资源需求量,请求失败!\n");else{for(j=0;j<no2;j++)if(request[j]<=available[j]) q=0; //判断请求是否超过可用资源数if(q)printf("没有做够的资源分配,请求失败!\n");else //请求满足条件{for(j=0;j<no2;j++){available1[j]=available[j];allocation1[i][j]=allocation[i][j];need1[i][j]=need[i][j];//保存原已分配的资源数,仍需要的资源数和可用的资源数available[j]=available[j]-request[j];allocation[i][j]=allocation+request[j];need[i][j]=need[i][j]-request[j];//系统尝试把资源分配给请求的进程}print();check(); //检测分配后的安全性if(r==0) //如果分配后系统不安全{for(j=0;j<no2;j++){available[j]=available1[j];allocation[i][j]=allocation1[i][j];need[i][j]=need1[i][j];//还原已分配的资源数,仍需要的资源数和可用的资源数}printf("返回分配前资源数\n");print();}}}printf("\n你还要继续分配吗?Y or N ?\n");//判断是否继续进行资源分配c=getchar();}while(c=='y'||c=='Y');}}void check() //安全算法函数{int k,f,v=0,i,j;int work[m],a[m];int finish[m];r=1;for(i=0;i<no1;i++)finish[i]=false; // 初始化进程均没得到足够资源数并完成for(i=0;i<no2;i++)work[i]=available[i];//work[i]表示可提供进程继续运行的各类资源数k=no1;do{for(i=0;i<no1;i++){if(finish[i]==false){f=1;for(j=0;j<no2;j++)if(need[i][j]>work[j])f=0;if(f==1) //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程{finish[i]=true;a[v++]=i; //记录安全序列号for(j=0;j<no2;j++)work[j]+=allocation[i][j]; //释放该进程已分配的资源}}}k--; //每完成一个进程分配,未完成的进程数就减1}while(k>0);f=1;for(i=0;i<no1;i++) //判断是否所有的进程都完成{if(finish[i]==false){f=0;break;}}if(f==0) //若有进程没完成,则为不安全状态{printf("系统处在不安全状态!");r=0;}else{printf("\n系统当前为安全状态,安全序列为:\n");for(i=0;i<no1;i++)printf("p%d ",a[i]); //输出安全序列}}void print() //输出函数{int i,j;printf("\n");printf("*************此时刻资源分配情况*********************\n");printf("进程名/号| Max | Allocation | Need |\n");for (i = 0; i < no1; i++){printf(" p%d/%d ",i,i);for (j = 0; j < no2; j++){printf("%d ",max[i][j]);}for (j = 0; j < no2; j++){printf(" %d ",allocation[i][j]);}for (j = 0; j < no2; j++){printf(" %d ",need[i][j]);}printf("\n");}printf("\n");printf("各类资源可利用的资源数为:");for (j = 0; j < no2; j++){printf(" %d",available[j]);}printf("\n");}(程序结束)附录 4程序运行调试结果:1、程序初始化2、检测系统资源分配是否安全结果。
操作系统实验报告--银行家算法
操作系统实验报告二一:实验标题:实现死锁避免算法:银行家算法。
二:实验环境:操作系统:windows7编译器:Visual Studio 2010三:设计方案:1.实验目的通过程序模拟银行家算法,理解如何应用银行家算法避免死锁。
2.实验手段直接在C源程序定义整形进程数量、资源种类;用2维数组表示最大需求、已分配的资源。
从文件获取相关数量。
3.验证方式检验当前资源是否有安全序列,是的话输出安全序列。
四:实验代码:#include<stdio.h>#include<stdlib.h>#define P_num 5#define R_num 3int Allocation[P_num][R_num],Avaliable[R_num],Max[P_num][R_num]; int Need[P_num][R_num];int compare(int *a,int *b,int n){ int i;for(i = 0;i < n;i ++)if(a[i] < b[i])return 0;return 1;}void add(int *a,int *b,int n){ int i;for(i = 0;i < n;i++)a[i] += b[i];}void substract(int *a,int *b,int n){ int i;for(i = 0;i < n;i++)a[i] -= b[i];}void assign(int *a,int *b,int n){ int i;for(i = 0;i < n;i ++)a[i] = b[i];}void input(){FILE *fp;int i,j;if((fp = fopen("banker.txt","r")) == 0){ printf("cannot open the file");exit(0);}for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Allocation[i][j]);}for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Max[i][j]);}for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Avaliable[j]);}fclose(fp);for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){Need[i][j] = Max[i][j] - Allocation[i][j];}}int issafe(int *sp){int i;int count = 0;int n = 0;int work[R_num],finish[P_num];assign(work,Avaliable,R_num);for(i = 0;i < P_num;i ++)finish[i] = 0;n = P_num;while(n --){for(i = 0;i < P_num;i ++)if((finish[i] == 0) && compare(work,Need[i],R_num)){ add(work,Allocation[i],R_num);finish[i] = 1;sp[count] = i;count ++;}if(count >= P_num)return 1;}return 0;}int request(int pid,int *r,int n){int i;int sp[P_num];if(compare(Need[pid],r,n) == 1 && compare(Avaliable,r,n) == 1){ substract(Avaliable,r,n);add(Allocation[pid],r,n);substract(Need[pid],r,n);if(issafe(sp)){printf("Security Path:\n\t");for(i = 0;i < P_num;i ++)printf("p[%d] ",sp[i]);printf("\n");return 1;}else{add(Avaliable,r,n);substract(Allocation[pid],r,n);add(Need[pid],r,n);printf("no Security Parh on this request\n");return 0;}}else{printf("no Security Parh on this request\n");return 0;}}void main(){int id,i;int r[R_num],sp[P_num];input();if(issafe(sp)){printf("Security Path:\n\t");for(i = 0;i < P_num;i ++)printf("p[%d] ",sp[i]);printf("\n");}elseprintf("failed\n");printf("input the new request's id:");scanf("%d",&id);printf("input the new request:");for(i = 0;i < R_num;++ i)scanf("%d",&r[i]);request(id,r,R_num);}banker.txt文件内容:0 1 02 0 03 0 22 1 10 0 27 5 33 2 29 0 22 2 24 3 33 3 2所得结果:Security Path:P[1] p[3] p[4] p[0] p[2] Intput the new request's id:0Input the new request:0 2 0Security Path:p[3] p[1] p[2] p[0] p[4] 问题和想法:。
银行家算法操作系统实验报告
竭诚为您提供优质文档/双击可除银行家算法操作系统实验报告篇一:计算机操作系统银行家算法实验报告计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:(1)如果Requesti<or=need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;need=need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:(1)设置两个向量①工作向量work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,work=Allocation;②布尔向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②need 如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程p获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:work=work+Allocation;Finish[i]=true;转向步骤(2)。
操作系统实验六(编程模拟实现银行家算法)
实验六编程模拟实现银行家算法(综合性编程实验4学时)一. 目的要求通过对银行家算法的模拟,了解死锁概念、死锁的本质以及掌握解决死锁的方法。
二.实验任务编程模拟银行家算法中的安全性算法,系统当前状态(最大资源需求、进程已占有的资源、进程还需要的资源)以某种形式输入,程序输出是否安全和不安全的结果。
三.实验环境、设备硬件:586以上的PC系列机,主频大于166M,内存大于16MB,硬盘空闲空间大于500MB。
软件:选择一个自己熟悉的计算机操作系统(如DOS、Windows98/2000/XP、UNIX、linux等,根据各学校的条件与环境而定)和程序设计语言(如Turbo C、C语言、PASCAL语言等)。
编程语言由各位同学自己选择确定,不做统一规定。
四.实验指导模拟银行家算法中的安全性算法,系统当前状态(最大资源需求。
进程已占有的资源、进程还需要的资源)以某种形式输入,程序输出是否安全和不安全的结果。
为简单以见,以教材中的例子做为输入,实现安全性算法。
1.主要数据结构①可用资源数组work,它的长度为资源类型数2,如果work [1]= k表示当前状态下B种资源的可用个数为k个。
例:work[1]=3,表示B类资源当前空闲3台。
②分配矩阵allo(alloction),它是一个[5,2]的矩阵,allo [3,1]= k表示第4个进程已分配k个B类型的资源数.③剩余需求矩阵need,它是一个[5,2]的矩阵,need[3,1]=k表示第4个进程还需要k个B类型的资源数.④系统拥有资源向量max,它的长度为资源类型数2,如果max [1]= k,表示系统中拥有B种资源数为k个.⑤安全状态标示数组finish,他的长度为进程个数5,用它来表示当前状态下系统是否有足够资源分配给该进程。
2.程序说明该程序对于每一种资源进行安全检验,进行检验的算法详见《操作系统》,该程序没有实现每个进程在系统安全时进行动态的分配资源,而是在静态的条件下输入系统的状态,和每个进程拥有.资源的状态,来判断系统是否安全.因此在程序中定义的request矩阵,没有起到作用.如要实规模拟动态的资源分配,在该程序的基础上稍加改动即可.五.实验源代码import java.util.*;public class os{public static void main(String args[]){int max[][]={{7,5},{3,2},{9,0},{2,2},{4,3}};int allo[][]={{0,1},{2,0},{3,0},{2,1},{0,0}};int need[][]={{7,4},{1,2},{6,0},{0,1},{4,3}};int work[]={3,3};boolean finish[]={false,false,false,false,false};int count=5;int i;while(count>0){for( i=0;i<5;i++){if(finish[i]==false&&need[i][0]<=work[0]&&need[i][1]<=work[1]){work[0]+=allo[i][0];work[1]+=allo[i][1];finish[i]=true;count--;break;}}}if(count==0)System.out.println("系统安全!");elseSystem.out.println("系统不安全!");} }。
(完整word版)操作系统银行家算法实验报告(1)
银行家算法实验报告【实验目的】(1)根据设计题目的要求,充分地分析和理解题目,叙述系统的要求,明确程序要求实现的功能以及限制条件。
(2)明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。
【实验要求】(1)了解和理解死锁;(2)理解利用银行家算法避免死锁的原理;(3)会使用某种编程语言。
【实验原理】一、安全状态指系统能按照某种顺序如<P1,P2,…,Pn>称为<P1,P2,…,Pn:序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。
二、银行家算法假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。
系统按下述步骤进行安全检查:(1)如果Request^ Need则继续以下检查,否则显示需求申请超出最大需求值的错误。
(2)如果Request^ Available则继续以下检查,否则显示系统无足够资源,Pi阻缶Aft 3七1塞等^待0(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:Available [j ]:=Available [j ] -Request^ ];Allocation [i,j ]:=Allocation [ i,j] +Request [j];Need [ i,j ]:=Need [i,j] -Requesti [j];(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
三、安全性算法(1)设置两个向量:①工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work : =Available;②Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。
银行家算法的模拟实现
{cout << p[i];
if (i != l - 1)
{ cout << "-->";
}
} cout << "" << endl;
return true;
}
实验模拟结果:
总
结
银行结算法有效避免了系统在资源分配中的死锁问题。通过至此实验更是加深了对这一方面的理解与认识,对系统进程分配资源的过程和实现该过程的算法结构认识更加深刻。
{ if (FINISH[i] == true)
{ continue;
}for (j = 0; j < n; j++)//循环查找第i个进程需要的各个资源数是否超过系统现有的对应的资源数
}
if (NEED[i][j] > Work[j])//第i个进程需要的第j个资源数>系统现有的第j个资源数
{ break ;
goto input;
}
} for (i = 0; i < n; i++)//如果请求合理,那么下面
{ AVAILABLE[i] -= REQUEST[cusneed][i];//系统可用资源减去申请了的
ALLOCATION[cusneed][i] += REQUEST[cusneed][i];//线程被分配的资源加上已申请了的
Work[i] = AVAILABLE[i];
for (i = 0; i < m; i++)
{ FINISH[i] = false;//FINISH记录每个进程是否安全
计算机操作系统银行家算法实验报告
计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要办法,通过编写一种简朴的银行家算法程序,加深理解有关资源申请、避免死锁等概念,并体会和理解死锁和避免死锁的具体实施办法。
三、问题分析与设计:1、算法思路:先对顾客提出的请求进行正当性检查,即检查请求与否不不大于需要的,与否不不大于可运用的。
若请求正当,则进行预分派,对分派后的状态调用安全性算法进行检查。
若安全,则分派;若不安全,则回绝申请,恢复到原来的状态,回绝申请。
2、银行家算法环节:(1)如果Requesti<or =Need,则转向环节(2);否则,认为出错,由于它所需要的资源数已超出它所宣布的最大值。
(2)如果Request<or=Available,则转向环节(3);否则,表达系统中尚无足够的资源,进程必须等待。
(3)系统试探把规定的资源分派给进程Pi,并修改下面数据构造中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查本次资源分派后,系统与否处在安全状态。
3、安全性算法环节:(1)设立两个向量①工作向量Work。
它表达系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。
它表达系统与否有足够的资源分派给进程,使之运行完毕,开始时先做Finish[i]=false,当有足够资源分派给进程时,令Finish[i]=true。
(2)从进程集合中找到一种能满足下述条件的进程:①Finish[i]=false②Need<or=Work如找到,执行环节(3);否则,执行环节(4)。
(3)当进程P 获得资源后,可顺利执行,直至完毕,并释放出分派给它的资源,故应执行:Work=Work+Allocation;Finish[i]=true;转向环节(2)。
(完整word版)《银行家算法的模拟实现》—实验报告
《银行家算法的模拟实现》 --实验报告题目: 银行家算法的模拟实现专业:班级:组员:指导老师:一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。
本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。
二、实验内容模拟实现银行家算法实现死锁避免。
要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。
三、实验分析过程1、整个银行家算法的思路。
先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。
1)进程一开始向系统提出最大需求量.2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待2、算法用到的主要数据结构和C语言说明。
(1)、可利用资源向量INT A V AILABLE[M] M为资源的类型。
(2)、最大需求矩阵INT MAX[N][M] N为进程的数量。
(3)、已分配矩阵INT ALLOCA TION[N][M](4)、还需求矩阵INT NEED[N][N](5)、申请各类资源数量int Request[x]; //(6)、工作向量int Work[x];(7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是3、银行家算法(主程序)(1)、系统初始化。
输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等(2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。
(3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。
操作系统实验银行家算法模拟实现(强烈推荐)
操作系统实验银行家算法模拟实现(强烈推荐)银行家算法模拟实现一.实验目的1) 理解死锁避免相关内容;2) 掌握银行家算法主要流程;3) 掌握安全性检查流程。
二.实验描述本实验主要对操作系统中的死锁预防部分的理论进行实验。
要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。
三.实验内容1) 设计多个资源(≥3);2) 设计多个进程(≥3);3) 设计银行家算法相关的数据结构;4) 动态进行资源申请、分配、安全性检测并给出分配结果。
四.实验要求1) 编写程序完成实验内容;2) 画出安全性检测函数流程图;3) 小组派1人上台用PPT演讲实现过程;4) 撰写实验报告。
测试要求1) 进行Request请求,输入参数为进程号、资源号和资源数;2) 进行3次以上的Request请求;3) 至少进行1次资源数目少于可用资源数,但不安全的请求。
五.实验设备PC机1台,要求安装DOS7.1、Turbo C3.0、Windows2000。
六.实验结果七.实验思考1)针对死锁有哪些可行方案?2)死锁解除的难点是什么?八.银行家算法介绍8.1银行家算法的数据结构1) 可利用资源向量Available。
其中每个元素代表每类资源的数目。
2) 最大需求矩阵Max。
其中每个元素代表每个进程对于每类资源的最大需求量。
Max[i,j]=K表示i进程对于j类资源的最大需求量为K。
3) 分配矩阵Allocation。
其中每个元素代表每个进程已得到的每类资源的数目。
4) 需求矩阵Need。
其中每个元素代表每个进程还需要的每类资源的数目。
8.2银行家算法Request i [j]=K表示进程Pi需要K个j类资源。
1)如果Request i [j]≤Need[i , j],便转向步骤2,否则认为出错。
2)如果Request i [j]≤Available[j],便转向步骤3,否则表示无足够资源,Pi需等待;3)系统尝试分配资源给Pi;4)系统进行安全性检查,检查此次资源分配后,系统是否安全。
操作系统银行家算法实验报告
操作系统银行家算法实验报告操作系统银行家算法实验报告引言:操作系统是计算机科学中的一个重要领域,它负责管理计算机的硬件和软件资源,以提供良好的用户体验。
在操作系统中,银行家算法是一种重要的资源分配和调度算法,它可以确保系统中的进程安全地访问资源,避免死锁的发生。
本实验旨在通过实践运用银行家算法,深入理解其原理和应用。
实验目的:1. 理解银行家算法的基本原理;2. 掌握银行家算法的实现方法;3. 分析银行家算法在资源管理中的应用。
实验过程:1. 实验环境的搭建在本次实验中,我们使用了一台运行Windows操作系统的计算机,并安装了Java开发环境。
同时,我们使用了一个模拟的资源管理系统,以便更好地理解和实践银行家算法。
2. 银行家算法的原理银行家算法是通过对系统中的资源进行合理分配,以避免死锁的发生。
它基于以下几个假设:- 每个进程对资源的最大需求量是已知的;- 系统中的资源数量是有限的;- 进程在请求资源时必须先声明其最大需求量;- 进程在释放资源后,不能再重新请求。
3. 银行家算法的实现银行家算法的实现主要包括以下几个步骤:- 初始化:获取系统中的资源总量和每个进程的最大需求量;- 安全性检查:通过模拟分配资源并检查系统是否处于安全状态,以确定是否可以满足进程的资源请求;- 资源分配:根据安全性检查的结果,决定是否分配资源给进程。
4. 银行家算法的应用银行家算法在实际应用中具有广泛的用途,尤其是在多任务操作系统中。
它可以用于资源的分配和调度,以确保系统中的进程能够安全地访问资源,避免死锁的发生。
结论:通过本次实验,我们深入了解了银行家算法的原理和应用。
银行家算法作为一种重要的资源管理和调度算法,可以有效地避免死锁的发生,提高系统的可靠性和稳定性。
在今后的学习和工作中,我们将继续深入研究操作系统相关的算法和原理,以提升自己在该领域的专业能力。
银行家算法模拟实验
银行家算法模拟实验(总12页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--淮海工学院计算机工程学院实验报告书课程名:《操作系统》题目:银行家算法模拟实验班级: Gy计算机121学号: 61姓名:张凯一、实验目的与要求1.目的:用C、C++或Java语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。
本实验可加深对行家算法的理解。
2.要求:设计五个进程{P0,P1,P2,P3,P4}共享三类资源{A,B,C}的系统,{A,B,C}的资源数量分别为10,5,7。
进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据的情况。
二、程序流程图三、主要程序清单#include <>#include <>#include <>#include <iomanip>#define n 10#define true 1#define false 0int N ; // 资源总类int M; //总进程数int Available[50];int Max[50][50];int Allocation[50][50]={0};int Need[50][50]={0};int Work[50]={0};int Temp[50]={0}; //存放安全序列号char Name[50]={0};int Sum[50]={0};int Request[50]={0};void Print(){int k=0;cout<<" ***********资源分配表***********"<<endl;cout<<" Process "<<" Max "<<" Allocation "<<" Need "<<" Available"<<endl;cout<<" A B C "<<" A B C "<<" A B C "<<" A B C"<<endl;for(int i=0;i<M;i++){cout<<" P"<<i<<" ";for(int 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<<" ";for(j=0;j<N;j++){ if(k!=3){cout<<" "<<Available[j];k++;}}cout<<endl;}}void Create(){int i,j;cout<<"请输入您要创建进程的数量:"<<endl;cin>>M;cout<<"请输入各类资源的总数:("<<N<<"个)"<<endl;for(i=0;i<N;i++)cin>>Sum[i];k1: cout<<endl;cout<<"请输入各类进程所需要资源最大数目:("<<N*M<<"个)"<<endl;for(i=0;i<M;i++)for( j=0;j<N;j++){cin>>Max[i][j];if(Max[i][j]>Sum[j]){cout<<"占有资源超过了声明的该资源总数,请重新输入!"<<endl;goto k1;}}k2: cout<<endl;cout<<"请输入各类进程已分配的各类资源的数目:("<<N*M<<"个)"<<endl;for(i=0;i<M;i++)for(j=0;j<N;j++){cin>>Allocation[i][j];if(Allocation[i][j]>Max[i][j]){cout<<"占有资源超过了声明的该资源总数,请重新输入!"<<endl;goto k2;}}int p;for(i=0;i<N;i++){ p=Sum[i];for(j=0;j<M;j++)p=p-Allocation[j][i];Available[i]=p;}for(i=0;i<M;i++)for(j=0;j<N;j++)Need[i][j]=Max[i][j]-Allocation[i][j]; }void restore(int i){int j;for(j=0;j<N;j++){Available[j]+=Request[j];Allocation[i][j]-=Request[j];Need[i][j]+=Request[j];}}int changedata(int i){int j;for(j=0;j<N;j++){Available[j]+=Request[j];Allocation[i][j]-=Request[j];Need[i][j]+=Request[j];}return 1;}int Safe() //处理传过来的第几个进程{int i=0;int k=0;int m;int apply,Finish[50]={0};int j,flag=0;for(i=0;i<N;i++)Work[i]=Available[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;flag;}}}}for(i=0;i<M;i++){if(Finish[i]==false){cout<<"系统不安全!!! 本次资源申请不成功!!!"<<endl;return -1;}}cout<<"经安全性检查,系统安全,本次分配成功!!"<<endl;cout<<"安全序列号 ";for(i=0;i<M-1;i++)cout<<"P"<<Temp[i]<<", ";cout<<"P"<<Temp[i]<<">"<<endl;cout<<endl;return 0;}void dijkstra(){char ch;int i=0,j=0;ch='y';cout<<"请输入你要请求的资源进程号(0-"<<M-1<<"):"<<endl;cin>>i;cout<<"请输入进程"<<i<<"请求Request变量"<<endl;for(i=0;i<N;i++){cout<<Name[j]<<":";cin>>Request[i];}for(i=0;i<N;i++){if(Request[i]>Need[j][i]){cout<<"进程"<<i<<"申请的资源大于他需要的资源";cout<<"分配不合理,不予分配!"<<endl;ch='n';break;}elseif(Request[j]>Available[j]){cout<<"进程"<<i<<"申请的资源大于系统可利用的资源";cout<<"分配出错,不予分配!"<<endl;ch='n';break;}if(ch='y')changedata(i);Print();Safe();if(Safe()==1)restore(i);}}int main(){int c;Create();Print();Safe();while(c){cout<<" 银行家算法"<<endl;cout<<" 1 分配资源"<<endl;cout<<" 2 离开 "<<endl;cout<<"请选择功能号:"<<endl;cin>>c;switch(c){case 1:dijkstra();break;case 0:c=0;break;default:cout<<"请正确选择功能号(0--1)"<<endl;break;}}return 1;}四、程序运行结果五、实验体会通过这次实验,我学会了银行家算法有原理,并用自己已学的知识,结合书本完成了此次实验,收获蛮大。
操作系统实验2--银行家算法
操作系统实验2--银行家算法(总9页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--操作系统课程设计报告课程名称:银行家算法姓名:刘成启学号:149班级:计算机1008班指导老师:袁宁共享资源分配与银行家算法一、实验目的[问题描述]本题主要内容是模拟实现资源分配。
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
通过对这个算法的设计,让学生能够对书本知识有更深的理解,在操作和其它方面有更高的提升。
二、实验内容[基本要求]具体用银行家算法实现资源分配。
要求如下:(1) 设计一个3个并发进程共享3类不同资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2) 设计用银行家算法,实现资源分配,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3) 确定一组各进程依次申请资源数的序列,输出运行结果。
[方案设计及开发过程]1银行家分配算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,每个进程都无法继续执行下去的死锁现象。
把个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
显然,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.2.算法描述银行家算法:设进程I提出请求Request[N],则银行家算法按如下规则进行判断。
(完整word版)操作系统课程设计(银行家算法的模拟实现)剖析
操作系统课程设计(银行家算法的模拟实现)一、设计目的1、进一步了解进程的并发执行。
2、加强对进程死锁的理解。
3、用银行家算法完成死锁检测。
二、设计内容给出进程需求矩阵C、资源向量R以及一个进程的申请序列.使用进程启动拒绝和资源分配拒绝(银行家算法)模拟该进程组的执行情况.三、设计要求1、初始状态没有进程启动.2、计算每次进程申请是否分配,如:计算出预分配后的状态情况(安全状态、不安全状态),如果是安全状态,输出安全序列。
3、每次进程申请被允许后,输出资源分配矩阵A和可用资源向量V。
4、每次申请情况应可单步查看,如:输入一个空格,继续下个申请.四、算法原理1、银行家算法中的数据结构(1)、可利用资源向量Available,这是一个含有m个元素的数组,其中的每个元素代表一类可利用资源的数目, 其初始值是系统中所配置的该类全部资源的数目,其数值随该类资源的分配和回收而动态改变。
如果Available[j]=K,则表示系统中现有Rj类资源K个.(2)、最大需求矩阵Max,这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求.如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K.(3)、分配矩阵Allocation。
这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数.如果Allocation[i,j]=K,则表示进程i当前已经分得Rj类资源的数目为K。
(4)、需求矩阵Need。
这也是一个n*m的矩阵,用以表示每个进程尚需要的各类资源数.如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
上述三个矩阵间存在以下关系:Need[i,j]=Max[i,j]—Allocation[i,j]2、银行家算法应用模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:一是银行家算法(扫描);二是安全性算法。
(1)银行家算法(扫描)设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Ri类型的资源.当Pi发出资源请求后,系统按下述步骤进行检查:①如果Requesti[j]<=Need[i,j],便转向步骤②;否则认为出错,因为它所需的资源数已经超过了它所宣布的最大值。
操作系统实验_银行家算法
学号P7******* 专业计算机科学与技术姓名实验日期2017。
11.9 教师签字成绩实验报告【实验名称】银行家算法【实验目的】掌握银行家算法,用银行家算法模拟操作系统避免死锁的方法【实验原理】银行家算法又称“资源分配拒绝"法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。
这时系统将该进程从进程集合中将其清除。
此时系统中的资源就更多了.反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。
请进程等待用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配.程序能模拟多个进程共享多种资源的情形.进程可动态地申请资源,系统按各进程的申请动态地分配资源。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况【数据结构和符号说明】可利用资源向量Available最大需求矩阵Max分配矩阵Allocation需求矩阵Need工作向量Work标记向量Finishchar name[100][10];//定义最大100个进程,每个大小为10int Max[100][100]; //定义int Allocation[100][100];//可利用资源向量资源数int Need[100][100];//需求矩阵int avaiable[100];//系统可利用资源int avaiable1[100];int state[100];//进程状态数组char name1[100][10];//进程名int bigger; ;//是否大于int N; //进程数int n; //资源数int counter;函数:void Input()//输入函数void Init()//初始化void output()//输出安全序列或等待void insert_pcb()//请求进程或更新进程void show()//显示界面与选择int CmpRequestAvailable(int Pos,int n)//比较Request和Available的大小int CmpRequestNeed(int Pos,int n)//比较Request和Need的大小void Reset(int n,int Pos)//更新request之后的Need,Allocation,Available 的值void Banker()//银行家算法【实验流程图及算法实现】用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八银行家算法模拟实现一.实验目的1)理解死锁避免相关内容;2)掌握银行家算法主要流程;3)掌握安全性检查流程。
二.实验描述本实验主要对操作系统中的死锁预防部分的理论进行实验。
要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。
三.实验内容1)设计多个资源(≥3);2)设计多个进程(≥3);3)设计银行家算法相关的数据结构;4)动态进行资源申请、分配、安全性检测并给出分配结果。
四.实验要求1)编写程序完成实验内容;2)画出安全性检测函数流程图;3)小组派1人上台用PPT演讲实现过程;4)撰写实验报告。
测试要求1)进行Request请求,输入参数为进程号、资源号和资源数;2)进行3次以上的Request请求;3)至少进行1次资源数目少于可用资源数,但不安全的请求。
五.实验设备PC机1台,要求安装DOS7.1、Turbo C3.0、Windows2000。
六.实验结果七.实验思考1)针对死锁有哪些可行方案?2)死锁解除的难点是什么?八.银行家算法介绍8.1银行家算法的数据结构1)可利用资源向量Available。
其中每个元素代表每类资源的数目。
2)最大需求矩阵Max。
其中每个元素代表每个进程对于每类资源的最大需求量。
Max[i,j]=K表示i进程对于j类资源的最大需求量为K。
3)分配矩阵Allocation。
其中每个元素代表每个进程已得到的每类资源的数目。
4)需求矩阵Need。
其中每个元素代表每个进程还需要的每类资源的数目。
8.2银行家算法Request i [j]=K表示进程Pi需要K个j类资源。
1)如果Request i [j]≤Need[i , j],便转向步骤2,否则认为出错。
2)如果Request i [j]≤Available[j],便转向步骤3,否则表示无足够资源,Pi需等待;3)系统尝试分配资源给Pi;4)系统进行安全性检查,检查此次资源分配后,系统是否安全。
如果安全,则正式分配资源,否则撤销此次分配。
8.3安全性算法1)设置两个向量:工作向量Work和Finish。
算法开始时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[j]+Allocation[i , j];Finish[i] = True;到第2)步。
4)直到所有Finish[i]=True,表示系统处于安全状态;否则系统处于不安全状态。
#include<iostream.h>#include<string.h>#include<stdio.h>#define False 0#define True 1int 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;//作业的最大数为100int N=100;//资源的最大数为100void 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;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;}if (Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则出错{cout<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";cout<<" 分配出错,不予分配!"<<endl;ch='n';}}}main(){ int i;showdata();//显示资源矩阵changdata(i);//进行资源分配safe();share();//利用银行家算法对申请资源对进行判定}。