华东交大操作系统课程设计报告Word文档格式.docx
《华东交大操作系统课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《华东交大操作系统课程设计报告Word文档格式.docx(37页珍藏版)》请在冰点文库上搜索。
4)参考文献:
(1)汤子瀛《计算机操作系统》(第三版)西安电子科技大学出版社2007
(2)张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000
(3)钱哨李继哲李挥剑《C#WinForm上机实训指导》中国水利水电出版社2010
内容天数 地点
构思及收集资料1 图书馆
程序实现与调试2 实验室
撰写论文2 图书馆、实验室
学生签名:
2012年12月30日
课程设计(论文)评审意见
(1)完成原理分析(20分):
优( )、良( )、中( )、一般( )、差( );
(2)设计分析 (30分):
(3)完成调试 (30分):
(4)回答问题 (20分):
(5)格式规范性及考勤是否降等级:
是( )、否( )
评阅人:
职称:
2012年12月30日
第一章引言
1.1资源管理系统的提出
虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。
(1)互斥条件:
指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。
(2)占有且等待:
指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
(3)非剥夺:
指进程已获得的资源,在未使用完之前,不能被其他进程强行剥夺。
(4)循环等待:
在系统中存在一个由若干进程形成的环形请求链,其中的每一个进程均占有一些资源,同时又申请请求链中下一个进程所咱有的资源,如图1-1.
互斥,占有且等待,非剥夺这三个条件是死锁产生的必要条件,但不是充分条件。
互斥条件是临界资源固有的属性,保证进程胡此访问临界资源是必要的,不能因为互斥会导致死锁而禁止互斥。
循环等待是前3个条件可能产生的结果,只有存在互斥,占有且等待与非剥夺三个条件时,才可能出现循环等待。
只要系统出现了循环等待,则一定出现死锁。
图1-1进程循环等待:
死锁
银行家算法是最有代表性的避免死锁的算法,由于该算法能用于银行系统现金贷款的发放而得名。
其实现思想是:
允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。
此次课程设计实现了银行家算法的模拟,即实现资源管理系统。
1.2课程设计的目的和意义
银行家算法是避免死锁的一种重要方法。
银行家算法是一种最有代表性的避免死锁的算法。
在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
为实现银行家算法,系统必须设置若干数据结构。
所以,通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。
操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源并组织用户协调使用这些资源,使计算机高效的工作。
《操作系统课程设计》是《操作系统》理论课的必要补充,是复习和检验所学课程的重要手段,本课程设计的目的是综合应用学生所学知识,通过实验环节,加深学生对操作系统基本原理和工作过程的理解,提高学生独立分析问题、解决问题的能力,增强学生的动手能力。
1.3课程设计的任务及要求
1)课程设计任务
1.分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。
2.画出程序的基本结构框图和流程图。
3.对程序的每一部分要有详细的设计分析说明。
4.源代码格式要规范。
5.设计合适的测试用例,对得到的运行结果要有分析。
6.设计中遇到的问题,设计的心得体会。
7.按期提交完整的程序代码、可执行程序和课程设计报告。
2)课程设计要求
每个进程申请资源的情况必须进行记录,并作为课程设计报告的一部分数据。
3)自主要求设计
(1)掌握银行家算法的概念和工作原理;
(2)熟练掌握C#语言和c++语言的编程原理;
(3)实现基于银行家算法的字符系统并且调用界面操作;
(4)运行程序,并合理分析实验结果。
第2章资源管理系统概要设计
2.1开发工具与相关技术
银行家算法是避免死锁的一种重要方法,在本次课程设计中用C++和C#语言编写一个资源管理系统,并要用银行家算法和安全性算法检查是否允许分配资源给进程,避免死锁。
通过课程设计,加深了我对有关资源申请、避免死锁等概念的了解,并且对银行家算法和安全性算法有了更深一步的认识,进而提高了我的分析、解决问题的能力。
下面就开发工具介绍。
2.1.1面向对象编程语言C#
CSharp(音标[?
a:
p])(又被简称为"
C#"
)是微软公司在2000年6月发布的一种新的编程语言,并定于在微软职业开发者论坛(PDC)上登台亮相。
C#是微软公司研究员AndersHejlsberg的最新成果。
C#看起来与Java有着惊人的相似;
它包括了诸如单一继承、界面、与Java几乎同样的语法,和编译成中间代码再运行的过程。
但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NETwindows网络框架的主角。
概括起来,C#开发有如下几点优势。
快速应用开发(RAD)功能
支持快速应用开发(RapidApplicationDevelopment,RAD)可以说是目前开发语言最为重要的一大功能,这也正是C/C++的致命伤。
网络时代应用系统的开发必须按照网络时代的速度来进行。
支持快速开发可以使得开发人员的开发效率倍增,从而使得他们可以从繁重的重复性劳动中解放出来。
C#的RAD功能之一是垃圾收集机制,它将减轻开发人员对内存的管理负担。
利用C#的这些功能,可以使开发者通过较少的代码来实现更强大的应用程序,并且能够更好地避免错误发生,从而缩短应用系统的开发周期。
语言的自由性
用C#编写的程序能最大程度地和任何支持.NET的语言互相交换信息。
能够继承和使用任何语言所编写的程序可以称得上是知识的继承,这样做的好处是节省了大量的工作,而不必把COBOL等语言强行改成另一种语言,.NET让各种语言真正地互相交流了。
C#和其他.NET语言有着最好的协作,这点对开发人员非常重要。
全球从事编写软件的人当中,大约有50%以VisualBasic作为基本的编程工具。
在跨入.NET编程时代的时候,这些人轻松地使用了VB.NET开发Web上的应用程序。
想想以后你居然可以和你的那些只懂VB的同事真正在一起共同开发.NET的应用程序,这是不是一件让人轻松和高兴的事情呢?
强大的Web服务器端组件
在C#的Web编程中,最让人兴奋的是Web服务器端的组件,它们不仅包括传统组件,还包括那些能够自动连接五花八门服务的可编程组件。
你可以用C#编写自己的服务器端组件。
服务器端组件和标准的HTML提供的服务自然是不一样的,使用它们可以更自由、更容易地进行数据绑定。
更多服务器组件很快会出现,有了这些强大的组件,我们可以设计出功能更加强大的企业级分布式应用系统。
支持跨平台
随着互联网应用程序的应用越来越广泛,人们逐渐意识到由于网络系统错综复杂,使用的硬件设备和软件系统各不相同,因此开发人员所设计的应用程序必须具有强大的跨平台性。
C#编写的应用程序就具有强大的跨平台性,这种跨平台性也包括了C#程序的客户端可以运行在不同类型的客户端上,比如PDA、手机等非PC装置中。
与XML的融合
由于XML技术真正融入到了.NET和C#之中,C#的编程变成了真正意义上的网络编程,甚至可以说.NET和C#是专为XML而设计的。
使用C#的程序员可以轻松地用C#内含的类来使用XML技术。
就这方面而言,C#给程序员提供了更多的自由和更好的性能来使用XML。
对C++的继承
C#继承并保留了C++的强大功能,例如,C#保留了类型安全的检测和重载功能,C#还提供了一些新功能取代了一些原来的ANSIC预处理程序的功能,提高了语言的类型安全等安全性。
2.1.2面向对象编程语言C++
1)C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。
2)C++设计成直接的和广泛的支持多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。
3)C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误,而且尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。
4)C++避免平台限定或没有普遍用途的特性,而且带有不使用会带来额外开销的特性。
5)C++设计成无需复杂的程序设计环境,出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。
2.2银行家算法
1.银行家算法的思路
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2)顾客可以分歧贷款,但贷款的总数不能超过最大需求量;
(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。
若请求合法,则进行试分配。
最后对试分配后的状态调用安全性检查算法进行安全性检查。
若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。
2.银行家算法中用到的主要数据结构
可利用资源向量intAvailable[j]j为资源的种类。
最大需求矩阵intMax[i][j]i为进程的数量。
分配矩阵intAllocation[i][j]
需求矩阵intneed[i][j]=Max[i][j]-Allocation[i][j]
申请各类资源数量intRequesti[j]i进程申请j资源的数量
工作向量intWork[x]intFinish[y]
3.银行家算法bank()
进程i发出请求申请k个j资源,Requesti[j]=k
(1)检查申请量是否不大于需求量:
Requesti[j]<
=need[i,j],若条件不符重新输入,不允许申请大于需求量。
(2)检查申请量是否小于系统中的可利用资源数量:
=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判断是否继续进行资源申请。
4.安全性检查算法(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都满足,则表示系统处于安全状态,否则,处于不安全状态。
2.3银行家算法流程图
2.3.a请求资源分配算法图
2.3.b安全性算法图
第三章基于银行家算法的资源管理系统详细设计
3.1资源管理系统的设计思路
3.1.1功能描述
(1)n资源n进程doc界面功能
该分系统的功能主要包含7个模块,分别为系统增加资源,系统删除资源,系统修改资源,进程请求分配资源,添加进程,显示当前进程和资源关系和退出。
1)系统增加资源:
当系统有新的资源时,添加资源种类的数目,然后输入各种资源的名称及其相应的数量;
2)系统删除资源:
当系统需要删除某些不要用的资源时,根据提示输入需要删除的资源名称;
3)系统修改资源:
当系统资源的数目有变化时,可以根据需要重新设置系统的可用资源;
4)进程请求分配资源:
当有新的作业到来或则正在执行的进程申请资源时,系统可以根据系统资源的情况适当的分配;
5)添加进程:
当有新的进程到来时,必须按照要求输入该作业对系统资源的最打需求量。
6)显示当前进程和资源关系:
用于显示当前的进程已经分配的资源。
7)退出:
退出系统.
(2)3资源3进程图像界面功能
用C#编程实现一个资源管理系统,介于界面的和谐,采用固定的资源类数和进程数量,但是每个进程分配的数量,以及系统对应类别数量可以自己设定,任个进程来申请资源时,必须先登记该进程对资源的申请要求,然后由系统检查当前资源的状况。
该分系统的功能主要包含2个模块,分别为安全性算法来检查和请求资源检查。
1)安全性算法来检查:
对当前的资源分配给出安全序列;
2)请求资源检查:
响应某个进程的资源分配请求;
3.1.2全局化描述
(1)doc界面调用图形界面
对于doc界面调用图形界面只需要使用如下函数即可:
voidjiemianshiliMenu()
{
system("
cls"
);
F:
\\oskeshezhongying\\caozhuoxitong\\caozhuoxitong\\bin\\Debug\\caozhuoxitong.exe"
//系统调用exe
}
(2)界面切换
对于界面切换只需要使用如下函数即可:
cout<
<
"
\t请选择:
;
cin>
>
choice;
switch(choice)
{
case'
1'
:
threeMenu();
break;
2'
renyiMenu();
3'
jiemianshiliMenu();
4'
jiemianduoMenu();
0'
choice=0;
default:
请正确选择功能号(0-4)!
endl;
3.2n资源n进程编程思路
3.2.1函数分析
在程序中设计五个进程,分别为0,1,2,3,4。
共享三类资源A,B,C。
在这个资源管理系统中对进程的所需最大资源(Max)、已分配给当前进程资源(Allocation)和系统可用资源(Available)分别进行了初始化了值。
进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列,若分配不安全,则释放分配的资源,防止使系统进入不安全状态。
显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。
程序还可以实现对系统资源的增加,修改,删除;
在程序设计当中,涉及到8个子函数,分别为showdata(),changedata(),share(),safe(),changeresources(),addresources(),delresouces(),addprocess();
各个函数的具体功能如下:
●Showdata()函数:
此函数用来显示目前系统可用资源的数量Avaiable,和各个进程对系统资源的最大需求量Max,已经申请的资源量Allocation及还需要的资源良Need.
●Changedata()函数:
此函数主要是用来改变系统可供资源Available向量和进程的分配向量Allocation及需求向量Need.
●Share()函数:
此函数的功能是用来实现银行家算法,当某个进程Pi发出资源请求向量时,首先检查Request[i]是否小于等于Need[i][j],正确的话再判断Request[i]是否小于等于Available[j],否则提示所申请的值大于它所求的资源数量或则申请的值大于系统可提供资源的数量.
●Safe()函数:
此函数是用来实现安全性算法,用来对资源的分配进行安全性检测。
首先设置两个向量:
工作向量Work和Finish,Work表示系统可提供给进程继续运行所需的各类资源数目,初始值为Available;
Finish表示系统是否有足够的资源分配给进程,使之运行完成。
然后从进程集合中找到一个满足条件为Finish[i]=false和Need[i][j]<
=Work[j]的进程,如找到了,当进程Pi获得资源后,可顺利完成,并释放出分配给它的资源;
如果所有进程的Finish[i]=true,则表示系统处于安全状态;
否则,系统处于不安全状态.
●Changeresources()函数:
此函数是用来修改系统可利用资源的数量,开始输出目前系统可用资源的数量,然后要求输入新的.
●Addresources()函数:
此函数是用来增加系统新资源,按照要求输入需要添加资源的数量,然后按照其提示一一输入资源的名称和数量.
●Delresources()函数:
此函数是用来删除系统某些不需要的资源.
●Addprocess()函数:
此函数是用来添加新的作业,添加时,要求输入该作业的最大资源需求良Max.
3.2.an资源n进程的流程图
3.2.2实例分析
n资源n进程安全性算法举例:
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<
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<
m++)
Work[m]=Work[m]+Allocation[i][m];
//变分配数
Finish[i]=True;
temp[k]=i;
i=-1;
k++;
flag++;
}
3.33资源3进程图形界面编程思路
3.3.1函数分析
在程序中设计五个进程,分别为0,1,2。
共享三类资源a,