编程序模拟银行家算法
银行家算法模拟

项目四银行家算法模拟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)设计函数完成功能:系统内资源总数已知、各进程对各类资源最大需求数目已知、已分配资源数目已知的前提下,某进程提出各类资源的需求量时能判断状态是否安全,以决定是否予以分配。
编程序模拟银行家算法

武汉理工大学华夏学院课程设计报告书课程名称:操作系统原理题目:编程序模拟银行家算法系名:信息工程系专业班级:软件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.我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源。
当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
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]等待。
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)设进程获得资源,可顺利执行,直至完成,从而释放资源。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉理工大学华夏学院课程设计报告书课程名称:操作系统原理题目:编程序模拟银行家算法系名:信息工程系专业班级:软件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周, 教育技术中心。
具体安排如下:第一天,下发任务书,学生查阅资料第二天,系统设计和原型开发第三,四天系统功能实现第五天,系统调试测试打包和验收四、课程设计考核及评分标准课程设计考核将综合考虑学生考勤和参与度,系统设计方案正确性,系统设计和开发效果以及课程设计报告书的质量。
具体评分标准如下:设置六个评分点(1)设计方案正确,具有可行性、创新性;25分(2)系统开发效果较好;25分(3)态度认真、刻苦钻研、遵守纪律;10分(4)设计报告规范、课程设计报告质量高、参考文献充分20分(5)课程设计答辩概念清晰,内容正确10分(6)课程设计期间的课堂考勤、答疑与统筹考虑。
10分按上述六项分别记分后求和,总分按五级记分法记载最后成绩。
优秀(100~90分),良好(80~89分),中等(70~79分),及格(60~69分),不及格(0~59分)目录1设计题目与要求 (5)2 设计思想 (5)4数据结构的说明和模块的算法流程图 (6) (6) (6)4.2安全状态与不安全状态 (6)4.3数据结构: (6)4.4安全性检查算法 (7)4.5程序流程图 (8)5 使用说明书 (9)6运行结果和结果分析 (9) (9) (10)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;}。