操作系统课程设计报告—银行家算法
完整word版计算机操作系统银行家算法实验报告

计算机操作系统实验报告实验名称:银行家算法实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:(1)如果Requestk or二Need则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request or二Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available二Available-Request[i];Allocatio n=Allocatio n+Request;Need二Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:(1)设置两个向量①工作向量Work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work二Allocati on;②布尔向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时, 令Finish[i]=true(2)从进程集合中找到一个能满足下述条件的进程:① Fin ish[i]=false② Need<or二Work如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work二Work+Allocatio n;Fini sh[i]=true;转向步骤(2)。
操作系统实验报告----银行家算法

操作系统实验报告----银行家算法班级:______计算机03(7)班______________ 姓名:_________李君益__________________ 学号:______________(61号)___提交日期:____06.7.11___________________ 指导老师: ______林穗____________________一、设计题目加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。
二、设计要求内容:编制银行家算法通用程序,并检测思考题中所给状态的安全性。
要求:(1)下列状态是否安全?(三个进程共享12个同类资源)进程已分配资源数最大需求数1 1 4 (状态a)2 4 43 5 81 1 42 4 6 (状态b)3 6 8(2)考虑下列系统状态分配矩阵最大需求矩阵可用资源矩阵0 0 1 2 0 0 1 2 1 5 2 01 0 0 0 1 7 5 01 3 5 423 5 60 6 3 2 0 6 5 20 0 1 4 0 6 5 6问系统是否安全?若安全就给出所有的安全序列。
若进程2请求(0420),可否立即分配?三、设计分析一.关于操作系统的死锁1.死锁的产生计算机系统中有许多独占资源,他们在任一时刻只能被一个进程使用,如磁带机,绘图仪等独占型外围设备,或进程表,临界区等软件资源。
两个进程同时向一台打印机输出将导致一片混乱,两个进程同时进入临界区将导致数据库错误乃至程序崩溃。
正因为这些原因,所有操作系统都具有授权一个进程独立访问某一辞源的能力。
一个进程需要使用独占型资源必须通过以下的次序:●申请资源●使用资源●归还资源若申请施资源不可用,则申请进程进入等待状态。
对于不同的独占资源,进程等待的方式是有差别的,如申请打印机资源、临界区资源时,申请失败将一位这阻塞申请进程;而申请打开文件文件资源时,申请失败将返回一个错误码,由申请进程等待一段时间之后重试。
操作系统实验报告-银行家算法5页word

