操作系统课程设计.docx
- 文档编号:8588023
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:21
- 大小:205.40KB
操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
操作系统课程设计
题目银行家算法
系(部)电子与信息工程系
班级12级计本5班
姓名范慧敏
学号2012020418
指导教师徐江涛刘宏
2014年6月14日
一、设计题目、内容及要求
题目:
银行家算法
内容:
1、分析与流程设计;
2、相关程序设计、实现、调试;
3、课程设计总结报告。
要求:
分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。
设计合适的测试用例,对得到的运行结果要有分析。
二、要求的设计成果(课程设计说明书、设计实物、图纸等)
1、课程设计总结报告
2、相关备份文件
三、进程安排
设计工作4学时
实现与调试16学时
课程设计总结报告8学时
四、主要参考资料
[1]严蔚敏,吴伟民.数据结构.北京:
清华大学出版社,2006.
[2]赵莉,杨国梁,孙喁喁,徐飞.Java程序设计教程.西安:
西安科技大学出版社,2009.
[3]汤小丹,梁红兵,哲凤屏,汤子瀛.计算机操作系统.西安:
西安电子科技大学出版社,2007.
指导教师(签名):
教研室主任(签名):
操作系统课程设计任务书
银行家算法
范慧敏
安康学院计算机科学与技术12级陕西安康725000
摘要:
本文对如何用银行家算法来处理操作系统给进程分配资源做了详细的说明,包括需求分析、概要设计、详细设计、测试与分析、总结、源程序清单。
Dijkstra提出的银行家算法,是最具代表性的避免死锁的算法。
首先做了需求分析,解释了什么是银行家算法,并指出它在资源分配中的重要作用。
然后给出了银行家算法的概要设计,包括算法思路、步骤,以及要用到的主要数据结构、函数模块及其之间的调用关系等。
在概要设计的基础上,又给出了详细的算法设计,实现概要设计中定义的所有函数,对每个函数写出核心算法,并画出了流程图。
接着对编码进行了测试与分析(并在最后附上Java编写的程序代码)。
最后对整个设计过程进行了总结。
关键字:
安全状态;安全序列;银行家算法;安全性算法;安全序列;流程图。
系统概述
系统开发背景
Dijkstra(1965)提出了一种能够避免死锁的调度算法,称为银行家算法。
它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位的资金来为客户服务,而不是满足所有客户贷款需求的最大单位。
这里将客户比作进程,贷款比作设备,银行家比作系统。
客户们各自做自己的生意,在某些时刻需要贷款。
在某一时刻,客户已获得的贷款和可用的最大数额贷款称为与资源分配相关的系统状态。
一个状态被称为是安全的,其条件是存在一个状态序列能够使所有的客户均得到其所需的贷款。
如果忽然所有的客户都申请,希望得到最大贷款额,而银行家无法满足其中任何一个的要求,则发生死锁。
不安全状态并不一定导致死锁,因为客户未必需要其最大贷款额度,但银行家不敢抱这种侥幸心理。
银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。
若是,则不满足该请求;否则便满足。
检查状态是否安全的方法是看他是否有足够的资源满足一个距最大需求最近的客户。
如果可以,则这笔投资认为是能够收回的,然后接着检查下一个距最大需求最近的客户,如此反复下去。
如果所有投资最终都被收回,则该状态是安全的,最初的请求可以批准。
通过对这些情况的仔细调查,我研究出了以下内容。
系统开发的目的和意义
项目开发目的
操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源并组织用户协调使用这些资源,使计算机高效的工作。
《操作系统课程设计》是《操作系统》理论课的必要补充,是复习和检验所学课程的重要手段,本课程设计的目的是综合应用学生所学知识,通过实验环节,加深学生对操作系统基本原理和工作过程的理解,提高学生独立分析问题、解决问题的能力,增强学生的动手能力。
项目开发意义
在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用,他们都无法在向前推进。
要预防死锁,有摒弃“请求和保持”条件,摒弃“不剥夺”条件,摒弃“环路等待”条件等方法。
但是,在预防死锁的几种方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统状态分为安全状态和不安全状态,便可避免死锁的发生。
而最具代表性的避免死锁的算法,便是Dijkstra的银行家算法。
利用银行家算法,我们可以来检测CPU为进程分配资源的情况,决定CPU是否响应某进程的的请求并为其分配资源,从而很好避免了死锁的产生。
需求分析
需求分析
我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。
操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。
若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。
银行家算法是一种最具有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统的安全状态和不安全状态。
所谓安全状态,是指系统能按照某种进程顺序{P1,P2,…,Pn}(称{P1,P2,…,Pn}序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,
使每个进程都可以顺利完成。
安全状态一定没有死锁发生。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
那么,什么是安全序列呢?
如果对每一个进程Pi(1
总体设计
总体设计规则
根据设计题目的要求,充分地分析和理解题目,叙述系统的要求,明确程序要求实现的功能以及限制条件。
明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
算法思路
先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
银行家算法步骤
(1)如果Requesti<or=Need,则转向步骤
(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Request[i];
Allocation=Allocation+Request;
Need=Need-Request;
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
安全性算法步骤
(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)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。 数据库概念结构设计 银行家算法中用到的主要数据结构 (1)可利用资源向量intAvailable[j]j为资源的种类。 (2)最大需求矩阵intMax[i][j]i为进程的数量。 (3)分配矩阵intAllocation[i][j] (4)需求矩阵intneed[i][j]=Max[i][j]-Allocation[i][j] (5)申请各类资源数量intRequesti[j]i进程申请j资源的数量 (6)工作向量intWork[x]intFinish[y] 银行家算法bank() 进程i发出请求申请k个j资源,Requesti[j]=k (1)检查申请量是否不大于需求量: Requesti[j]<=need[i,j],若条件不符重新输入,不允许申请大于需求量。 (2)检查申请量是否小于系统中的可利用资源数量: Requesti[j]<=available[i,j],若条件不符就申请失败,阻塞该进程,用goto语句跳转到重新申请资源。 (3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值: Available[i,j]=Available[i,j]-Requesti[j]; Allocation[i][j]=Allocation[i][j]+Requesti[j]; need[i][j]=need[i][j]-Requesti[j]; (4)试分配后,执行安全性检查,调用safe()函数检查此次资源分配后系统是否处于安全状态。 若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。 (5)用do{…}while循环语句实现输入字符y/n判断是否继续进行资源申请。 安全性检查算法(safe()函数) (1)设置两个向量: 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work=Available。 Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。 开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。 (2)在进程中查找符合以下条件的进程: 条件1: Finish[i]=0; 条件2: need[i][j]<=Work[j] 若找到,则执行步骤(3)否则,执行步骤(4) (3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work[j]=Work[j]+Allocation[i][j]; Finish[i]=1; gotostep2; (4)如果所有的Finish[i]=1都满足,则表示系统处于安全状态,否则,处于不安全状态。 操作系统银行家算法流程图 程序结构 程序共有以下五个部分: (1)初始化chushihua(): 用于程序开始进行初始化输入数据: 进程数量、资源种类、各种资源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。 (2)当前安全性检查safe(): 用于判断当前状态安全性,根据不同处的调用提示处理不同。 (3)银行家算法bank(): 进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程。 (4).显示当前状态show(): 显示当前资源分配详细情况,包括: 各种资源的总数量(all)、系统目前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量。 (5).主程序main() 逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行。 运行结果 (1)初始化结果: (2)资源总布局及选择: (3)选择后的结果: 课程设计总结 本次程序就是按照上面的思路展开的。 但是因为时间上的仓促,本课程设计的存在着以下不足: 一、不能实现并发操作,即当总资源同时满足几个进程所需要的资源数时,这些进程不能同时进行,只能一一按进程顺序执行。 二、扫描进程顺序单一,只能按进程到来的顺序(即编号)来扫描,从而产生的安全顺序只能是在这个顺序的基础上产生的,而其实安全顺序是有多个的。 三、对进程数和资源数进行的数量进行了限制,都只能最多有十个。 四、运行程序后,界面较差,进程数,所需要资源数,已分配资源数,能用资源数,不能一目了然。 在银行家算法这个系统之中,所采用的数据结构应是最基本的部分。 银行家算法的数据结构我们采用了一维数组与二维数组来存储,比如最大需求量Max[][]、已分配资源数Allocation[][]、仍需求资源数Need[][]、以及系统可利用的资源数、申请各类资源等数组。 操作系统的基本特征是并发与共享。 系统允许多个进程并发执行,并且共享系统的软、硬件资源。 为了最大限度的利用计算机系统的资源,操作系统应采用动态分配的策略,但是这样就容易因资源不足,分配不当而引起“死锁”。 而我本次课程设计就是得用银行家算法来避免“死锁”。 银行家算法就是一个分配资源的过程,使分配的序列不会产生死锁。 此算法的中心思想是: 按该法分配资源时,每次分配后总存在着一个进程,如果让它单独运行下去,必然可以获得它所需要的全部资源,也就是说,它能结束,而它结束后可以归还这类资源以满足其他申请者的需要。 这次课程设计时间上虽说仓促点,但是我依然学到了很多的实用性知识。 除了更深的了解这个算法,而且对C语言进行了复习,而且其过程中有很多的知识点都不记得了,所以在此感谢在此过程中帮助过我的老师和同学。 银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。 只要你亲自动手,你就能学到知识。 再次感谢帮助过我的老师和同学! 参考文献 [1]汤小丹,梁红兵,哲凤屏,汤子瀛.计算机操作系统.西安: 西安电子科技大学出版社,2007. [2]严蔚敏,吴伟民.数据结构.北京: 清华大学出版社,2006. [3]赵莉,杨国梁,孙喁喁,徐飞.Java程序设计教程.西安: 西安科技大学出版社,2009. 附件: #include #include #include #defineFalse0 #defineTrue1 intMax[100][100]={0};//各进程所需各类资源的最大需求 intAvaliable[100]={0};//系统可用资源 charname[100]={0};//资源的名称 intAllocation[100][100]={0};//系统已分配资源 intNeed[100][100]={0};//还需要资源 intRequest[100]={0};//请求资源向量 inttemp[100]={0};//存放安全序列 intWork[100]={0};//存放系统可提供资源 intM=100;//作业的最大数为100 intN=100;//资源的最大数为100 voidshowdata()//显示资源矩阵 { inti,j; cout<<"系统目前可用的资源[Avaliable]: "< for(i=0;i cout< cout< for(j=0;j cout< cout< cout<<"MaxAllocationNeed"< cout<<"进程名"; for(j=0;j<3;j++){ for(i=0;i cout< cout<<""; } cout< for(i=0;i cout<<""< for(j=0;j cout< cout<<""; for(j=0;j cout< cout<<""; for(j=0;j cout< cout< } } intchangdata(inti)//进行资源分配 { intj; for(j=0;j Avaliable[j]=Avaliable[j]-Request[j]; Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]-Request[j]; } return1; } intsafe()//安全性算法 { inti,k=0,m,apply,Finish[100]={0}; intj; intflag=0; Work[0]=Avaliable[0]; Work[1]=Avaliable[1]; Work[2]=Avaliable[2]; for(i=0;i apply=0; for(j=0;j if(Finish[i]==False&&Need[i][j]<=Work[j]){ apply++; if(apply==N){ for(m=0;m Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i; i=-1; k++; flag++; } } } } for(i=0;i if(Finish[i]==False){ cout<<"系统不安全"< return-1; } } cout<<"系统是安全的! "< cout<<"分配的序列: "; for(i=0;i cout< if(i } cout< return0; } voidshare()//利用银行家算法对申请资源对进行判定 { charch; inti=0,j=0; ch='y'; cout<<"请输入要求分配的资源进程号(0-"< "; cin>>i;//输入须申请的资源号 cout<<"请输入进程"< "< for(j=0;j { cout< "; cin>>Request[j];//输入需要申请的资源 } for(j=0;j if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错 { cout<<"进程"< cout<<"分配不合理,不予分配! "< ch='n'; break; } else{ if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则 {//出错 cout<<"进程"< cout<<"分配出错,不予分配! "< ch='n'; break; } } } if(ch=='y'){ changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } } voidaddresources(){//添加资源 intn,flag; cout<<"请输入需要添加资源种类的数量: "; cin>>n; flag=N; N=N+n; for(inti=0;i cout<<"名称: "; cin>>name[flag]; cout<<"数量: "; cin>>Avaliable[flag++]; } showdata(); safe(); } voiddelresources(){//删除资源 charming; inti,flag=1; cout<<"请输入需要删除的资源名称: "; do{ cin>>ming; for(i=0;i if(ming==name[i]){ flag=0; break; } if(i==N) cout<<"该资源名称不存在,请重新输入: "; } while(flag); for(intj=i;j { name[j]=name[j+1]; Avaliable[j]=Avaliable[j+1]; } N=N-1; showdata(); safe(); } voidchangeresources(){//修改资源函数 cout<<"系统目前可用的资源[Avaliable]: "< for(inti=0;i cout< "< cout<<"输入系统可用资源[Avaliable]: "< cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2]; cout<<"经修改后的系统可用资源为"< for(intk=0;k cout< "< showdata(); safe(); } voidaddprocess(){//添加作业 intflag=M; M=M+1; cout<<"请输入该作业的最打需求量[Max]"< for(inti=0;i cout< "; cin>>Max[flag][i]; Need[flag][i]=Max[flag][i]-Allocation[flag][i]; } showdata(); safe(); } intmain()//主函数 { i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计