内存管理模拟系统_第1页
内存管理模拟系统_第2页
内存管理模拟系统_第3页
内存管理模拟系统_第4页
内存管理模拟系统_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

目录

摘要.....................................................1

正文.....................................................................................................................2

1、设计任务..........................................2

2、设计目的..........................................2

3、设计思路..........................................2

4、各模块的伪码算法..................................3

5、函数关系诡用图:..................................9

6、测试..............................................10

设计总结.................................................12

参考文献.................................................13

致谢...................................................14

附录:部分源程序代码.....................................15

摘要

操作系统的内存管理是指系统软件对其他应用程序使用内存时所作的管

理,是一种统筹关系。内存管理对于编写出高效率的Windows程序是非常重

要的,这是因为Windows是多任务系统,它的内存管理和单任务的DOSffl

比有很大的差异。DOS是单任务操作系统,应用程序分配到内存后,如果

它不主动释放,系统是不会对它作任何改变的;但Windows却不然,它在

同一时刻可能有多个应用程序共享内存,有时为了使某个任务更好地执行,

Windows系统可能会对其它任务分配的内存进行移动,甚至删除。因此,

我们在Windows应用程序中使用内存时,要遵循Windows内存管理的一些

约定,以尽量提高Windows内存的利用率。本设计采用活动分区方案,假

定固定内存容量,能处理内存回收时上下邻合并问题,并在申请内存是判

断能否分配。

关键词:内存管理、管理系统、内存的分配和回收、内存申请、释放、显

正文

1、设计任务

采用活动分区方案,但不采用紧凑算法。假设系统内存容量为lOOKBo要能

处理内存回收的时候上下邻合并的问题;对随机出现的进程i申请jKB内存,程

序能判断是否能分配;释放随机的首地址为Handle的内存块;要求输出内存使

用情况和空闲情况。有使用界面,并且可以自动演示和手动演示内存的申请、释

放和显示内存情况。

2、设计目的

通过该题目的设计过程,掌握内存管理的原理、活动分区的内存分配与回收,

设计出一个可以申请内存、释放内存、显示内存情况的基础程序。通过程序的编

写熟悉C语言的使用、算法的应用以及软件开发的方法并提高解决实际问题的能

力。

3、设计思路

内存管理是计算机系统以一种优化性能的方式,在需要内存的不同进程(如

操作系统或应用程序调用)之间将有限的内存进行分配的过程。执行这种任务的

通用技术叫做虚拟内存技术,这项技术利用保留的磁盘空间存储不在物理内存中

的对象,来模拟比实际可用的内存大得多的地址空间。此设计为了了解操作系统

活动分区内存管理的分配与回收方式,掌握内存的申请、释放、显示的运行过程,

学会如何把学到的知识用于解决实际问题,培养学生的动手能力。

intdisplay();

intslccp(int);

3)整体程序流程图:

结束

4)内存回收:

注;先释放内存,看内存大小是否符合进程所站的内存大小,如果不符合再申请,最后

释放回收。

intrclcasem(intx)