南昌大学实验报告---(3)编程实现银行家安全算法学生姓名:张虹学号:6100409033 专业班级:电Ⅲ091班实验类型:□验证■综合□设计□创新实验日期:实验成绩:一、实验目的通过实验加强对银行家安全算法的理解和掌握。
二、实验内容熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。
三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤1、分析银行家算法结构;2、画出银行家算法的流程图,即设计说明;3、根据画出的流程图使用C语言编写相应的代码(代码过长,放到最后);程序主要由main函数和以下几个函数组成:void input();用户输入银行家算法的初始数据;void output();输出当前系统资源分配情况;void change();当请求资源满足要求时,进行分配,系统资源发生改变;int check();安全性算法,检查是否存在安全序列;void outputsafe();输出安全序列的资源分配表。
4、检查代码,将编出的代码编译、链接,验证其正确性。
五、实验数据及处理结果六、实验体会或对改进实验的建议体会:编写银行家算法需要较好分析能力,C语言也要掌握的很好,而且需要细心和极大地耐心。
我的程序在最开始编出来的第一份代码编译时大大小小一堆错误,有些是一个小错误导致了下面全错,这些小错误在一百多行里找起来非常费劲。
然后小错误全部找出来以后,再编译,错误没有了,但是得到的结果却是错误的,这样又要开始一行一行分析,看是哪里出了问题。
到最后得到了想要的结果以后,程序还需要修饰,至少要输出要简洁明朗,要让别人一运行这个程序就知道自己在什么时候该输入什么数据,数据是什么作用,而不是只有自己知道输进去的是什么东西。
七、参考资料《计算机操作系统》《C程序设计》《C语言程序设计_现代方法》八、实验代码#include <stdio.h> //本实验中使用到的库函数#include <stdlib.h>#include <string.h>int max[5][3]; //开始定义银行家算法中需要用到的数据int allocation[5][3];int need[5][3];int available[3];int request[5][3];char *finish[5];int safe[5];int n,i,m;int k=0;int j=0;int work[3];int works[5][3];void line() //美化程序,使程序运行时更加明朗美观printf("------------------------------------------------------------------\n");void start() //表示银行家算法开始line();printf(" 银行家算法开始\n");printf(" ——Designed by Zhang Hong\n");line();void end() //表示银行家算法结束line();printf(" 银行家算法结束,谢谢使用\n");line();void input() //输入银行家算法起始各项数据for (n=0;n<5;n++)printf("请输入进程P%d的相关信息:\n",n);printf("Max:");for (m=0;m<3;m++)scanf("%d",&max[n][m]);printf("Allocation:");for (m=0;m<3;m++)scanf("%d",&allocation[n][m]);for (m=0;m<3;m++)need[n][m]=max[n][m]-allocation[n][m];printf("请输入系统可利用资源数Available:");for (m=0;m<3;m++)scanf("%d",&available[m]);void output() //输出系统现有资源情况line();printf("资源情况Max Allocation Need Available\n");printf("进程 A B C A B C A B C A B C\n");line();for(n=0;n<5;n++)printf("P%d%9d%3d%3d%5d%3d%3d%6d%3d%3d",n,max[n][0],max[n][1],max[n][2],allocation[n][ 0],allocation[n][1],allocation[n][2],need[n][0],need[n][1],need[n][2]);if (n==0)printf("%6d%3d%3d\n",available[0],available[1],available[2]);elseprintf("\n");line();void change() //当Request[i,j]<=Available[j]时,系统把资源分配给进程P[i],Available[j]和Need[i,j]发生改变for (m=0;m<3;m++)available[m]-=request[i][m];allocation[i][m]+=request[i][m];need[i][m]-=request[i][m];void outputsafe() //输出安全序列的资源分配表printf("该安全序列的资源分配图如下:\n");line();printf("资源情况Work Need Allocation Work+Allocation Finish\n");printf("进程 A B C A B C A B C A B C\n");line();for(n=0;n<5;n++)printf("P%d%9d%3d%3d%5d%3d%3d%5d%3d%3d%6d%3d%3d%12s\n",safe[n],works[safe[n]][0], works[safe[n]][1],works[safe[n]][2],need[safe[n]][0],need[safe[n]][1],need[safe[n]][2],allocation[safe[n]][0 ],allocation[safe[n]][1],allocation[safe[n]][2],works[safe[n]][0]+allocation[safe[n]][0],works[safe[n]][1]+allocation[safe[n]][1],works[safe[n]][2]+allocation[safe[n]][2],finish[n]);line();int check() //安全性算法printf("开始执行安全性算法……\n");for (m=0;m<3;m++) //数组work和finish初始化work[m]=available[m];for (n=0;n<5;n++)finish[n]="false";safe[n]=0;k=0;for (m=0;m<5;m++)for (n=0;n<5;n++)if(strcmp(finish[n],"false")==0 && need[n][0]<=work[0] && need[n][1]<=work[1] && need[n][2]<=work[2]) //查找可以分配资源但尚未分配到资源的进程safe[k]=n; //以数组safe[k]记下各个进程得到分配的资源的顺序works[safe[k]][0]=work[0];works[safe[k]][1]=work[1];works[safe[k]][2]=work[2];work[0]+=allocation[n][0]; //进程执行后释放出分配给它的资源work[1]+=allocation[n][1];work[2]+=allocation[n][2];finish[n]="ture"; //finish[n]变为1以示该进程完成本次分k++;for (m=0;m<5;m++) //判断是否所有进程分配资源完成if (strcmp(finish[m],"false")==0)printf("找不到安全序列,系统处于不安全状态。
操作系统实验报告--银行家算法

