编程序模拟银行家算法
银行家算法模拟
项目四银行家算法模拟1.设计原理银行家算法基本原理:操作系统在每一次分配之前都要进行以下操作,判断当前的资源请求是否安全,如果安全则实施分配,否则不予分配。
第1步:操作系统对提出资源请求的进程按所请求的资源数目实施预分配,修改剩余资源数组、资源分配矩阵和剩余资源请求矩阵;第2步:将剩余资源数组代入剩余需求矩阵中与各元素进行比较,找到可以满足其所有资源需求的某个进程将它加入到安全序列中;第3步:将该进程运行结束后释放的资源累加到剩余资源数组中;第4步:再重复第2、3两步。
若所有进程都能够进入安全序列<Pi,Pj,……>,则此次分配可以实施,否则系统将会处于不安全状态,因而不能实施分配。
如果不能实施分配,则将系统还原到预分配之前的状态。
2.设计步骤和方法(1)设计数据结构:剩余资源数组available,如available[j] = k 表示资源Rj现有k个。
(2)设计数据结构:最大资源请求矩阵max,如max [i][j] = k表示进程Pi最多可申请k个类型为Rj的资源。
(3)设计数据结构:资源分配矩阵allocation,定义每个进程现在所分配的各种资源类型的数量,如allocation [i][j] = k表示进程Pi现在分配了k个类型为Rj的资源。
(4)设计数据结构:剩余资源请求矩阵claim,定义每个进程还需要的剩余的资源数,如claim [i][j] = k表示进程Pi还需要申请k个类型Rj的资源。
其中,claim [i][j] = max[i][j] -allocation[i][j]。
(5)设计函数完成功能:系统内资源总数已知、各进程对各类资源最大需求数目已知、已分配资源数目已知的前提下,某进程提出各类资源的需求量时能判断状态是否安全,以决定是否予以分配。
银行家算法的模拟实现实验报告
银行家算法的模拟实现实验报告银行家算法的模拟实现一、实验题目:模拟实现银行家算法的处理过程二、实验目的:银行家算法是避免死锁的代表性算法。
本实习旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。
然后依照本实习,自行设计模拟程序。
三、实验原理:1.我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源。
当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2. 安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。
不安全状态一定导致死锁。
安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
3. 设requesti为进程p[i]的请求向量,如果requesti[j]=K,表示进程p[i]需要K个Rj资源。
当系统发出请求后,系统按下述步骤开始检查:1)如果requesti[j]<=need[i][j],转向步骤2;否则报告出错,申请的资源已经大于它需要的最大值。
2)如果requesti[j]<=available[j],转向步骤3;否则报告出错,尚无足够的资源。
3)系统试探着把资源分配给p[i],并修改下列数据结构中的值:available[j]=available[j]-request[j]allocation[i][j]=allocation[i][j]+request[j]need[i][j]=need[i][j]-request[j]4)系统进行安全性算法,检查此次分配后,系统是否还处于安全状态,若安全,把资源分配给进程p[i];否则,恢复原来的资源分配状态,让进程p[i]等待。
编程序模拟银行家算法
武汉理工大学华夏学院课程设计报告书课程名称:操作系统原理题目:编程序模拟银行家算法系名:信息工程系专业班级:软件1121姓名:钟伟学号:10212812120指导教师:苏永红2014年 6 月13 日武汉理工大学华夏学院信息工程系课程设计任务书课程名称:操作系统原理课程设计指导教师:苏永红班级名称:软件1121 开课系、教研室:软件与信息安全一、课程设计目的与任务操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。
学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。
二、课程设计的内容与基本要求1、课程设计题目编程序模拟银行家算法2、课程设计内容本课程设计要求在Linux操作系统,GCC编译环境下开发。
银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。
银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
3、设计报告撰写格式要求:1设计题目与要求 2 设计思想3系统结构 4 数据结构的说明和模块的算法流程图5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)7 自我评价与总结8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;三、课程设计步骤及时间进度和场地安排本课程设计将安排在第17周, 教育技术中心。
c语言银行家算法
c语言银行家算法在C语言中实现银行家算法,首先需要了解该算法的基本概念和原理。
银行家算法是一种避免死锁的资源分配算法,它模拟了银行贷款的过程。
当一个进程请求资源时,系统先检查分配后是否安全,如果是,则分配资源。
否则,进程必须等待,直到足够的资源可用。
以下是一个简单的银行家算法的C语言实现:```c#include <stdio.h>#define MaxProcs 5#define MaxResources 3int Allocation[MaxProcs][MaxResources] = {0};int Max[MaxProcs][MaxResources] = {0};int Allocation[MaxProcs][MaxResources] = {0};int Available[MaxResources] = {0};int Need[MaxProcs][MaxResources] = {0};int Work[MaxResources] = {0};int safeSeq[MaxProcs] = {0};int count = 0;void calcNeed() {for (int p = 0; p < MaxProcs; p++) {for (int r = 0; r < MaxResources; r++) {Need[p][r] = Max[p][r] - Allocation[p][r];}}}void checkSafe() {int finish[MaxProcs] = {0};int k, j;for (k = 0; k < MaxProcs; k++) {safeSeq[k] = -1;}while (count < MaxProcs) {for (k = 0; k < MaxProcs; k++) {if (finish[k] == 0) {for (j = 0; j < MaxResources; j++) {if (Need[k][j] > Work[j]) {break;}}if (j == MaxResources) {for (j = 0; j < MaxResources; j++) {Work[j] += Allocation[k][j];safeSeq[count++] = k;finish[k] = 1;}}}}}if (count == MaxProcs) {printf("系统是安全的\n");} else {printf("系统是不安全的\n");}}```。
银行家算法 C++模拟OS
OS模拟银行家算法分享一下最近的劳动成果,事无巨细,勿以细小而不为。
1:作业流程1.1 阅读算法,得出问题的求解方法;1.2 作程序流程图;1.3 构造所需的数据模型;1.4 开始敲代码啦,伴随着漫长的纠错排错调试过程,当error:100变成error:0的时候会很爽;1.5 功能基本实现了,可以再完善一下,美化一下界面;1.6 测试程序:回归测试,黑盒测试各种测试,代码写得好,测试要求就可以相对严格一些;1.7 通过测试一般就算完成作业了,其实还可以写一些相关的文档。
在Readme中写一些开发总结,用户帮助,修复bug和改进方案等信息。
2:银行家算法程序实现流程图:3:bankers_ALG.cpp CODE:--------------------------------------------------------------------------------------------------------------------------------------------------#include<iostream>using namespace std;int *one_array_malloc(int n); //一维数组分配int **two_array_malloc(int n,int m); //二维数组分配int compare21(int b,int m,int **Li,int *Bi);//向量比较函数=0->Li<=Bi Li是二维数组int compare11(int b,int m,int *Li,int *Bi);//向量比较函数=0->Li<=Bi Li是一维数组int compare12(int b,int m,int *Li,int **Bi);//向量比较函数=0->Li<=Bi Li是一维数组void print(int n,int m,int **Max,int **Allocation,int **Need,int *Available);//输出函数void print_space(int n);//输出n个空格函数int security_check(int n,int m,int *xl,int *work,int **Allocation,int **Need,int *Available);//安全性检查函数void allocation(int b,int m,int *Request,int *Available_temp,int **Allocation_temp,int **Need_temp);//试分配void copy1(int n,int *s1,int *s2);//转储函数s2->s1 一维数组void copy2(int n,int m,int **s1,int **s2);//转储函数s2->s1 二维数组int in(int n,int i,int *xl);//判断进程是否在安全序列中void main(){int n,m,i,j;int *Available,*xl; int **Max;int **Allocation;int **Need;FILE *fp;if((fp=fopen("input53.txt","r"))==NULL){printf("cannot open this file!\n");return;}fscanf(fp,"%d%d",&n,&m);Available=one_array_malloc(m);xl=one_array_malloc(n);Max=two_array_malloc(n,m);Allocation=two_array_malloc(n,m);Need=two_array_malloc(n,m);for(i=0;i<m;i++){fscanf(fp,"%d",&Available[i]);}for(i=0;i<n;i++)for(j=0;j<m;j++){fscanf(fp,"%d",&Max[i][j]);}for(i=0;i<n;i++)for(j=0;j<m;j++){fscanf(fp,"%d",&Allocation[i][j]);Need[i][j]=Max[i][j]-Allocation[i][j];}fclose(fp);print(n,m,Max,Allocation,Need,Available);int *work,*Request;int *Available_temp,**Allocation_temp,**Need_temp;int jc,p; work=one_array_malloc(n);Available_temp=one_array_malloc(m);Allocation_temp=two_array_malloc(n,m);Need_temp=two_array_malloc(n,m);copy1(m,Available_temp,Available);copy2(n,m,Allocation_temp,Allocation);copy2(n,m,Need_temp,Need);Request=one_array_malloc(n);if(security_check(n,m,xl,work,Allocation,Need,Available)==0)cout<<"载入数据正确,系统处于安全状态。
操作系统实验六(编程模拟实现银行家算法)
实验六编程模拟实现银行家算法(综合性编程实验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("系统不安全!");} }。
银行家算法模拟实现
操作系统课程设计报告专业计算机科学与技术学生姓名班级计算机科学与技术学号指导教师完成日期2014.3.20题目:银行家算法的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计内容1)概述用C或C++语言编制银行家算法通用程序,并检测所给状态的系统安全性。
1.算法介绍:数据结构:1)可利用资源向量 Available;2)最大需求矩阵Max;3)分配矩阵Allocation;4)需求矩阵Need2.功能介绍模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:第一部分:银行家算法(扫描);第二部分:安全性算法。
2)设计原理一.银行家算法的基本概念1、死锁概念。
在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。
所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
2、关于死锁的一些结论:参与死锁的进程最少是两个(两个以上进程才会出现死锁)参与死锁的进程至少有两个已经占有资源参与死锁的所有进程都在等待资源参与死锁的进程是当前系统中所有进程的子集注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。
3、资源分类。
永久性资源:可以被多个进程多次使用(可再用资源)可抢占资源不可抢占资源临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等(可消耗性资源)“申请--分配--使用--释放”模式4、产生死锁的四个必要条件:互斥使用(资源独占)、不可强占(不可剥夺)、请求和保持(部分分配,占有申请)、循环等待。
实验七(银行家算法的仿真)
实验七银行家算法的仿真实现1.实验目的:模拟实现银行家算法,用银行家算法实现资源分配。
2.实验内容:设计程序实现进程可动态地申请资源和释放资源。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;动态分配资源后显示进程是否能够分配。
3.参考程序设计说明:参考算法的实现1)初始化由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
2)银行家算法在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
设进程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)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3)安全性检查算法(1)设置两个工作向量Work=AVAILABLE;FINISH(2)从进程集合中找到一个满足下述条件的进程,FINISH==false;NEED<=Work;如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
操作系统课程设计模拟银行家算法避免死锁
模拟通过银行家算法避免死锁一、银行家算法产生(de)背景及目(de)1:在多道程序系统中,虽然借助于多个进程(de)并发执行来改善系统(de)利用率,提高系统(de)吞吐量,但可能发生一种危险—死锁.死锁就是多个进程在运行过程中因争夺资源而造成(de)一种僵局,当进程处于这种僵局状态时,如无外力作用,他们将无法再向前进行,如再把信号量作为同步工具时,多个Wait和Signal操作顺序不当,会产生进程死锁.然而产生死锁(de)必要条件有互斥条件,请求和保持条件,不剥夺条件和环路等待条件.在预防死锁(de)几种方法中,都施加了较强(de)限制条件,在避免死锁(de)方法中,所施加(de)条件较弱,有可能获得令人满意(de)系统性能.在该方法中把系统(de)状态分为安全状态和不安全状态,只要能使系统都处于安全状态,便可避免死锁.2:实验目(de):让学生独立(de)使用编程语言编写和调试一个系统分配资源(de)简单模拟程序,了解死锁产生(de)原因及条件.采用银行家算法及时避免死锁(de)产生,进一步理解课堂上老师讲(de)相关知识点.银行家算法是从当前状态出发,逐个按安全序列检查各客户中谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作(de)客户.如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全(de).二:银行家算法中(de)数据结构1:可利用资源向量Available.这是一个含有m个元素(de)数组,其中(de)每个元素代表一类可利用(de)资源数目,其初始值是系统中所配置(de)该类全部可用资源(de)数目,其数值随该类资源(de)分配和回收而动态(de)改变.如果Available[j]=k,z则表示系统中现有Rj类资源K 个.2:最大需求矩阵Max.这是一个nm(de)矩阵,它定义了系统中n个进程中(de)每一个进程对m类资源(de)最大需求.如果Max[i,j]=k,表示第i个进程需要第Rj类资源(de)最大数目k个.3: 分配矩阵Allocation,也是nm(de)矩阵,若Allocation[i,j]=k,表示第i个进程已分配Rj类资源(de)数目为k个.4:需求矩阵Need.也是一个nm(de)矩阵,Need[i,j]=k,表示第i个进程还需Rj类资源k个.三、银行家算法及安全性算法1:银行家算法设Request[i]是进程Pi(de)请求向量,若Request[i][j]=k;表示进程需要j类资源k个.当Pi发出资源请求时,系统按下属步骤进行检查;(1)如果Request[i][j]<=Need[i][j];便转向步骤(2),否则认为出错,因为它所需要(de)资源数已超过他所宣布(de)最大值.(2)如果Request[i][j]<=Available[i][j],便转向步骤(3),否则认为尚无足够资源,进程需等待.(3)系统试探着把资源分配给进程,并修改下面数据结构(de)数据Available[i][j]=Available[i][j]-Request[i][j];Allocation[i][j]=Allocation[i][j]+Request[i][j];Need[i][j]=Need[i][j]-Request[i][j];(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态.若安全,才正式将资源分配给进程Pi,已完成此次分配.否则,将本次(de)试探分配作废,回复原来(de)资源分配状态,将进程Pi等待.2:安全性算法(1)设置两个向量;1:工作向量Work,表示系统可提供给进程运行所需(de)各类资源数目,它含有m个元素,初始时Work=Available2:Finish ,表示系统是否有足够(de)资源分配给进程,使之运行完成.开始时先做Finish[i]=true(2)从进程中找到一个能满需下属条件(de)进程1;Finish[i]=false;2:Need[i][j]<=Work[j];若找到执行步骤(3),否则执行步骤(4)(3)当进程Pi顺利获得资源后,直至完成,并释放分配给它(de)资源,执行:Work[j]=Work[j]+Allocation[i][j];Finish[i]=true;Go to step (2);(5)如果所有(de)进程Finish[i]都满足,则表示系统处于安全状态,否则,处于不安全状态.四、模块设计与分析及整体功能概述模块设计与分析:整个银行家算法分为初始化函数Init(),安全性算法函数 safe(),银行家算法函数bank()三部分.初始化函数生成开始时刻系统中(de)进程和资源情况,安全性算法判断当某进程申请资源时,系统能否处于安全状态.在本实验中,若系统处于安全状态,便生成一个安全进程序列(安全序列可能有多个).银行家算法函数bank()负责整体(de)检查与异常判断.整体功能概述:死锁会引起系统陷入僵局,操作系统必须防止此现象(de)发生.本实验通过一个动态分配资源(de)模拟程序,更清楚(de)理解死锁产生(de)原因和条件.Dijkstra(de)银行家算法是最有代表性(de)避免死锁(de)方法.运行程序时用户设定系统中进程和可利用资源(de)种类数目.输入各进程(de)可利用资源Available,最大需求MAX,已分配资源Allocation ,需求资源Need,之后各系统发出资源请求Request,利用实验中(de)安全性算法判断能否产生一个安全性队列,若能,则给该进程分配成功,否则,不予分配.五、流程图设计六、源代码及调试分析include<>define MAXm 50用Vc++编译程序编写银行家算法,进一步理解到通过银行家算法避免死锁(de)思想,同时也理解了系统死锁产生(de)原因及条件.2.在实验过程中所有(de)设计步骤遵循老师教授(de)程序功能化(de)思想,分别定义了三个函数,init()初始化函数,safealg()安全性算法函数,bank()银行家算法函数,体现了函数(de)模块化思想.这样(de)话,不仅提高了程序(de)可读性和可操作性,而且还提高了CPU(de)利用率和内存(de)利用率,因为程序(de)运行是局部性(de),这种思想对于段页式存储管理系统尤为重要.3.实验过程中遇到(de)种种疑难问题通过自己上网查找答案,锻炼了自己纠错能力和搜索有价值信息(de)能力及自学(de)能力,并且进一步巩固了自己以前学过(de)专业知识.。
编程序模拟银行家算法1
武汉理工大学华夏学院课程设计报告书课程名称:操作系统原理题目:编程序模拟银行家算法系名:信息工程系专业班级:计算机1111班姓名:学号: 10210411131 指导教师:苏永红2013 年 6 月 28 日课程设计任务书学生姓名:专业班级:计算机1111班指导教师:苏永红工作单位:信息工程系设计题目:编程序模拟银行家算法初始条件:Linux操作系统,GCC编译环境要求完成的主要任务:主要任务:银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。
银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
设计报告撰写格式要求:1设计题目与要求 2 设计思想3系统结构 4 数据结构的说明和模块的算法流程图5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)7 自我评价与总结 8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;时间安排6月24日布置课程设计任务;分配题目后,查阅资料、准备程序;6月 25~6月27 日上机调试程序、书写课程设计报告;6月28 日提交课程设计报告及相关文档。
指导教师签字:2013年6月28日系主任签字:2013年6月28日目录1设计题目与要求 (4)1.1设计题目 (4)1.2要求完成的任务 (4)1.3主要任务 (4)1.4提示 (4)2设计思路 (5)2.1算法思路 (5)2.2银行家算法 (5)3系统结构 (5)3.1主要用到的数据结构 (5)3.2程序模块 (5)3.3各模块间的调用关系 (6)4数据结构的说明和模块的算法流程图 (6)4.1数据结构说明 (6)4.1算法流程图 (7)5使用说明 (9)6测试结果截图 (10)6.1开始界面 (10)6.2输出界面 (10)7自我评价与总结 (14)8参考文献 (15)9附录:程序清单 (16)1设计题目与要求1.1设计题目编程序模拟银行家算法1.2要求完成的任务银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。
实验二 银行家算法模拟
实验二银行家算法模拟实验学时:2实验类型:设计实验要求:必修一、实验目的(1)进一步理解利用银行家算法避免死锁的问题;(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。
(3)理解和掌握安全序列、安全性算法二、实验内容(1)了解和理解死锁;(2)理解利用银行家算法避免死锁的原理;(3)会使用某种编程语言。
三、实验原理(一)安全状态指系统能按照某种顺序如<P1,P2,…,Pn>(称为<P1,P2,…,Pn>序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。
(二)银行家算法假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。
系统按下述步骤进行安全检查:(1)如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。
(2)如果Requesti≤Available则继续以下检查,否则显示系统无足够资源,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等待。
(三)安全性算法(1)设置两个向量:①工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m 个元素,在执行安全算法开始时,Work∶=Available;② Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。
银行家算法模拟实验
银行家算法模拟实验(总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;}四、程序运行结果五、实验体会通过这次实验,我学会了银行家算法有原理,并用自己已学的知识,结合书本完成了此次实验,收获蛮大。
实验三银行家算法实验报告
实验三银行家算法实验报告一、实验目的银行家算法是一种用于避免死锁的算法,本次实验旨在通过编程实现银行家算法,并通过模拟银行家算法的运行过程来加深对该算法的理解。
二、实验过程及结果1. 系统设计为了模拟银行家算法的运行过程,需要设计一个包含多个进程和资源的系统。
每个进程都有一定的最大需求资源数和已分配资源数。
系统中还有一定数量的可用资源,进程可以请求资源和释放资源。
2. 算法实现在程序中实现银行家算法需要以下几个关键的函数:(1)银行家算法的主函数:实现进程的请求资源和释放资源操作,并在此过程中判断是否产生死锁;(2)安全检查函数:用于判断系统状态是否安全,即是否存在一个安全序列,如果存在则表示系统处于安全状态,否则表示系统处于不安全状态;(3)资源请求函数:用于进程请求资源的操作,根据银行家算法的要求进行判断;(4)资源释放函数:用于进程释放资源的操作。
3. 算法运行通过对编写的程序进行多次运行测试,模拟不同进程对资源的请求和释放,观察系统是否能够始终处于安全状态。
在每次运行中,记录并输出系统的安全序列和进程的状态等信息。
4. 实验结果分析通过实验运行结果的分析,可以得出以下结论:(1)银行家算法能够有效地避免死锁的发生;(2)系统中资源的分配和释放过程需要合理,否则可能导致系统陷入死锁;(3)资源的分配策略对系统的安全状态有重要影响。
三、实验总结通过本次实验,深入了解了银行家算法的原理和实现过程,并通过编程实践加深了对该算法的理解。
银行家算法是一种重要的死锁避免算法,能够保证系统处于安全状态下运行,并且能够合理地分配系统资源,避免系统陷入死锁。
四、参考文献[1] 《操作系统概念》,Abraham Silberschatz,Peter B. Galvin,Greg Gagne,电子工业出版社,2014年五、附录(示例代码省略)以上是本次实验的实验报告,通过实验我们深入了解了银行家算法,了解了它在操作系统中的应用和重要性。
实验3 银行家算法
实验三银行家算法一、实验目的模拟银行家算法,用银行家算法实现资源分配二、实验内容写程序用银行家算法判断系统能否将资源分配给它;(2)若进程P2提出请求Request(0,1,0),用银行家算法程序验证系统能否将资源分配给它。
#include<stdio.h>#include<string.h>#define RESOURCE 3#define PRO 5class Process{public :int max[RESOURCE];int allocation[RESOURCE];int need[RESOURCE];int request[RESOURCE];//对资源第一次分配void Inital(int index,int allo,int n){allocation[index] = allo;need[index] = n;}//某个进程需要资源void Request(int index,int req){request[index] = req;}};//检测安全性bool Safe(int work[],Process pro[]){bool finish[PRO];for(int i=0;i<PRO;i++){finish[i] =false;}int j=0; //用来表示资源下标int k=0;int index[PRO];for(i=0;i<PRO-1;i++){for(int m=0;m<PRO;m++){if(work[j] >= pro[m].need[j] && work[j+1] >= pro[m].need[j+1]&& work[j+2] >= pro[m].need[j+2] && finish[m] == false){finish[m] = true;index[k++] = m;for(int j=0;j<RESOURCE;j++){work[j] = work[j] + pro[m].allocation[j];}}}for(i=0;i<PRO;i++){if(finish[i] ==false){printf("该申请资源数量不合法,不存在安全序列~\n");return false;}}printf("该进程申请的资源数量合法,其安全序列为:\n{");for(i=0;i<PRO;i++){{printf(" p%d;",index[i]);}}printf("}\n");return true;}//用来比较所申请的资源是否满足要求bool Compare(int index,int avaliable[],Process pro[]){for(int i=0;i<RESOURCE;i++){if(pro[index].need[i] < pro[index].request[i] || avaliable[i] < pro[index].request[i])return false;}return true;}//void Require(int index, bool check,int avaliable[], Process pro[]){if(check == false){printf("第一次分配资源造成死锁,不合理。
实验2 银行家算法
实验2 银行家算法(2学时)一、实验目的理解银行家算法,掌握进程安全性检查的方法及资源分配的方法。
二、实验内容编写程序实现银行家算法,并验证程序的正确性。
三、实验要求编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
例子:某系统有A、B、C、D 4类资源共5个进程(P0、P1、P2、P3、P4)共享,各进程对资源的需求和分配情况如下表所示。
现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:(1)现在系统是否处于安全状态?(2)如果现在进程P1提出需求(0、4、2、0)个资源的请求,系统能否满足它的请求?#include <stdio.h>//#include <tchar.h>#include <iostream>using namespace std;#define Maxprocess 50 /*最大进程数*/#define Maxresource 100 /*最大资源数*/int Available[Maxresource]; /*可用资源数组*/int MAX[ Maxprocess][Maxresource]; /*最大需求矩阵*/int Allocation[ Maxprocess][Maxresource]; /*分配矩阵*/int need [Maxprocess][Maxresource]; /*需求矩阵*/int Request[Maxprocess][Maxresource]; /*进程需要资源数*/bool finish[Maxprocess]; /*系统是否有足够的资源分配*/int p[Maxprocess]; /*记录序列*/int m,n; /*m个进程,n个资源*/void Init();/*初始化算法*/bool Safe(); /*安全性算法*/void Bank(); /*银行家算法*/int main(){Init();Safe();Bank();return 1;}void Init() /*初始化算法*/{int i,j;cout<<"请输入进程的数目:"; /*m个进程,n个资源*/cin>>m;cout<<"请输入资源的种类数:";cin>>n;cout<<"请输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>MAX[i][j];cout<<"请输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入"<<endl;for(i=0;i<m;i++){for(j=0;j<n;j++){cin>>Allocation[i][j];need[i][j]=MAX[i][j]-Allocation[i][j];if(need[i][j]<0){cout<<"您输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:"<<endl;j--;continue;}}}cout<<"请输入各个资源现有的数目:"<<endl;for(i=0;i<n;i++){cin>>Available[i];}}void Bank() /*银行家算法*/{int i,cusneed;char again;while(1){cout<<"请输入要申请资源的进程号(注:第1个进程号为0,依次类推)"<<endl;cin>>cusneed;cout<<"请输入进程所请求的各资源的数量"<<endl;for(i=0;i<n;i++){cin>>Request[cusneed][i];}for(i=0;i<n;i++){if(Request[cusneed][i]>need[cusneed][i]){cout<<"您输入的请求数超过进程的需求量!请重新输入!"<<endl;continue;}if(Request[cusneed][i]>Available[i]){cout<<"您输入的请求数超过系统有的资源数!请重新输入!"<<endl;continue;}}for(i=0;i<n;i++){Available[i]-=Request[cusneed][i];Allocation[cusneed][i]+=Request[cusneed][i];need[cusneed][i]-=Request[cusneed][i];}if(Safe()){cout<<"同意分配请求!"<<endl;}else{cout<<"您的请求被拒绝!"<<endl;for(i=0;i<n;i++){Available[i]+=Request[cusneed][i];Allocation[cusneed][i]-=Request[cusneed][i];need[cusneed][i]+=Request[cusneed][i];}}for(i=0;i<m;i++){finish[i]=false;}cout<<"您还想再次请求分配吗?是请按y/Y,否请按其它键"<<endl;cin>>again;if(again=='y'||again=='Y'){continue;}break;}}bool Safe() /*安全性算法*/ {int i,j,k,l=0;int Work[Maxresource];for(i=0;i<n;i++)Work[i]=Available[i];for(i=0;i<m;i++){finish[i]=false;}for(i=0;i<m;i++){if(finish[i]==true){continue;}else{for(j=0;j<n;j++){if(need[i][j]>Work[j]){break;}}if(j==n){finish[i]=true;for(k=0;k<n;k++){Work[k]+=Allocation[i][k];cout<<Work[k];}p[l++]=i;i=-1;}else{continue;}}if(l==m){cout<<"系统是安全的"<<endl;cout<<"安全序列:"<<endl;for(i=0;i<l;i++){cout<<p[i];if(i!=l-1){cout<<"-->";}}cout<<""<<endl;return true;}}cout<<"系统是不安全的"<<endl;return false;}。
任务五 银行家算法
任务五模拟银行家算法,用银行家算法实现资源分配一.实验内容在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
用银行家算法实现资源分配,可以避免死锁的发生。
本实验就是通过利用C/C++,根据下面给出的资源情况和进程情况,模拟银行家算法。
T0 时刻的资源分配表(各种资源的数量分别为:10、5、7)资源情况进程MaxA B CAllocationA B CNeedA B CAvailableA B CP7 5 3 0 1 0 7 4 3 3 3 2P13 2 2 2 0 0 1 2 2P29 0 2 3 0 2 6 0 0P32 2 2 2 1 1 0 1 1P44 3 3 0 0 2 4 3 1二.实验思路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](5)工作向量work。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉理工大学华夏学院课程设计报告书课程名称:操作系统原理题目:编程序模拟银行家算法系名:信息工程系专业班级:软件1121*名:**学号:***************:***2014年 6 月13 日武汉理工大学华夏学院信息工程系课程设计任务书课程名称:操作系统原理课程设计指导教师:苏永红班级名称:软件1121 开课系、教研室:软件与信息安全一、课程设计目的与任务操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。
学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。
二、课程设计的内容与基本要求1、课程设计题目编程序模拟银行家算法2、课程设计内容本课程设计要求在Linux操作系统,GCC编译环境下开发。
银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。
银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
3、设计报告撰写格式要求:1设计题目与要求 2 设计思想3系统结构 4 数据结构的说明和模块的算法流程图5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)7 自我评价与总结8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;三、课程设计步骤及时间进度和场地安排本课程设计将安排在第17周, 教育技术中心。
具体安排如下:第一天,下发任务书,学生查阅资料第二天,系统设计和原型开发第三,四天系统功能实现第五天,系统调试测试打包和验收四、课程设计考核及评分标准课程设计考核将综合考虑学生考勤和参与度,系统设计方案正确性,系统设计和开发效果以及课程设计报告书的质量。
具体评分标准如下:设置六个评分点(1)设计方案正确,具有可行性、创新性;25分(2)系统开发效果较好;25分(3)态度认真、刻苦钻研、遵守纪律;10分(4)设计报告规范、课程设计报告质量高、参考文献充分20分(5)课程设计答辩概念清晰,内容正确10分(6)课程设计期间的课堂考勤、答疑与统筹考虑。
10分按上述六项分别记分后求和,总分按五级记分法记载最后成绩。
优秀(100~90分),良好(80~89分),中等(70~79分),及格(60~69分),不及格(0~59分)目录1设计题目与要求 (5)1.1设计题目 (5)1.2实验要求 (5)2 设计思想 (5)4数据结构的说明和模块的算法流程图 (6)4.1死锁避免: (6)4.1.1破坏“不可剥夺”条件 (6)4.1.2破坏“请求和保持”条件 (6)4.1.3破坏“循环等待”条件 (6)4.2安全状态与不安全状态 (6)4.3数据结构: (6)4.4安全性检查算法 (7)4.5程序流程图 (8)5 使用说明书 (9)6运行结果和结果分析 (9)6.1输入 (9)6.2输出 (10)6.3结果分析 (11)7自我评价与总结 (11)8附录: (12)源程序清单 (12)1设计题目与要求1.1设计题目编程序模拟银行家算法1.2实验要求本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
2 设计思想将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。
银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
3.实验环境系统平台:LINUX开发语言:C开发工具:PC机一台4数据结构的说明和模块的算法流程图4.1死锁避免:定义::系统设计时确定资源分配算法,保证不发生死锁。
具体的做法是破坏产生死锁的四个必要条件之一4.1.1破坏“不可剥夺”条件在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请4.1.2破坏“请求和保持”条件要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配4.1.3破坏“循环等待”条件采用资源有序分配法:把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次、序进行,否则操作系统不予分配。
4.2安全状态与不安全状态安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…Pn,则系统处于安全状态。
一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和,系统处于安全状态(安全状态一定是没有死锁发生的)不安全状态:不存在一个安全序列,不安全状态一定导致死锁。
4.3数据结构:(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]4.4安全性检查算法4.4.1设置两个工作向量Work=AVAILABLE;FINISH4.4.2从进程集合中找到一个满足下述条件的进程,FINISH==false;NEED<=Work;如找到,执行(3);否则,执行(4)4.4.3设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;Finish=true;GOTO 24.4.4如所有的进程Finish= true,则表示安全;否则系统不安全。
4.5程序流程图5 使用说明书5.1首先在终端中使用vi编辑器建立c的源文件5.2然后使用gcc编辑器编译生成可执行文件5.3使用命令./当前名字,来执行6运行结果和结果分析6.1输入6.2输出6.3结果分析这次的设计数据是通过一道实际的题目来体现银行家算法避免死锁的问题,先用银行家算法给其中一个进程分配资源,看它所请求的资源是否大于它的需求量,才和系统所能给的资源相比较.让进程形成一个安全队列,看系统是否安全.再利用安全性算法检查此时系统是否安全。
7自我评价与总结在本次实验中我们使用了liunx变成环境,让我们更加系统深入的了解了liunx,gcc编程思路和思想,同时让我更加深刻的了解银行家算法,了解死锁的避免和预防,对操作系统对资源的申请和释放有了更加深刻的理解,同时在编程过程中积极的向老师同学请教问题与他们一起探讨在系统中存在的问题和漏洞。
深入了解了银行家算法的资源申请和资源分配的过程及原则。
保证系统处于安全状态。
经过本周的课程设计,我对操作系统的掌握又进了一步,收获了很多知识。
,终于我了由于对 c 语言不够熟练,在试验过程中,进行了反复的修改和调试,解银行家算法的基本原理,并且在此次的课程设计中我又复习了一下 c 语言,加深了对它的了解,而且在课程设计的过程中我们同样学会了如何简单的操作与使用 Linux 操作系统,学习到了许多 Linux 操作系统中常用的一些密令。
这次的设计数据是通过一道实际的题目来体现银行家算法避免死锁的问题,先用银行家算法给其中一个进程分配资源,看它所请求的资源是否大于它的需求量,才和系统所能给的资源相比较.让进程形成一个安全队列看系统是否安全.再利用安全性算法检查此时系统是否安全。
操作系统的基本特征是并发与共享。
系统允许多个进程并发执行,并且共享系统的软、硬件资源。
为了最大限度的利用计算机系统的资源,操作系统应采用动态分配的策略,但是这样就容易因资源不足,分配不当而引起“死锁”。
而我本次课程设计就是得用银行家算法来避免“死锁”。
银行家算法就是一个分配资源的过程,使分配的序列不会产生死锁。
此算法的中心思想是:按该法分配资源时,每次分配后总存在着一个进程,如果让它单独运行下去,必然可以获得它所需要的全部资源,也就是说,它能结束,而它结束后可以归还这类资源以满足其他申请者的需要。
通过这次实验,我体会到银行家算法的重要性,银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我来学习借鉴。
通过这次实践,我知道,要做一个课程设计,如果知识面只是停留在书本上,是不可能把课成设计完全地做好。
在课程设计中,很多C语言的知识都忘了,每次的课程设计中都能将以前的知识顺便再复习一遍,课程设计是给了我们一个机会去动手和主动复习,同时也是提醒我们应该注重平时的积累。
从课程设计以后还是要多多的动手,在实践中体会理论知识,才能吸取经验教训。
经过这次实验训练,我对这门课程有了更好的了解。
8附录:源程序清单#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 p[100]={0};int q[100][100]={0};int z[100][100]={0};int M=100;//作业的最大数为100int N=100;//资源的最大数为100int gg=1;void showdata()//显示资源矩阵{int i,j;cout<<endl<<"此时刻的资源分配情况为:"<<endl;cout<<" Max Allocation Need Avaliable"<<endl;cout<<"进程名 ";for(j=0;j<4;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]<<" ";if(i==0){cout<<" ";for (j=0;j<N;j++)cout<<Avaliable[j]<<" ";//输出分配资源}cout<<endl;}}int changdata(int i)//进行资源分配{int j;for (j=0;j<M;j++) {//p[j]=Avaliable[j];Avaliable[j]=Avaliable[j]-Request[j];//q[i][j]=Allocation[i][j];Allocation[i][j]=Allocation[i][j]+Request[j];//z[i][j]=Need[i][j];Need[i][j]=Need[i][j]-Request[j];}return 1;}int safe()//安全性算法{int i,d,k=0,m,h,s,apply,Finish[100]={0};int j;int flag=0;for(i=0;i<N;i++)Work[i]=Avaliable[i];cout<<endl<<" 安全性检查 "<<endl;cout<<" Work Need Allocation Work+Allocation Finish"<<endl;cout<<"进程名 ";for(h=0;h<4;h++){for(s=0;s<N;s++)cout<<name[s]<<" ";cout<<" ";}cout<<endl;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){ cout<<" "<<i<<" ";for(d=0;d<N;d++)cout<<Work[d]<<" ";cout<<" ";for(d=0;d<N;d++)cout<<Need[i][d]<<" ";cout<<" ";for(d=0;d<N;d++)cout<<Allocation[i][d]<<" ";cout<<" ";for(m=0;m<N;m++){Work[m]=Work[m]+Allocation[i][m];cout<<Work[m]<<" ";}//变分配数Finish[i]=True;temp[k]=i;cout<<" ";cout<<"true"<<" ";cout<<endl;i=-1;k++;flag++;}}}}for(i=0;i<M;i++){if(Finish[i]==False){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];}cout<<endl<<"系统进入不安全状态!此时系统不分配资源!"<<endl;//不成功系统不安全return 0;}}cout<<endl<<"此时系统是安全的!"<<endl;//如果安全,输出成功cout<<"安全序列为:";for(i=0;i<M;i++){//输出运行进程数组cout<<temp[i];if(i<M-1) cout<<"->";}cout<<endl;return 0;}void share()//利用银行家算法对申请资源对进行判定{char ch;int i=0,j=0;ch='y';cout<<endl<<"请输入要求分配的资源进程号(0-"<<M-1<<"):";cin>>i;//输入须申请的资源号cout<<endl<<"请输入进程 "<<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<<endl<<"进程 "<<i<<"申请的资源大于它需要的资源";cout<<" 分配不合理,不予分配!"<<endl;ch='n';break;}else {if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则{ //出错cout<<endl<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";cout<<" 分配出错,不予分配!"<<endl;ch='n';break;}}}if(ch=='y') {changdata(i);//根据进程需求量变换资源showdata();//根据进程需求量显示变换后的资源safe();//根据进程需求量进行银行家算法判断}}int main()//主函数{int t=1,i,j,number,choice,m,n,flag;char ming;cout<<"*****************银行家算法的设计与实现*****************"<<endl;cout<<endl<<"请首先输入系统可供资源种类的数量:";cin>>n;N=n;for(i=0;i<n;i++){cout<<"资源"<<i+1<<"的名称:";cin>>ming;name[i]=ming;cout<<"资源的数量:";cin>>number;Avaliable[i]=number;}cout<<endl;cout<<"请输入作业的数量:";cin>>m;M=m;cout<<endl<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[Max]:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>Max[i][j];do{flag=0;cout<<endl<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++){cin>>Allocation[i][j];if(Allocation[i][j]>Max[i][j])flag=1;Need[i][j]=Max[i][j]-Allocation[i][j];}if(flag)cout<<endl<<"申请的资源大于最大需求量,请重新输入!\n"<<endl;}while(flag);showdata();//显示各种资源safe();//用银行家算法判定系统是否安全while(1){if(t==1){cout<<endl<<" 利用银行家算法预分配资源 "<<endl;share();t=0;}else break;cout<<endl<<" 是否继续银行家算法?(按 1 键继续,按其它任意键退出):";cin>>t;cout<<endl;}return 1;}。