大学实验报告_第1页
大学实验报告_第2页
大学实验报告_第3页
大学实验报告_第4页
大学实验报告_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

实验报告实验课程:学生姓名:学号:专业班级:2009年1目录实验一编程实现银行家安全算法………………3实验二存储管理的模拟实现………13实验三磁盘调度算法的模拟实现…20 南昌大学实验报告(1)编程实现银行家安全算法学生姓名:学号:专业班级:实验类型:□验证□综合■设计□创新实验日期:11.5,11.12实验成绩:一、实验目的通过实验加强对银行家安全算法的理解和掌握。二、实验内容熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤1、学习、理解好课本中银行家算法的实例;2、根据课本中银行家算法的描述,画出程序流程图;3、按照程序流程图,用C语言编程并实现。4、上机运行编写的程序,检验并且修正直至能够得到正确的结果。输出提示:输入有误,请从新输入初始化函数Init()开始输入进程的数目m输出资源的种类n输入每个进程最多所需的各资源数输入每个进程已分配的各资源数输入各个资源现有的数目初始化函数Init()结束流程图:输出提示:输入有误,请从新输入初始化函数Init()开始输入进程的数目m输出资源的种类n输入每个进程最多所需的各资源数输入每个进程已分配的各资源数输入各个资源现有的数目初始化函数Init()结束银行家算法C语言程序:#include"iostream.h"#include"stdio.h"#define P_NUM 0X03#define MAX_available 0xAstructPCB{charstate;//状态intrequest;//请求资源intmax;//最大需求量intneed;//需求量intallocation;//已经分配量};voidrandomallocation(structPCBp[],intav);boolsafecheck(structPCBp[],intav);voidbankallocation(structPCBp[],intav);voidshow(structPCBp[],intav);voidmain(){structPCBprocess[P_NUM];//分配3个进程空间inti;intj;intk;intavailable=MAX_available;//可利用资源向量; printf("\t\t银行家调度算法\n");printf("初始状态最大的可利用资源MAX_available为:\n",MAX_available);for(i=0;i<5;i++)//为每个进程分配最大需求量{ printf("p%d->max:",i); scanf("%d",&process[i].max);if(process[i].max>MAX_available){printf("错误!最大需求量超过了可利用资源总量,请重新输入!\n");i--;}else{do{ printf("\np%d->allocation:\n",i); scanf("%d",&process[i].allocation);}while((process[i].allocation>process[i].max)||(available-process[i].allocation<0));available=available-process[i].allocation;process[i].need=process[i].max-process[i].allocation;process[i].request=0;process[i].state='R';}//else}//forshow(process,available);printf("\n1--随机分配算法2--银行家算法\n");do{printf("请选择:\n"); scanf("%d",&i);}while(!((i==1)||(i==2)));if(i==1)randomallocation(process,available);else{do{if(safecheck(process,available)==false){printf("\n当前为不安全状态!\n");printf("1--退出2--重置");do{printf("\n请选择:\n");cin>>k;}while((k!=1)&&(k!=2));if(k==2){available=MAX_available;for(j=0;j<5;j++){ printf("p%d->allocation:\n",j);//cin>>process[j].allocation; scanf("%d",&process[j].allocation);available=available-process[j].allocation;}//for(j=0;j<5;j++)}//if(k==2)}//if(safecheck(process,available)==false)else{k=0;break;}}while(k==2);//doif(k==1)return;elseif(k==0)bankallocation(process,available);}//else}//endmainvoidshow(structPCBp[],intav){inti;printf("\navailable=",av);printf("\nnumbermaxneedallocationstate\n");for(i=0;i<5;i++){printf("%d\t%d\t%d\t%d\t%d\n",i,p[i].max,p[i].need,p[i].allocation,p[i].state);}}voidrandomallocation(structPCBp[],intav){inti=0;intj=0;intw;inte;while(1){if(i==5)i=i-5;while(1){if(i==5)i=i-5;elseif(p[i].state=='R'){do{ printf("\np%d->request:\n",i); scanf("%d",&p[i].request);}while(p[i].request>(p[i].max-p[i].allocation));break;}elsei++;}if(p[i].request<=av){av=av-p[i].request;p[i].allocation=p[i].allocation+p[i].request;p[i].request=0;if(p[i].max==p[i].allocation){av=av+p[i].allocation;p[i].state='E';p[i].allocation=0;p[i].request=0;}j=0;while(j<5){if((p[j].request<=av)&&(p[j].state=='W')){av=av+p[j].allocation;p[j].request=0;p[j].state='E';p[j].allocation=0;}if((p[j].max<av+p[j].allocation)&&(p[j].state=='W')){p[j].state='R';}j++;}show(p,av);}else{p[i].state='W';show(p,av);}w=0;e=0;for(j=0;j<5;j++){if(p[j].state=='W')w++;elseif(p[j].state=='E')e++;elsebreak;}if(((w+e)==5)&&(w!=0)){printf("发生死锁!\n");return;}elseif(e==5){printf("三个进程顺利执行完!\n");return;}i++;}}voidbankallocation(structPCBp[],intav)//银行家算法函数{ intorder[5];intk; intj=0;intrequest;intf;inti;show(p,av);while(1){request=0;k=-1;do{if(k!=-1) printf("不是安全状态!\n");av=av+request;p[k].allocation=p[k].allocation-request;do{ printf("p->NO.:"); scanf("%d",&k);}while(p[k].state!='R');do{ printf("p->request:"); scanf("%d",&request);}while(request>(p[k].need));if(request>av){p[k].request=request;p[k].state='W';break;}p[k].allocation=p[k].allocation+request;av=av-request;}while(safecheck(p,av)!=true);if(p[k].allocation==p[k].max){p[k].state='E';av=av+p[k].allocation;p[k].allocation=0;p[k].need=0; order[j]=k;}for(i=0;i<5;i++){if((p[i].state=='W')&&(p[i].request<=av)){if(safecheck(p,av)==true){p[i].allocation=p[i].request+p[i].allocation;av=av-p[i].request;p[i].request=0;p[i].state='R';if(p[i].max==p[i].allocation){p[i].state='E';av=av+p[i].allocation;p[i].allocation=0;}}else{printf("\n不是安全状态!原请求资源量无效。\n");p[i].request=0;p[i].state='R';}}}show(p,av);f=0;for(i=0;i<5;i++){if(p[i].state=='E')f++;}if(f==5){printf("**********所有进程顺利执行完!**********\n");printf("安全序列为:");for(i=0;i<5;i++) { inttemp; temp=order[i]; //cout<<"p"<<temp<<""; printf("p%d",temp); }//for printf("\n");break;}//if j++;}}boolsafecheck(structPCBp[],intav){boolfinish[5];intorder[5];inti;intj=0;intf=0;intk=0;intwork;inttemp;work=av;for(i=0;i<5;i++){order[i]=0;if(p[i].state=='E') {finish[i]=true;}else {finish[i]=false;}}//forwhile(k<5){for(i=0;i<5;i++){if((p[i].state=='W')&&(p[i].request<=work)&&(finish[i]==false)){temp=p[i].allocation;p[i].allocation=p[i].request+p[i].allocation;}//ifif(((p[i].allocation+work)>=p[i].max)&&(finish[i]==false)){work=p[i].allocation+work;finish[i]=true;order[j]=i;j++;if(p[i].state=='W') {p[i].allocation=temp;}}//if}//fork++;}//whilefor(i=0;i<5;i++){if(finish[i]==true) {f++;} }//for(i=0;i<5;i++)if(f==3) { returntrue; }elsereturnfalse;}五、实验数据及处理结果六、实验体会或对改进实验的建议通过这次实验我对用银行家算法实现资源分配有了一定的熟悉,对银行家算法的步骤和相关数据结构用法有了更深的理解,加深了解了死锁产生的条件和原因。通过编程实现银行家算法来预防死锁,加深了对课堂上所授内容的理解。在此实验中为了便于检验算法正确与否,采取的数据为课本上所用到的数据,在程序中也可以手动输入资源,并且所有数据都放在外部文件中,这样就不用每次都需要输入数据,减少了麻烦,同时也提高了程序的安全性,也提高了自己再次使用文件、写文件的能力。七、参考资料《计算机操作系统》 南昌大学实验报告(2)存储管理的模拟实现学生姓名:学号:实验类型:□验证□综合■设计□创新实验日期:11.19,11.26,12.3实验成绩:一、实验目的存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。二、实验内容编程实现页面置换算法,要求输出页面的置换过程,具体可以编程实现OPT、FIFO和LRU算法。三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤1、学习、理解好课本中页式存储管理中页面置换算法的实例;2、根据课本中页式存储管理中页面置换算法的描述,画出程序流程图;3、按照程序流程图,用C语言编程并实现。4、上机运行编写的程序,检验并且修正直至能够得到正确的结果。流程图C语言程序:

