操作系统实验报告_第1页
操作系统实验报告_第2页
操作系统实验报告_第3页
操作系统实验报告_第4页
操作系统实验报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE银行家算法课程设计报告PAGE5/20目录一、需求分析…………………2二、系统概要设计……………2三、系统详细设计………………4四、系统主要源代码……………5五、系统测试及调试……………5六.、心得体会……………………8七、参考文献……………………9八、附录…………9

操作系统课程设计报告课设内容简介:银行家算法的模拟实现。一、需求分析控制工作流程,管理资源,为用户服务,是操作系统的主要功能。在资源管理中,操作系统的任务是使各种系统资源得到充分合理的应用,解决用户作业因资源而产生的矛盾,并合理的让用户再合适的时间内得到其应有的服务。现代操作系统引入了多道程序设计技术,允许锁个进程同时驻留内存并发执行。若干个进程将不可避免地竞争系统资源,如果操作系统不能够协调多个进程对系统资源的竞争与共享,将会导致执行结果异常,系统不稳定、失效等多种问题,从而产生死锁,产生死锁的原因可分为两种:(1)竞争资源引起死锁(2)进程推进顺序不当引起死锁。银行家算法是一种代表性的避免死锁的算法,在进程申请资源的时候,系统调用银行家算法来检测此次分配会不会导致死锁的产生,及判断此次分配的安全性。若检测到此次分配是安全的则分配给申请进程所申请的资源,若检测到此次分配是不安全的,则相应的进程等待。二、系统概要设计(1)系统主要功能:系统运用银行家算法先对用户提出的计算机系统资源请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查,后决定是否给相应进程动态分配资源。(2)系统模块功能结构:(3)运行环境要求:相关工具:MicrosoftVisualC++6.(4)数据结构设计及相关说明:

(1)、可利用资源向量

INT

AVAILABLE[M]

M为资源的类型。

(2)、最大需求矩阵

INT

MAX[N][M]

N为进程的数量。

(3)、已分配矩阵

INT

ALLOCATION[N][M]

(4)、还需求矩阵

INT

NEED[N][N]

(5)、申请各类资源数量intRequest[x];//

(6)、工作向量

intWork[x];

(7)、intFinish[y];//表示系统是否有足够的资源分配给进程,0为否,非0为是

三、系统详细设计