操作系统实验报告二一:实验标题:实现死锁避免算法:银行家算法。
二:实验环境:操作系统: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] 问题和想法:。
操作系统银行家算法实验报告

实验五银行家算法一、实验目的和要求①理解死锁概念,银行家算法及安全检测算法。
②在Linux操作系统下用C++进行编程。
③利用C++设计实现银行家算法的基本过程。
④验证银行家算法对于避免死锁的作用。
二、实验方法内容①算法设计思路1.设计进程对各类资源最大申请表示及初值确定。
2.设定系统提供资源初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其申请是否得到满足。
②算法流程图如下:③算法中用到的数据结构说明1. 可利用资源向量Available ,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。
其数值随该类资源的分配和回收而动态地改变。
如果Available[j]=k,标是系统中现有Rj类资源k个。
2. 最大需求矩阵P,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果P(i,j)=k,表示进程Pi需要Rj类资源的最大数目为k。
3. 分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。
如果Allocation(i,j)=k,表示进程Pi 当前已经分到Rj类资源的数目为k。
Allocation i表示进程Pi的分配向量,有矩阵Allocation的第i行构成。
4. 需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。
如果Need(i,j)=k,表示进程Pi还需要Rj类资源k个,才能完成其任务。
Need i表示进程i的需求向量,由矩阵Need的第i行构成。
上述三个矩阵间存在关系:Need(i,j)=P(i,j)-Allocation(i,j);5. Request i是进程Pi 的请求向量。
Request i(j)=k表示进程Pi请求分配Rj类资源k个。
计算机操作系统银行家算法实验报告