{intn=O,i=O,j=O,flag=O;

nd*p;

longt;

srand((unsigned)time(&t));

if(x==0)

{while(l)

{printf("请输入要释放内存的进程号:”);

scanf("%dM,&n);

if(head[n]->fg==O){printf("该进程号不存在,请重新输入!\n");continue;}

break;

)

)

if(x==l)

{while(l)

(n=rand()%10;

if(headln]->fg==O){continue;}

printf("释放进程%d的内存\n”,n);

sleep(S);

break;

}

)

p=head[()];

i=0;

for(i=0;i<MAX/4;i++)

{if((*head[i]).i一一n)

{Aag=l;

head[i]->fg=0;

p=head[i]->next;

while(p!=NULL)

(pg[p->i].flag=O;

for(j=0;j<4;j++)*(pg[i].t+j)=95;

p=p->next;

)

break;}

return0;)

5).内存分配:

注;按照要分配内存的大小分配内存,不足再申请,直到把所有的进程都分配到内存,进

程结束后释放内存,让下一个进程利用。

intdisplayO

{FILE*fp;inti;

fp=fopen(Hd:meml.txt,',"a++");

printf("模拟内存分配状况\n”);

for(i=0;i<MAX/4;i++)

{if(pgfi].flag==l)

{printfO;

printf(n%cu,*(pg[i].t));

fprintf(fp,"%c

printfC'%cu,*(pg[i].t+l));fprintf(fp,-%cu*(pg[i].t+l));

printf(u%c*\*(pg[i].t+2));fprintf(fjp;'%c",*(pg[i].t+2»;

printfC'%c\*(pg[i].t+3));fprintf(fp;'%c\*(pg[i].t+3));

}

else{printfC,_____”);fprintf(fp,”______");)

if((i+1)%4==0){printf("\n,');fprintf(fp,,,\nM);)

)

printf("\n\n");「printf(fp,”\n\n”);

primf("起始地址:%d\n”,pg⑼.t);fprintf(fp,"起始地址:%d\nu,pg[0].t);

printf("进程状况:\n");fprintf(fpj进程状况:\nn);

for(i=0;i<MAX/4;i++)

{if(head[i]->fg==l)

(printf("进程号:%d分配内存大小%d\n",i,head[i]->c);fprintf(fp,"进程号:%d

分配内存大小%d\n”,i,head[i]・>c);)

)

printfC'Xn");fprint^fp/'Xn");

fclose(fp);

return0;}

intsleep(intx){longt,j,k;

j=time(&t);

while(l)

{k=time(&t);

if(k-j==x)

return0;}

5、函数关系调用图:

Display()自动演示

6、测试

运行界面:

阜军送翟我存管理请按1

意出So

自动演示界面:物理地址为3613784的内存空间为起始地址分配内存,内存大

小为10179

6666666666666666

6666666666666

6666666666666666

6666666666666666

66666666666666

666666666666666

666666666666666

66666666666666

666666666666

666666666666G6

6666666666666666

66666666666666

6666666666666666

666666666666666

666

起始地址:3613784

进程福况:

进槿导:6分配内存大小10179

手动管理界面:

自动逮示内存管理请按1

手工管迪

2

黑请

1内存

2内存

显放

3存状况

0退蚕

请输入选择:

显示内存状况:起始地址给进程1、2、3分别分配内存大小为100、200、700

始地

;3613784

哥1

进100

2大

哥、

配200

3大

爰请

1内存

2内存

内存

3状况

退

0蚕

内存不足释放界面:总内存空间不足以分配该进程申请的内存大小,系统提示

释放一部分内存以足以分配该进程所申请的内存大小

领入进程景:4

墉入该重点申请的内存大小:10000

内存剩余空间不足,请释放先释放一部分内存”

黑请

内存

内存

状况

内存

退

请输入选择:

设计总结

在本次课程设计中,主要有宋睿、岳继承和我三个人共同完成各模块的整理,

调试,修改,分析,完善。我主要负责内存的申请模块的结构及算法。

在C++和C语言开发中,指针、内存一直是学习的重点。因为C++语言作为

一种偏底层的中低级语言,提供了大量的内存直接操作的方法,这一方面使程序

的灵活度最大化,尢论是不是做商用工程,C++和C程序员都首先要对内存有一

个清晰的理解。

作为操作系统,磁盘上内存的申请,调用,释放,等等,那些并不重要,最

重要的是能理解不同进程间内存空间的利用含义。

这次课程设计基本上含盖了大学一年纪学习到的C++语言知识点,课设题

目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维

和动手能力。这次课设使我了解我编程思想和编程技巧,也认识了软件生命周期

的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订。编程

的风格也很重要,同学只关心程序运行的结果,而对程序代码的结构的良好丝毫

不在意。这是非常不可取的,如果我们希望将来从事编程工作,在这一点上该引

起足够的重视。这是严谨的态度,很重要

参考文献

1.张尧学,史美林,张高.《计算机操作系统教程》.清华大学出版社.

2.王清,李光明,《计算机操作系统》.冶金工业出版社.

3.塔嫩鲍姆,《操作系统设计与实现》.电子工业出版社.

4.曾明,《Linux操作系统应用教程》.陕西科学技术出版社.

5.周予滨,《快速内存管理技术》.电子工业巴版社.

6.孟静,《操作系统教程一一原理和实例分析》.高等教育出版社.

7.邹建青,《内存管理》.上海科学技术出版社.

8.白洛,《深入理解Linux虚拟内存管理.》.中国电力出版社.

9.钟合,《内存管理20小时通》.科学技术文献出版社.

10.刘克成,《C语言程序设计》.中国铁道出版社.

致谢

这次课程设计,我从“纸上谈兵”到可以自己动脑动手分析调试程序,收获

不少。

首先要感谢有了这次实践的机会,给了自己一个舞台,同时也是对自身1勺检

验,使我的综合能力有了很大的提升。还有多亏了老师们从理论到上机亲自指导

的辛苦教授,给予了我们最大帮助和全面指导,在这里,尤其感谢我的《操作系

统》的授课老师陈文娟老师,你的不辞辛苦,在给很多学生指导的情况下还不厌

其烦的给我们耐心指导,并更正我们的错误。在这里,我衷心向你们致谢!最后

还要感谢和我一个团队的兄弟,在我陷入误区的时候,是他们热心的帮助使我摆

脱困境。

最后衷心感谢所有给予我帮助和指导的老师和同学,没有他们的帮助我的程

序也不会完成得这么顺利。

附录:部分源程序代码

intmain()

{char*p;

inin,mj,k,i,l;

p=(char*)malloc(MAX:i:sizeof(char));

init(p);

for(i=0;i<MAX/4;i++)

{Pg[i].i=i;

pg[i].t=p+i*4;

pg[i].flag=O;

)

while(l)

{printf("\n自动演示内存管理请按l\n手工管理按2\n退出按0\n”);

scanf(M%d",&l);

if(l==2)

whilc(l)

printf(u__________________________________\nu);

printfCJl申请内存W);

printf(H|2释放内存W);

printf(H|3显示内存状况W);

printf(n|O退出W);

n

printf(___________—

printf(n请输入选择:

scanf(u%dn,&k);

switch(k)

case1:system("cls");

getm(O);getchar();break;

case2:system("cls");releasem(0);getchar();break;

case3:system("cls");

displayO;getchar();break;

case0:return0;

defaultprinlf("输入错误,请重新输入”);break;

)

}

(

elseif(l==l)

(longt;

inti;

srand((unsigned)time(&t));

systemC/'cis*');

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

{printfC*-");

sleep(l);

}

printf(n->");sleep(l);

printf("现在");sleep(1);

printf("开始)sleep(l);

printf("演示”);sleep(l);

printf("内存)sleep⑴;

printf("管理");sleep(l);

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

(getm(l);

displayO;

sleep(3);

)

)

elsebreak;

)

)

intinit(char*p)

inti;

for(i=0;i<MAX/4;i++)

{pg[i].flag=O;

head[i]=(nd*)malloc(sizeof(nd));

head[i]->next=NULL;

head[il->fg=O;

)

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

{*(p+i)=95;

)

return0;

)

intgetm(intx)

{inti,j,m,n,k=(),flag=(),a=0,b=();

nd*p,*q;

charch;

longt;

srand((unsigned)time(&t));

if(x==0)

{while(l)

(

printf("输入进程号:”);

scanf("%dM,&n);

if(n<0||n>10){printf("进程号不合法,请重新输入\n");

continue;

)

q=head[n];

if(head[n]->fg==1){printf("该进程号已经存在,请重新输

A!\n");continue;)

elsehead[n]->fg=l;

printf("输入该进程申请的内存大小:”);

scanf("%d”,&m);

head[n]->c=m;

break;

)

)

if(x==l)

(while(I)

{n=rand()%10;

q=head[n|;

if(head[n]->fg=1){continue;}

elsehead[n]->fg=l;

printf("产生新进程一,进程号:%d\n\n);

while(l)

{m=rand()%MAX;

if(m>MAX/l())break;

)

printf("该进程申请的内存大小:%d\n",m);

head[n]->c=m;

break;

}

)

if(m%4==0)j=m/4;

elsej=m/4+l;

for(i=0,k=0;i<MAX/4;i++)

{if(pg[i].flag=O)k++;

)

if(k>=j)

{head[nl->i=n;

for(i=0;i<MAX/4;i++)

if(a>=j)(break;}

if(pg[i].flag==O)

{p=(nd*)malloc(sizeof(nd));

q->next=p;

p->i=i;

q=p;

p->next=NULL;

flag=l;

pg[i].flag=i;

if(a==j-1&&m%4!=0)

{for(b=0;b<m%4;b++)*(pg[i].t+b)=(n+48);

)

else

{for(b=0;b<4;b+4-)*(pg[i].t+b)=(n+48);

)

a++;

1

)

return0;

)

if(x==0){printf("\n内存剩余空间不足,请释放先释放一部分内存!!\n\n\n");阳urn

0;)

if(x==l)

{systcmC'cls*');

printf("\n内存剩余空间不足,开始释放一部分内存!!\n\n\n");

sleep(S);

while(l)

{releasem(1);

displayO;

sleep(S);

if(m%4==0)j=m/4;

elsej=m/4+1;

for(i=0;i<MAX/4;i++)

{if(pg[i].flag=O)k++;

}

if(k<jContinue;

else

{head[n]->i=n;

for(i=0;i<MAX/4;i++)

{if(a>=j){break;)

if(pg[i].flag==O)

{p=(nd*)malioc(sizeof(nd));

q->next=p;

p->i=i;

q=p;

p->next=NULL;

flag=l;

pg[i].flag=l;

if(a-j-l&&m%4!-0)

(

for(b=0;b<m%4;b4-+)*(pgfi].t+b)=(n+48);

)

else

(

for(b=0;b<4;b4-+)*(pg[i].t+b)=(n+48);

)

a++;

)

)

return0;

)

)

return0;

)

intreleasem(intx)

{intn=0,i=0,j=0,flag=0;

nd*p;

longt;

srand((unsigned)time(&t));

if(x==0)

{while(l)

{prinlf(”请输入要释放内存的进程号:”);

scanf("%d",&n);

if(head[n]・>fg==O){printf("该进程号不存在,请重新输入!\n");continue;}

break;

1

)

if(x==l)

{while(l)

{n=rand()%10;

if(headfnl->fg==O){continue;}

printf("释放进程%d

温馨提示

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

评论

0/150

提交评论