main()

{

intcunchufangwenyemian[4];/*存储访问的页面*/

intcunchujisuanguocheng[3][4];/*存储计算过程;*/

intcunchushifoumingzhong[4];/*存储是否被命中*/

intlie,hang;/*循环变量列,行*/

intshifoumingzhong;/*在前一列的位置,没有则为0;*/

intwenmenyemiangeshu=4;/*访问页面的个数*/

/*第一步,初始化*/

/*输入访问的页面,存到存储访问的页面的数组中*/

for(lie=0;lie<4;lie++)

{

printf("\n请输入第%d个页面:",lie);

scanf("%d",&cunchufangwenyemian[lie]);

}

/*初始化计算过程数组*/

for(lie=0;lie<4;lie++)

{

for(hang=0;hang<3;hang++)

{

cunchujisuanguocheng[hang][lie]=-1;

}

}

/*初始化是否没有命中的数组*/

for(lie=0;lie<4;lie++)

{

cunchushifoumingzhong[lie]=0;

}

/*第二步,计算*/

/*察看是否命中*/

for

(wenmenyemiangeshu=0;wenmenyemiangeshu<4;wenmenyemiangeshu++)

{

/*对于某一列进行处理*/

lie=wenmenyemiangeshu;

if(lie==0)/*如果为第一列*/

{

cunchujisuanguocheng[0][lie]=cunchufangwenyemian[lie];

/*将页面落下来*/

cunchushifoumingzhong[0]=0;

/*是否命中为0,不命中*/

}else

{/*如果不为第一列*/

shifoumingzhong=0;

/*假设没命中*/

for(hang=0;hang<3;hang++)

{

if(

cunchujisuanguocheng[hang][lie-1]==cunchufangwenyemian[lie])

{

shifoumingzhong=hang+1;/*如果相同,则是否命中为命中的位置*/

}

}

cunchushifoumingzhong[lie]=shifoumingzhong;/*存储命中位置*/

}

if(lie!=0)

{

if((shifoumingzhong!=0))/*是否命中*/

{/*如果命中,则不变*/

for(hang=0;hang<3;hang++)

{

cunchujisuanguocheng[hang][lie]=cunchujisuanguocheng[hang][lie-1];/*将上一列复制过来*/

}

}else

{/*如果没有命中,则向下移一位,新的进来*/

for(hang=2;hang>0;hang--)

{

cunchujisuanguocheng[hang][lie]=cunchujisuanguocheng[hang-1][lie-1];/*将上一列逐个下移复制过来*/

}

cunchujisuanguocheng[0][lie]=cunchufangwenyemian[lie];/*最上面的等于新进来的*/

}

}

}

/*第三步,输出*//*输出访问序列*/

for(lie=0;lie<4;lie++)

{

printf("%d

",cunchufangwenyemian[lie]);

}

printf("\n");/*输出计算过程*/

for(hang=0;hang<3;hang++)

{

for(lie=0;lie<4;lie++)

{

printf("%d

",cunchujisuanguocheng[hang][lie]);

}

printf("\n");

}/*输出是否命中*/

for(lie=0;lie<4;lie++)

{

printf("%d

",cunchushifoumingzhong[lie]);

}

}五、实验数据及处理结果六、实验体会或对改进实验的建议通过这次实验,对请求页式存储管理中页面置换算法有了一定的熟悉,对通过请求页式存储管理中页面置换算法模拟设计有了更深的了解,对虚拟存储技术的特点,请求页式管理的页面置换算法等有了更加深刻的了解。加深了对课堂上所讲授的OPT、FIFO和LRU三种算法的理解。七、参考资料《计算机操作系统》南昌大学实验报告(3)磁盘调度算法的模拟实现学生姓名:学号:专业班级:实验类型:□验证□综合■设计□创新实验日期:12.10,12.17,12.24实验成绩:一、实验目的通过实验加强对磁盘调度算法的理解和掌握。二、实验内容编写程序实现磁盘调度算法,具体可以编写程序实现FCFS算法、SSTF算法、SCAN算法和CSCAN算法之二。三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤1、学习、理解好课本中FCFS算法、SSTF算法、SCAN算法和CSCAN算法的实例;2、根据课本中FCFS算法、SSTF算法、SCAN算法和CSCAN算法的描述,画出程序流程图;3、按照程序流程图,用C语言编程并实现。4、上机运行编写的程序,检验并且修正直至能够得到正确的结果。流程图C语言程序://

t1.cpp

:

定义控制台应用程序的入口点。

#include

"stdafx.h"

#include"math.h"

#include"stdlib.h"

#include"string.h"

struct

Head

{

int

nPosition;

bool

bVisited;

};

void

Visit(struct

Head

*pHead)

{

printf("visite

cy:%d\n",pHead->nPosition);

pHead->bVisited=true;

}

int

ReadInputKeyboard(struct

Head

*pHead,int

*pCurrentPosition,int

nMaxNumber)

{

int

i;

printf("please

input

Current

position:");

scanf("%d",pCurrentPosition);

printf("please

input

will

visit

position:");

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

{

scanf("%d",&pHead[i].nPosition);

pHead[i].bVisited=false;

if(pHead[i].nPosition<0)

break;

}

return

i;

}

int

ReadInputFile(struct

Head

*pHead,int

*pCurrentPosition,int

nMaxNumber)

{

int

i;

char

szFileName[256],*q,*p,szTemp[20];

printf("please

input

filename:");

scanf("%s",szFileName);

FILE

*pFile=fopen(szFileName,"r");

if(pFile==NULL)

{

printf("open

file

%s

error",szFileName);

return

-1;

}

for(i=0;!feof(pFile)

&&i<nMaxNumber;)

{

p=szFileName;

fgets(p,256,pFile);

while(q=strchr(p,','))

{

memset(szTemp,0,sizeof(szTemp)*sizeof(char));

strncpy(szTemp,p,q-p);

p=q+1;

if(i==0)

*pCurrentPosition=atoi(szTemp);

else

{

pHead[i-1].nPosition=atoi(szTemp);

pHead[i-1].bVisited=false;

}

i++;

}

memset(szTemp,0,sizeof(szTemp)*sizeof(char));

pHead[i-1].nPosition=atoi(p);

pHead[i-1].bVisited=false;

//i++;

}

fclose(pFile);

return

i;

}

int

FifoVisit(int

nCurrentPosition,struct

Head

*pHead,int

nNumber)

{

//FCFS算法

int

nHaveVisited=0;

int

nMoveDistance=0;

int

i;

while(nHaveVisited<nNumber)

{

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

{

if(pHead[i].bVisited)

continue;

Visit(&pHead[i]);

nHaveVisited++;

nMoveDistance+=abs(nCurrentPosition-pHead[i].nPosition);

nCurrentPosition=pHead[i].nPosition;

}

}

printf("the

sum

of

move

distance:%d\n",nMoveDistance);

return

nMoveDistance;

}

int

SsfoVisit(int

nCurrentPosition,struct

Head

*pHead,int

nNumber)

{

//

SSTF算法

int

nHaveVisited=0;

int

nMoveDistance=0;

int

nMinDistance=0;

int

nMinIndex=0;

int

i;

while(nHaveVisited<nNumber)

{

nMinDistance=0xffff;

nMinIndex=0;

//找最小值

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

{

if(pHead[i].bVisited)

continue;

if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition))

{

nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);

nMinIndex=i;

}

}

//访问

Visit(&pHead[nMinIndex]);

nHaveVisited++;

nMoveDistance+=nMinDistance;

nCurrentPosition=pHead[nMinIndex].nPosition;

}

printf("the

sum

of

move

distance:%d\n",nMoveDistance);

return

nMoveDistance;

}

int

DtVisit(int

nCurrentPosition,bool

bOut,struct

Head

*pHead,int

nNumber)

{

//SCAN算法

int

nHaveVisited=0;

int

nMoveDistance=0;

int

nMinDistance=0;

int

nMinIndex=

温馨提示

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

评论

0/150

提交评论