计算机操作系统实验报告一、实验名称:银行家算法二、实验目得:银行家算法就是避免死锁得一种重要方法,通过编写一个简单得银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会与了解死锁与避免死锁得具体实施方法。
三、问题分析与设计: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;}}程序截图:五、实验总结多个进程同时运行时,系统根据各类系统资源得最大需求与各类系统得剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。
操作系统课程设计银行家算法模拟实现
操作系统课程设计银行家算法模拟实现操作系统课程设计报告专业计算机科学与技术学生姓名班级学号指导老师完成日期信息工程学院题目:银行家算法的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后进展的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统根底理论和重要算法的理解,加强学生的动手才能。
二、设计内容 1〕概述用C或C++语言编制银行家算法通用程序,并检测所给状态的系统平安性。
1.算法介绍:数据构造:1〕可利用资向量 Available;2〕最大需求矩阵Max;3〕分配矩阵Allocation;4〕需求矩阵Need 2.功能介绍模拟实现Dijkstra的银行家算法以防止死锁的出现,分两局部组成:第一局部:银行家算法〔扫描〕;第二局部:平安性算法。
2〕设计原理一.银行家算法的根本概念 1、死锁概念。
在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资利用率,进步系统的吞吐量,但可能发生一种危险━━死锁。
所谓死锁(Deadlock),是指多个进程在运行中因争夺资而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,假设无外力作用,它们都将无法再向前推进。
一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资,因此永远无法得到的资,这种现象称为进程死锁,这一组进程就称为死锁进程。
2、关于死锁的一些结论:Ø参与死锁的进程最少是两个Ø〔两个以上进程才会出现死锁〕Ø参与死锁的进程至少有两个已经占有资Ø参与死锁的所有进程都在等待资Ø参与死锁的进程是当前系统中所有进程的子集注:假如死锁发生,会浪费大量系统资,甚至导致系统崩溃。
3、资分类。
永久性资:可以被多个进程屡次使用〔可再用资〕l 可抢占资 l 不可抢占资临时性资:只可使用一次的资;如信号量,中断信号,同步信号等〔可消耗性资〕“申请--分配--使用--释放”形式 4、产生死锁的四个必要条件:互斥使用〔资独占〕、不可侵占〔不可剥夺〕、恳求和保持〔局部分配,占有申请〕、循环等待。
操作系统实验报告-利用银行家算法避免死锁
计算机操作系统实验报告题目利用银行家算法避免死锁一、实验目的:1、加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
2、要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。
二、实验内容:用银行家算法实现资源分配:设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。
进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。
三、问题分析与设计: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。
毕业设计_操作系统原理银行家算法
操作系统课程设计报告 银行家算法
院 系: 计算机科学技术学院 2015年7月2日 操作系统原理课程设计任务书 一、题目:银行家算法 二、设计要求
(1)张金星(组长)、赵飞负责设计与实现。 (2)查阅相关资料,自学具体课题中涉及到的新知识。 (3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。 (4)所设计的程序应有输入、输出。 (5)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。总体设计应配合软件总体模块结构图来说明软件应具有的功能。详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。 三、课程设计工作量 由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。 四、课程设计工作计划 2015年6月23日,指导教师讲课,学生根据题目准备资料; 2015年6月24日,进行总体方案设计; 2015年6月25日~2015年6月29日,完成程序模块并通过独立编译; 2015年6月30日~2015年7月1日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行; 2015年7月2日~2015年7月5日,验收、撰写报告;
指导教师签章: 教研室主任签章 操作系统原理课程设计指导教师评语与成绩 指导教师评语:
课程设计表现成绩: 课程设计验收成绩: 课程设计报告成绩: 课程设计 总成绩:
指导教师签章 2015年7 月 5日 1
目录 一 概述........................................................ 2 二 总体方案设计 ................................................ 3 三 详细设计 .................................................... 4 四 程序的调试与运行结果说明 .................................... 7 五 课程设计总结 ................................................ 9 六 后记....................................................... 10 八 附录 ....................................................... 11 九 参考文献 ................................................... 18 概要设计
操作系统实验报告 银行家算法
实验四银行家算法实习内容通过编程理解银行家算法,掌握进程安全性检查的方法及资源分配的方法,加深了解有关资源申请、避免死锁等概念,体会和了解死锁和避免死锁的具体实施方法。
实习目的银行家算法是避免死锁的代表性算法。
本实习旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。
然后依照本实习,自行设计模拟程序。
实习原理算法思想:银行家算法操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。
不安全状态一定导致死锁。
实习编程思路和流程在避免死锁的方法中,如果施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
基本思想为:在分配资源之前,判断系统是否是安全的;若安全,才分配。
它是最具代表性的死锁算法,具体算法如下表示:假设进程P提出请求Request[i],则银行家算法按如下步骤进行判断:1)如果Request[i] <=Need[i],则转向2);否则出错。
2)如果Request[i] <=Available[i],则转向3);否则出错。
3)系统试探分配相关资源,修改相关数据:Available[i]=Available[i]-Request[i];Allocation[i]=Allocation[i]+Request[i];Need[i]=Need[i]-Request[i];4)系统执行安全性检查,如安全,则分配成立;否则试探性分配资源作废,系统恢复原状,进程进入等待状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
银行家算法实现 一、 概述 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,它们都将无法再向前推进。这就给计算机系统带来了问题,银行家算法就是一个避免死锁的算法。
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则给进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量;若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
二、设计目的 1、理解银行家算法; 2、掌握进程安全性检查的方法及资源分配的方法; 3、加深了解有关资源申请、避免死锁等概念; 4、体会和了解死锁和避免死锁的具体实施方法。 三、设计内容 用C++语言编写并调试一个银行家算法,简单模拟动态分配,观察死锁产生的条件,学习如何有效的防止和避免死锁的发生,掌握安全性算法。
四、开发环境:Microsoft visual C++ 6.0
五、设计思路 1、银行家算法中的数据结构 (1)、可利用资源向量Available。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available [j]= K,则表示系统中现有R类资源K个
(2)、最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程对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] 2、银行家算法 设Requesti是进程Pi的请求向量,Requesti=K表示进程Pi需要K个j类资源。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:表示系统可提供给进程继续运行所需的各类资源数目,执行安全性算法开始时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 ②; (4)、如果所有进程的finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
六、概要设计 1、主要代码: #define False 0 #define True 1 char name[50]={0};//资源名称 int Max[50][50]={0};//进程所需各类资源的最大需求 int Allocation[50][50]={0};//系统已分配资源 int Need[50][50]={0};//进程需求资源 int Available[50]={0};//系统可用资源向量 int Request[50]={0};//进程请求资源向量 int Work[50]={0};//存放系统可提供进程继续运行所需各类资源数目 int temp[50]={0};//存放安全序列 int b[50]={0};//系统各类资源总数 int M=50;//进程的最大数目为50 int N=50;//资源的最大数目为50 void display()//系统初始界面 void print()//显示资源分配情况 int changdata(int i)//进行资源分配 int safe(int num,int M,int N)//安全性算法对系统进行分析 void bank(int M,int N)//银行家算法对申请资源对进行判定 2、流程图: (1)安全性算法:
Y N Y
N Y
Y
Y N
初始化work[]数组, 使Work[j]=Available[j]; Finish[i]=false
Finish[i]==true Need[i][j]>Work[j] apply++;appy==N Finish[i]=true Work[m]+=Allocation[i][m] temp[k]=i;k++
l==m 输出安全序列 Return true 不安全Available[i]=Available[i]+Request[i];
Allocation[num][i]=Allocation[num][i]-Request[j] Need[num][i]=Need[num][i]+Request[i];
Max[num][i]=Allocation[num][i]; Allocation[num][i]=0; Available[i] = Available[i] + Allocation[num][i]; 5 / 16
(2)银行家算法: Y N N
Y 3、调试结果 请输入系统中资源的种类:3 资源1的名称和数量:a 10 资源2的名称和数量:b 5 资源3的名称和数量:c 7 请输入进程的数量:5 请输入各进程的最大需求(5*3矩阵)[Max]: 7 5 3 3 2 2 9 0 2 2 2 2 4 3 3 请输入各进程的已分配(5*3矩阵)[Allocation]: 0 1 0 2 0 0 3 0 2
输入进程号 初始化Request[]数组
REQUEST[cusneed][i]>NEED[cusneed][i] REQUEST[cusneed][i]>AVAILABLE[i]
试分配changdata() Safe() Put()输出内容 6 / 16
2 1 1 0 0 2 目前可用的资源: a b c 3 3 2 Max Allocation Need 进程名 a b c a b c a b c 0 7 5 3 0 1 0 7 4 3 1 3 2 2 2 0 0 1 2 2 2 9 0 2 3 0 2 6 0 0 3 2 2 2 2 1 1 0 1 1 4 4 3 3 0 0 2 4 3 1 系统是安全的! 分配的序列:1->3->4->0->2 请输入要求分配的资源进程号(0-4):1 请输入进程 1 申请的资源: a:1 b:0 c:2 Max Allocation Need 进程名 a b c a b c a b c 0 7 5 3 0 1 0 7 4 3 1 3 2 2 3 0 2 0 2 0 2 9 0 2 3 0 2 6 0 0 3 2 2 2 2 1 1 0 1 1 4 4 3 3 0 0 2 4 3 1 系统是安全的! 分配的序列:1->3->4->0->2 请输入要求分配的资源进程号(0-4):4 请输入进程 4 申请的资源: a:3 b:3 c:0 进程4申请的资源大于系统现在可利用的资源 分配出错,不予分配! 请输入要求分配的资源进程号(0-4):0