实验二 银行家算法
- 格式:doc
- 大小:57.50 KB
- 文档页数:6
银行家算法实验报告总结一、实验目的与背景银行家算法是一种用于避免死锁和保证系统稳定运行的算法。
通过模拟银行贷款行为的策略,银行家算法可以有效地避免系统的资源枯竭,从而保证系统的正常运行。
在本实验中,我们通过使用银行家算法对实际的系统进行模拟,验证其有效性。
二、算法原理与流程银行家算法的主要原理是:将系统中的所有资源按照类型进行分类,并对每种资源设置一个最大值和最小值,分别表示该资源的最大需求量和最小剩余量。
同时,对于每个进程,需要定义其最大需求量、已分配资源和需求量,并根据这些信息来决定是否分配资源。
具体流程如下:初始化:将所有资源的最大值和最小值进行初始化,并给每个进程分配一个唯一的标识符。
请求资源:每个进程在执行过程中,如果需要更多的资源,则向系统发送请求。
分配资源:系统根据银行家算法的原理,将资源分配给满足条件的进程。
更新资源:系统更新已分配给进程的资源,并检查是否满足每个进程的最大需求量。
重复执行:如果存在多个进程需要资源,则重复执行步骤2-4,直到所有进程都满足其最大需求量或系统中的资源不足以为更多的进程分配资源为止。
三、实验数据与结果在本实验中,我们使用了10个进程,每个进程的需求量和已分配资源均随机生成。
实验结果表明,在满足了每个进程的最大需求量后,系统中仍有剩余资源,证明了银行家算法可以有效地避免资源的浪费。
四、结果分析通过对实验结果进行分析,我们发现银行家算法可以有效地保证系统的稳定性,避免出现死锁和资源枯竭等问题。
同时,该算法需要较少的系统开销,因为只需要对每个进程的请求进行处理和更新,不需要进行额外的检查和管理。
五、性能对比分析为了进一步验证银行家算法的性能,我们将其与其他常见的资源管理算法进行了比较。
在同等条件下,与其他算法相比,银行家算法具有更高的系统吞吐量和更低的响应时间。
银行家算法在系统吞吐量和响应时间方面均优于其他常见算法,而在死锁发生率上,银行家算法则表现出了更高的稳定性。
操作系统实验⼆:银⾏家算法实验⼆银⾏家算法⼀、实验⽬的1、了解什么是操作系统安全状态和不安全状态;2、了解如何避免系统死锁;3、理解银⾏家算法是⼀种最有代表性的避免死锁的算法,掌握其实现原理及实现过程。
⼆、实验内容根据银⾏家算法的基本思想,编写和调试⼀个实现动态资源分配的模拟程序,并能够有效避免死锁的发⽣。
三、实验原理进程申请资源时,系统通过⼀定的算法判断本次申请是否不可能产⽣死锁(处于安全状态)。
若可能产⽣死锁(处于不安全状态),则暂不进⾏本次资源分配,以避免死锁。
算法有著名的银⾏家算法。
1、什么是系统的安全状态和不安全状态?所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直⾄最⼤需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。
如果不存在这样的安全序列,则称系统处于不安全状态。
2、银⾏家算法把操作系统看作是银⾏家,操作系统管理的资源相当于银⾏家管理的资⾦,进程向操作系统请求分配资源相当于⽤户向银⾏家贷款。
为保证资⾦的安全,银⾏家规定:(1) 当⼀个顾客对资⾦的最⼤需求量不超过银⾏家现有的资⾦时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最⼤需求量;(3) 当银⾏家现有的资⾦不能满⾜顾客尚需的贷款数额时,对顾客的贷款可推迟⽀付,但总能使顾客在有限的时间⾥得到贷款;(4) 当顾客得到所需的全部资⾦后,⼀定能在有限的时间⾥归还所有的资⾦。
操作系统按照银⾏家制定的规则设计的银⾏家算法为:(1)进程⾸次申请资源的分配:如果系统现存资源可以满⾜该进程的最⼤需求量,则按当前的申请量分配资源,否则推迟分配。
(2)进程在执⾏中继续申请资源的分配:若该进程已占⽤的资源与本次申请的资源之和不超过对资源的最⼤需求量,且现存资源能满⾜该进程尚需的最⼤资源量,则按当前申请量分配资源,否则推迟分配。
(3)⾄少⼀个进程能完成:在任何时刻保证⾄少有⼀个进程能得到所需的全部资源⽽执⾏到结束。
计算机操作系统实验报告一、实验名称:银行家算法二、实验目得:银行家算法就是避免死锁得一种重要方法,通过编写一个简单得银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会与了解死锁与避免死锁得具体实施方法。
三、问题分析与设计: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).(4)如果所有进程得Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态.四、程序源代码:#include〈stdio、h>#define W 5//最大进程数W=5#define R 3//最大资源总数=3int Available[3];//可利用资源向量int Max[5][3];//最大需求矩阵int Allocation[5][3]; //分配矩阵intNeed[5][3];//需求矩阵int Request[3];//进程请求向量void dispose(){printf(”请输入可利用资源向量Available(格式:a,b,c)\n”);scanf("%d,%d,%d”,&Available[0],&Available[1],&Available[2]);printf(”请输入最大需求数Max(格式:a,b,c)\n");for(int j=0;j<5;j++){printf("进程%d:\n”,j);ﻩscanf("%d,%d,%d",&Max[j][0],&Max[j][1],&Max[j][2]);}printf("请输入分配数Allocation(格式:a,b,c)\n");for(j=0;j〈5;j++){printf("进程%d\n”,j);scanf(”%d,%d,%d",&Allocation[j][0],&Allocati on[j][1],&Allocation[j][2]);}//输入Max[5][3],Available[5][3],Allocation[5][3]for(j=0;j〈5;j++)for(int i=0;i〈3;i++)Need[j][i]=Max[j][i]—Allocation[j][i];//求出Need[5][3]}main(){ﻩprintf(”银行家算法 \n");dispose();printf("安全性检查\n");int Work[3];//系统可提供进程继续运行所需得各类资源数char Finish[5];//表示系统就是否有足够得资源分配for(int i=0;i<5;i++)Finish[i]='f';for(intk=0;k<3;k++)Work[k]=Available[k];int q[5];for(int x=0;x〈50;x++){printf(”请输入一个序列:\n”);scanf("%d,%d,%d,%d,%d",&q[0],&q[1],&q[2],&q[3],&q[4]);for(i=0;i<5;i++){if((Need[q[i]][0]〈=Work[0])&&(Need[q[i]][1]〈=Work[1])&&(Need[q[i]][2]<=Work[2]))//比较Need[i][j]与Work[j]{ﻩ for(k=0;k<3;k++)Work[k]=Work[k]+Allocation[q[i]][k];ﻩ Finish[i]='t';ﻩ}}if((Finish[0]=='t’)&&(Finish[1]==’t')&&(Fin ish[2]=='t')&&(Finish[3]=='t')&&(Fin ish[4]=='t'))//通过Finish[i]判断系统就是否安全ﻩbreak;elseﻩprintf("此序列不就是安全序列,请重新输入一个序列!\n");ﻩif(x==49)ﻩreturn 0;}printf("这个系统安全!\n");int a;printf("请输入Request进程:\n”);scanf(”%d”,&a);printf("该进程Request(a,b,c)\n");scanf("%d,%d,%d",&Request[0],&Request[1],&Request[2]);//输入请求量Request[3]if((Request[0]<=Need[a][0])&&(Request[1]<=Need[a][1])&&(Request[2]〈=Need[a][2]))//判断Request[i]<=Need[a][i]{if((Request[0]<=Need[a][0])&&(Request[0]<=Need[a][1])&&(Request[0]〈=Need[a][2]))//判断Request[i]<=Available[a][i]ﻩ{ﻩfor(int k=0;k<3;k++){ﻩAvailable[k]=Available[k]—Request[k];ﻩAllocation[a][k]=Allocation[a][k]+Reques t[k];ﻩNeed[a][k]=Need[a][k]—Request[k];ﻩﻩﻩ//如果上述判断成功,则修改相应得Available[k],Allocation [a][k],Need[a][k]ﻩﻩ}ﻩprintf("资源分配成功!\n”);ﻩ}ﻩelse{ﻩprintf(”资源分配失败!\n");return 0;ﻩ}}else{printf("资源分配失败!\n");ﻩreturn 0;}}程序截图:五、实验总结多个进程同时运行时,系统根据各类系统资源得最大需求与各类系统得剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。
淮海工学院计算机工程学院实验报告书课程名:《操作系统原理A》题目:银行家算法班级:学号:姓名:操作系统原理实验——银行家算法实验报告1目的与要求:1)本实验目的是通过使用银行家算法实现系统资源的分配和安全性检查模拟,提高学生对操作系统资源分配功能的深刻理解,并培养学生对操作系统开发的兴趣与应用能力;2)实验前必须认真阅读和理解银行家算法的基本原理和实现方法;3)独立使用C或VC++编程语言编写银行家算法模拟程序;4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及相关实验数据与运行结果)5)于2015年5月10日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。
2 实验内容或题目1)设计五个进程{P0,P1,P2,P3,P4}共享三类资源{A,B,C}的系统,{A,B,C}的资源总数量分别为10,5,7。
(参考书上用例)2)并行进程可动态地申请资源和释放资源(程序交互输入申请或释放资源数量),系统按各进程的申请动态地分配资源。
3)每当进程动态申请资源或释放资源时,模拟程序应能及时显示或打印各个进程在此时刻的资源分配表、系统可用资源量和安全序列等资源分配信息和安全检查信息。
4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。
3 实验步骤与源程序#include<string.h>#include<stdio.h>#define M 5 //定义进程数#define N 3 //定义资源数 s#define False 0#define True 1int Max[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 Avaliable[3]={3,3,2}; //系统可利用资源int Need[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//还需要资源int Request[3];void showdata()//显示资源矩阵{int i,j;printf("系统目前可利用的资源数量:\n A,B,C\n"); printf("resouce: ");for (j=0;j<N;j++)printf("%d,",Avaliable[j]);//输出分配资源printf("\n");printf("各进程的资源需求:\n");for (i=0;i<M;i++){printf("pr%d: ",i);for (j=0;j<N;j++){printf("%d,",Max[i][j]);//输出最大需求资源数}printf("\n");}printf("各进程得到资源:\n");for (i=0;i<M;i++){printf("pr%d: ",i);for(j=0;j<N;j++)printf("%d,",Allocation[i][j]);//输出已分配资源数printf("\n");}printf("各进程还需求资源:\n");for (i=0;i<M;i++){printf("pr%d: ",i);for(j=0;j<N;j++)printf("%d,",Need[i][j]);//输出还需要资源数printf("\n");}}void release(int i)//判断是否安全,若不安全则释放第j类资源{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 distribute(int i)//若符合条件则对第j类资源进行分配{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];}}void safeAlgorithm()//安全性算法{int Work[3],Finish[M]={0},result[M],run;/* work:表示系统可提供给进程继续运行的所需的各类资源数目finish:表示系统是否有足够的资源分配给进程result用来存放依次执行成功的线程*/int i,j,k=0,m,demand;for(i=0;i<3;i++){Work[i]=Avaliable[i]; //开始的时候work=available}for(i=0;i<M;i++){demand=0;for(j=0;j<N;j++){if (Finish[i]==False&&Need[i][j]<=Work[j]){ demand++;if(demand==3)//只有ABC三类资源都满足才把相应的线程记入数组result中{for(m=0;m<N;m++)Work[m]=Work[m]+Allocation[i][m];//重新分配第i 类线程的当前可利用资源Finish[i]=True;result[k]=i;i=-1;k++;}}elseif(Finish[i]==False){if(i==M-1){printf("系统不安全\n");//如果不成功,输出系统不安全run=False;}break;}}printf("系统资源分配成功!");//如果安全,输出成功printf("分配的序列:\n");for(i=0;i<M;i++)//输出运行进程数{printf("pr%d ",result[i]);}}void bankerAlgorithm()//利用银行家算法对申请资源对进行判定{int i,j,OK=1,run=True;printf("\n请输入第一个要求分配的资源进程号从(0 to 4):");scanf("%d",&i);//输入须申请的资源号printf("请输入进程 %d 申请的资源:\n",i);for(j=0;j<3;j++){printf("第 %d 个资源:",j+1);scanf("%d",&Request[j]);//输入需要申请的资源}for (j=0;j<N;j++){if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错{printf("进程%d 申请的资源大于它需要的资源",i);printf(" error!\n");OK=0;break;}else{if(Request[j]>Avaliable[j]) //判断申请是否大于当前资源,若大于则出错{printf("进程 %d 申请的资源大于当前可利用资源",i);printf(" error!\n");OK=0;break;}}}if(OK==1) //若都符合条件,则进行分配{distribute(i); //根据进程请求分配资源showdata(); //显示变换后的资源safeAlgorithm(); //通过安全算法判断该序列是否安if(run==False) //若不安全,则进行释放第I类资源release(i);}}}void main()//主函数{int choice;showdata();safeAlgorithm();do{ printf("\n输入接下来你要进行的操作1:分配资源 2:显示资源否则按任意键退出");scanf("%d",&choice);switch(choice){ case 1: bankerAlgorithm(); break;case 2: showdata(); break;default: break;}}while((choice==1)||(choice==2));}4 测试数据与实验结果(可以抓图粘贴)5 结果分析与实验体会(学生自己填写)2. 版面格式:(1)各级标题:黑体,小四,段前/段后:6磅(2)正文内容:宋体、五号,行间距1.25倍;(3)程序代码:宋体、五号,单倍行间距;(4)A4纸,上、下、左、右边距:2厘米注:蓝色字体部分为注释,正式报告中将其删除。
银行家算法实验报告 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计: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)。
银行家算法实验报告关键字:银行家算法、安全状态、不安全状态、向量矩阵、进程、死锁、资源、就绪状态、执行状态、阻塞状态;一实验名称进程同步互斥问题二实验目的2.1切实加深对进程死锁的认识;2.2正确理解系统的安全状态与不安全状态;2.3更进一步地理解和掌握银行家算法;三实验要求3.1将本实验分成两个阶段,第一阶段实现系统安全性检测算法;第二阶段实现银行家算法;3.2要求用户能自主地输入不同的向量矩阵;3.3你的程序能正确输出不同的运算结果;3.4你的程序应具备良好的容错能力;3.5力求用户界面的简洁美观;四实验原理4.1 进程及进程死锁;4.1.1 进程:是操作系统中最基本、最重要的概念,但直到目前还没有一个统一的定义,下面通过能反映进程实质的几点描述来认识进程:①进程是程序的一次执行;②进程是可以和别的计算并发执行的计算;③进程是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位;④进程是一个具有一定功能的程序关于某个数据集合的一次运行活动。
进程具有几个基本的特征:动态性、并发性、独立性、异步性;每个进程通常由程序段、数据段和进程控制块三部分组成,其中进程控制块能唯一标识一个进程。
进程执行时间的间断性,决定了进程可能具有多种状态。
事实上,运行中的进程至少具有以下三种基本状态:就绪状态:进程已获得除处理机以外的所有资源,一旦分到了处理机就可以立即执行,这时进程所处的状态为就绪状态;执行状态:又称运行状态。
当一个进程获得必要的资源,并占有处理机,即在处理机上运行,此时进程所处的状态为执行状态;阻塞状态:又称等待状态,正在执行的进程,由于发生了某事件而暂时无法执行下去(如等待输入/输出完成),此时进程所处的状态称为阻塞状态。
进程并非固定处于某一状态,它随着自身的推进和外界条件的变化而发生变化。
4.1.2 进程死锁进程死锁是因多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都无法向前推进。
实验二银行家算法实验
一、实验目的
银行家算法是避免死锁的典型算法,通过编写一个简单的银行家算法程序,深入理解进程死锁、避免死锁、进程的安全状态和不安全状态等概念,掌握银行家算法和安全性测试算法。
二、实验要求
要求设计5个进程,共享系统的3类独占资源,各进程动态进行资源申请和释放。
设计一个资源分配程序,程序运行时用户首先输入各类资源总数,各个进程对各类资源的最大需求量,目前已分配的量,程序分析系统目前的安全性。
然后用户输入请求资源的进程号和对各类资源的请求量,程序运用银行家算法和安全性测试算法,决定是否进行资源分配。
计算机操作系统实验报告何美西109253030212一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计: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)。
操作系统课程设计题目一:实现生产者消费者问题题目二:银行家算法的实现一、实验题目解决生产者-消费者问题二、设计内容有界缓冲区内设有10个存储单元,放入/取出的数据项设定为1~10这10个整形数。
要求每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者标识符三、开发环境LINUX环境,工具为VI编辑器。
四、分析设计(一)实验原理使用的生产者和消费者模型具有如下特点:(1)本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。
生产者可以把产品放到目前某一个空缓冲区中。
(2)消费者只消费指定生产者的产品。
(3)在测试用例文件中指定了所有的生产和消费的需求,只有当共享缓冲区的数据满足了所有关于它的消费需求后,此共享缓冲区才可以作为空闲空间允许新的生产者使用。
(4)本实验在为生产者分配缓冲区时各生产者间必须互斥,此后各个生产者的具体生产活动可以并发。
而消费者之间只有在对同一产品进行消费时才需要互斥,同时它们在消费过程结束时需要判断该消费对象是否已经消费完毕并清除该产品。
Windows 用来实现同步和互斥的实体。
在Windows 中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex)、临界段(CriticalSection)和事件(Event)等。
本程序中用到了前三个。
使用这些对象都分为三个步骤,一是创建或者初始化:接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。
这些同步对象在一个线程中创建,在其他线程中都可以使用,从而实现同步互斥。
当然,在进程间使用这些同步对象实现同步的方法是类似的。
1.用锁操作原语实现互斥为解决进程互斥进人临界区的问题,可为每类临界区设置一把锁,该锁有打开和关闭两种状态,进程执行临界区程序的操作按下列步骤进行:①关锁。
先检查锁的状态,如为关闭状态,则等待其打开;如已打开了,则将其关闭,继续执行步骤②的操作。
实验二银行家算法一、目的:加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效地防止和避免死锁的发生。
二、内容:银行家算法是避免死锁的一种重要方法,本实验要求编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
三、编程思想:首先分析银行家算法的数据结构,分析可利用资源向量Available、最大需求矩阵Max、分配矩阵Allocation、需求矩阵Need 、进程申请资源的关系,由所学知识可知;Need[i,j]=Max[I,j]—Allocation[i,j];当进程申请资源的时候;a)Request i>Need[i]。
这种情况表示该进程的资源需求已超过系统所宣布的最大值,出错。
b)Request i=Need[i]。
这种情况表示该进程现在对他所需的全部资源一次申请完成。
c)Request i〉Need[i]。
这种情况表示该进程现在对它所需资源再进行部分的申请,剩余的资源以后再次申请。
发出资源请求后;当进程pia)如果Request i<=Need[i],转向步骤b,否则显示为出错,因为所需的资源数超过事先要求的最大值。
b)Request i<=Available,便转向步骤三,否则则表示尚无足够资源,p i需等待。
c)假如系统将资源分配给p i 则:Available=Available—RequestiAllocation[i]=Allocation[i]+RequestiNeed[i]=Need[i]-Request安全性算法检查(1)设置向量:工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work[]= Available[]。
Finish[],它表示系统是否有足够的资源分配给每个进程,使之运行完成。
实验四银行家算法
一、实验目的
1.理解死锁避免相关内容;
2.掌握银行家算法主要流程;
3.掌握安全性检查流程。
操作系统中的死锁避免部分的理论进行实验。
要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。
二、实验设备
PC机、windows 操作系统、VC++6.0
三、实验要求
本实验要求3学时完成。
1.设计多个资源(≥3);
2.设计多个进程(≥3);
3.设计银行家算法相关的数据结构;
4.动态进行资源申请、分配、安全性检测并给出分配结果。
5.撰写实验报告,并在实验报告中画出银行家算法和和安全性检查算法流程图。
四、预备知识
死锁避免定义:在系统运行过程中,对进程发出的每一个资源申请进行动态检查,并根据检查结果决定是否分配资源:若分配后系统可能发生死锁,则不予分配,否则予以分配。
由于在避免死锁的策略中,允许进程动态地申请资源。
因而,系统在进行资源分配之前预先计算资源分配的安全性。
若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。
其中最具有代表性的避免死锁算法是银行家算法。
1 系统安全状态
1)安全状态
所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{ P1 ,P2 …Pn}就是安全序列。
如果存在
这样一个安全序列,则系统是安全的。
并非所有的不安全状态都会转为死锁状态,但当系统进入不安全状态后,便有可能进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态。
所以避免死锁的实质:系统在进行资源分配时,如何使系统不进入不安全状态。
2)安全状态之例
假设系统有三个进程,共有12台磁带机。
各进程的最大需求和T0时刻已分配情况如下表:
答:T0时刻是安全的,因为存在安全序列:P2 →P1→ P3
不安全序列:P1→…
P3→…
P2→P3→P1
3)由安全状态向不安全状态的转换
如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。
例如,在T0时刻以后,P3又请求1台磁带机,若此时系统把剩余3台中的1台分配给P3,则系统便进入不安全状态。
因为,此时也无法再找到一个安全序列,例如,把其余的2台分配给P2,这样,在P2完成后只能释放出4台,既不能满足P1尚需5台的要求,也不能满足P3尚需6台的要求,致使它们都无法推进到完成,彼此都在等待对方释放资源,即陷入僵局,结果导致死锁。
2 利用银行家算法避免死锁
1)银行家算法中的数据结构
①可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该
类资源的分配和回收而动态地改变。
如果Available[j]=K,则表示系统中现有Rj类资源K个。
②最大需求矩阵Max。
最大需求矩阵Max。
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i 需要Rj类资源的最大数目为K。
③分配矩阵Allocation
这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得R j 类资源的数目为K。
④需求矩阵Need
这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
Need[i,j]=Max[i,j]-Allocation[i,j]2)银行家算法
设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi 需要K个Rj类型的资源。
当Pi发出资源请求后,系统按下述步骤进行检查:
(1) 如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2) 如果Requesti[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,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等待。
银行家算法的参考流程图如下:
3)安全性算法
(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.设计并编写银行家算法模拟程序。
2.在上机环境中输入程序,调试,编译。
3.设计输入数据,写出程序的执行结果。
4.根据具体实验要求,撰写好实验报告,提交到天空教室。