(1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等

(2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。

(3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。如果条件不符则提示重新输

入,即不允许索取大于需求量

(4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=AVALIABLE[I,J]。如果条件不

符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句)

(5)、进行资源的预分配,语句如下:

AVALIBLE[I][J]=AVALIBLE[I][J]-K;

ALLOCATION[I][J]=ALLOCATION[I][J]+K;

NEED[I][J]=NEED[I][J]-K;

(6)、系统调用安全性检查算法(safe()函数)进行检查,如果检查通过,则不用回收,否则进行

回收,进程资源申请失败进入等待。

4、安全性检查算法(safe()子函数)

(1)、设置两个临时变量。

(2)、在进程中查找符合以下条件的进程。

条件1:FINISH[I]=0

条件2:NEED[I][J]〈=WORK[J]

(3)、如果查找成功则进行资源的模拟回收,语句如下:

WORK[J]=WORK[J]+ALLOCATION[I][J];

FINISH[I]=1或查找到的顺序号

(4)、如果查找不成功,则检查所有进程的FINISH[],如果有一个为0,则系统不为0,返回不成功

标志。否则返回成功标志。四、系统主要原代码见附录!!五、系统测试及调试5.1

5.3

出现问题及解决方案:本程序考虑了程序功能实现、格式显示合理化、输入错误异常处理等各个方面的设计,尽可能使程序设计的更加完美。在长期的设计调试过程中遇到过许多问题,通过网上搜索、查询资料、调试试验等方法一一解决。下面大致罗列一些主要问题:5.3.1关于输入错误的异常处理:数字判断在调试程序过程中我们都知道在要求输入整型数据时,如不小心键入字母符号等,则程序立即出错;还有如在要求输入一个字符时,如果不小心输入为了字符串,则也会出错(此时多键入的字符被保留在缓冲区内,当下次要求屏幕输入时先从缓冲区取出导致出错)。因此设计了一个判断函数intshuzi(intn);

进行处理此类输入异常错误。此函数主要设计思路为:定义一个动态字符串指针,输入后判断每个输入的字符是否在’0’—‘9’之间来判断是否输入的为数字字符,然后按照字符ASCII码值与数字值的关系将输入的字符转换为整数。而对于字符输入的问题,可以定义为一个动态字符串指针然后只取输入的第一个字符内容。5.3.2关于某些判断算法优劣问题:在程序中很多地方都会用到循环判断是否符合条件的算法,在设计这些算法时有很多方法,而有的算法可以更节省时间。如下安全性算法中寻找寻找符合Finish[i]==0条件的进程的例子:/*算法一:

for(j=0;j<m;j++)

if(Work[j]>=Need[i][j])counter=counter+1;//记数

if(counter==m){…*/

//算法二:

for(j=0;j<m;j++)

if(Work[j]>=Need[i][j]);

//可用大于等于需求

else{

counter=1;

break;

}

if(counter!=1){…显然算法二要优于算法一。本程序中还有很多类似的地方。这里主要考虑的是一个程序的优化设计问题。六、心得体会在设计此程序的过程中,我遇到过许多问题,也学到了很多东西。本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。在算法的数据结构设计上考虑了很长时间。在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,综合这些算法思想和自己的思路对程序做了很好的设计方式,对一些算法的优越性等也作了一些考虑。此外考虑最多的就是异常错误处理的设计。一个好的程序必须能在各种环境下都有其相应的处理方式,至少能应对一些常见的可能发生的错误。在课程设计过程中遇到了许多问题,也向同宿舍的同学做了一些请教一起讨论,也因此从他们身上学到了许多东西。七、参考文献[1]汤子瀛等.《计算机操作系统》.西安:西安电子科技大学出版社,2006.10.[2]刘璟等.《高级语言c++程序设计》.北京:高等教育出版社,2006.03.[3]胡志刚、谭长庚.计算机操作系统.中南大学出版社.2005.7[4]张尧学.计算机操作系统教程(第二版).清华大学出版社.2000.8八、附录#include<iostream.h>

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<string.h>//===定义全局变量===

constintx=50,y=100;

intAvailable[x];

intAllocation[y][y];

intMax[y][y];

intNeed[y][y];

intRequest[x];

intWork[x];

intFinish[y];

intp[y];inti,j;

intn,m;

//n为进程的数量,m为资源种类数

intl=0,counter=0;

//函数声明

intshuzi(intsz);

voidchushihua();

//系统初始化函数

voidsafe();

//安全性算法函数

voidbank();

//银行家算法函数

voidshowdata();

//===数字判断函数===

intshuzi(intsz){

char*temp;

temp=newchar;

intlen;

sz=0;//清零

chars;//

do{

//gets(temp);

//getline(cin,temp)

cin>>temp;

len=strlen(temp);

for(inti=0;i<len;i++){

s=*(temp+i);

if(s<'0'||s>'9'){

cout<<"抱歉,输错了!你输入的是数字吗?!\n\n";

cout<<"请重新输入:";

break;

}

}

}while(s<'0'||s>'9');

for(inti=0;i<len;i++){

/

intt=1;

for(intj=1;j<len-i;j++)t*=10;

sz+=(*(temp+i)-48)*t;

}

returnsz;

}

//===系统初始化函数===

voidchushihua(){

//===系统初始化输入===

cout<<"%%程序开始,系统初始化输入%%"<<endl;

//<<endl

cout<<"==============================================================="<<endl<<endl;

cout<<"请输入进程的数量:"

n=shuzi(n);

cout<<"请输入资源种类数:";

m=shuzi(m);

cout<<endl<<endl<<"请输入各种资源可利用的数量("<<m<<"种):"<<endl;

cout<<endl;

for(j=0;j<m;j++){

cout<<"

输入资源"<<j<<"可利用的数量Available["<<j<<"]:";

Available[j]=shuzi(Available[j]);

Work[j]=Available[j];

//初始化Work[j]

//

cout<<endl;

}

//system("cls");

//清屏

cout<<endl;

cout<<"请输入各进程当前已分配的资源数量Allocation["<<n<<"]["<<m<<"]:"<<endl<<endl;

for(i=0;i<n;i++){

for(j=0;j<m;j++){

cout<<"

请输入进程"<<i<<"当前已分配的资源"<<j<<"数量:";

Allocation[i][j]=shuzi(Allocation[i][j]);

}

cout<<endl;

Finish[i]=0;//初始化Finish[i]

//break;

}

cout<<endl<<endl;

cout<<"请输入各进程对各类资源的最大需求数Max["<<n<<"]["<<m<<"]:"<<endl<<endl;

for(i=0;i<n;i++){

for(j=0;j<m;j++){

cout<<"

请输入进程"<<i<<"对资源"<<j<<"的最大需求数:";

Max[i][j]=shuzi(Max[i][j]);

if(Max[i][j]>=Allocation[i][j])

//

Need[i][j]=Max[i][j]-Allocation[i][j];

//计算还需求量

else

Need[i][j]=0;

}

cout<<endl;

}

cout<<endl<<"%%初始化完成!%%"<<endl;

}//===安全性算法函数===

voidsafe(){

l=0;

for(i=0;i<n;){

//i++

if(Finish[i]==0){

//寻找Finish[i]==0的进程

条件一

counter=0;

//记数器

for(j=0;j<m;j++)

if(Work[j]>=Need[i][j]);

//可用大于等于需求

else{

counter=1;

break;

}

if(counter!=1){//进程的每类资源量都符合条件Work[j]>=Need[i][j]

条件二

p[l]=i;

//存储安全序列

Finish[i]=1;

for(j=0;j<m;j++){

Work[j]=Work[j]+Allocation[i][j];

}

l=l+1;

i=-1;

}

}

i++;

}

}

//===显示分配情况函数===

voidshowdata()//函数showdata,输出当前资源分配情况

{

inti,j;//局部变量

intAll[y];//各种资源的总数量

intl2;//局部变量

l1,

cout<<"==============================================================="<<endl<<endl;

cout<<"%%系统当前状态如下:%%"<<endl<<endl;cout<<"%%各种资源的总数量(all):"<<endl;

for(j=0;j<m;j++){

cout<<"资源"<<j<<":";

All[j]=Available[j];

for(i=0;i<n;i++){

All[j]+=Allocation[i][j];

cout<<All[j]<<"

";

if((j+1)%5==0)cout<<endl;

//每行显示五个

&&j!=0

}

cout<<endl<<endl;

cout<<"%%系统目前各种资源可用的数为(available):"<<endl;

for(j=0;j<m;j++){

cout<<"资源"<<j<<":"<<Available[j]<<"

";

if((j+1)%5==0)cout<<endl;//每行最多显示五个

&&j!=0

}

cout<<endl<<endl;

cout<<"%%各进程已经得到的资源量(allocation):"<<endl;

//

l1=0;

//归零

for(i=0;i<=m/5;i++){

for(j=i*5;j<i*5+5&&j<m;j++)cout<<"

资源"<<j;

cout<<endl;

for(l2=0;l2<n;l2++){

cout<<"进程"<<l2<<":";

for(j=i*5;j<i*5+5&&j<m;j++)cout<<Allocation[l2][j]<<"

";

cout<<endl;

}

}

cout<<endl;

cout<<"%%各进程还需要的资源量(need):"<<endl;

//<<endl

//l1=0;

for(i=0;i<=m/5;i++){

//设计每行显示五种资源

for(j=i*5;j<i*5+5&&j<m;j++)cout<<"

资源"<<j;

cout<<endl;

for(l2=0;l2<n;l2++){

cout<<"进程"<<l2<<":";

for(j=i*5;j<i*5+5&&j<m;j++)cout<<Need[l2][j]<<"

";

cout<<endl;

}

}

//===银行家算法函数===

voidbank(){

cout<<"==============================================================="<<endl<<endl;

cout<<"%%以下开始为进程进行资源分配申请%%"<<endl<<endl;

//===申请资源===

intk=0;//用于输入进程编号

boolr=false;

//初值为假,输入Y继续申请则置为真

do{

//输入请求

cout<<"请输入申请资源的进程编号(输入0--"<<n-1<<"之间):";

k=shuzi(k);

cout<<endl;

while(k>n-1){//输入异常处理

cout<<endl<<"您输入了错误的进程号,请重新输入!"<<endl;

cout<<endl<<"请输入申请资源的进程编号(输入0--"<<n-1<<"之间):";

k=shuzi(k);

cout<<endl;

}

cout<<endl<<"请输入该进程申请各类资源的数量:"<<endl;

for(j=0;j<m;j++){

do{

cout<<"进程"<<k<<"申请资源["<<j<<"]的数量:";

Request[j]=shuzi(Request[j]);

cout<<endl;

if(Request[j]>Need[k][j]){

cout<<"申请大于需要量!!!"<<endl;

cout<<"您申请资源"<<j<<"的数量为"<<Request[j]<<",大于进程"<<k<<"对该资源需求量"<<Need[k][j]<<"。"<<endl;

cout<<"请重新输入!!!"<<endl;

}

else

if(Request[j]>Available[j]){

cout<<"\n没有那么多资源,目前可利用资源"<<j<<"数量为"<<Available[j]<<",本次申请不成功,进程等待!!!"<<endl;

Finish[k]=0;

//该进程等待

gotoppp;

}

}while(Request[j]>Need[k][j]);

//Request[j]>Available[j]||

}

//改变Avilable、Allocation、Need的值

for(j=0;j<m;j++){

Available[j]=Available[j]-Request[j];

Allocation[k][j]=Allocation[k][j]+Request[j];

Need[k][j]=Need[k][j]-Request[j];

Work[j]=Available[j];

}

//判断当前状态的安全性

safe();

//调用安全性算法函数

if(l<n){

l=0;

cout<<"\n当前状态不安全,不予分配!!!!!!"<<endl;

//恢复数据

for(j=0;j<m;j++){

Available[j]=Available[j]+Request[j];

Allocation[k][j]=Allocation[k][j]-Request[j];

Need[k][j]=Need[k][j]+Request[j];

Work[j]=Available[j];

}

for(i=0;i<n;i++)

Finish[i]=0;

/

}

else{

//

system("cls");

l=0;

cout<<"\n申请资源成功!!!"<<endl;//===========================================

/*

for(j=0;j<m;j++)if(Need[k][j]==0)l=l+1;

if(l==m){

//此处借用l做下计数器

for(j=0;j<m;j++){

Available[j]=Available[j]+Max[k][j];

Allocation[k][j]=0;

}

}

l=0;

//归零

//===========================================

cout<<"\n安全的状态!!!"<<endl;

cout<<"安全序列为:

";

cout<<endl<<"进程"<<"("<<p[0]<<")";

Finish[0]=0;

for(i=1;i<n;i++){

cout<<"==>>"<<"进程"<<"("<<p[i]<<")";

Finish[i]=0;//所有进程置为未分配状态

}

cout<<endl<<endl;

}

showdata();

//显

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论