内存管理模拟系统.docx

上传人:飞****2 文档编号:78747152 上传时间:2023-03-19 格式:DOCX 页数:31 大小:132.55KB
返回 下载 相关 举报
内存管理模拟系统.docx_第1页
第1页 / 共31页
内存管理模拟系统.docx_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《内存管理模拟系统.docx》由会员分享,可在线阅读,更多相关《内存管理模拟系统.docx(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、摘要操作系统的内存管理是指系统软件对其他应用程序使用内存时所作的管理,是一种统筹关系。本设计采用活动分区方案,但不采用紧凑算法。假设系统内存容量为100KB。能处理内存回收的时候上下邻合并的问题;对随机出现的进程i申请jKB内存,程序能判断是否能分配;释放随机的首地址为Handle的内存块;同时输出内存使用情况和空闲情况。分区管理是把内存划分成若干个大小不等的区域,除操作系统占用一个区域之外,其余由多道环境下的各并发进程共享。分区管理是满足多道程序设计的一种最简单的存储管理方法。本实验过程都在Windows XP操作系统下完成,运用C+当中的链表结构比较容易实现本程序所要求功能,所以采用C+编

2、程语言编写程序。关键词:C语言、内存管理、操作系统、管理系统、内存的分配和回收1. 概要设计1.1设计题目内存管理模拟系统1.2设计目的 本次课程设计的目的是通过该题目的设计过程,掌握内存管理的原理、活动分区的内存分配与回收,设计出一个可以申请内存、释放内存、显示内存情况的基础程序。通过程序的编写让学生通过该题目的设计过程熟悉C语言的使用、算法的应用以及软件开发的方法、掌握内存管理的原理、软件开发方法并提高解决实际问题的能力。本次课程设计采用活动分区方案,但不采用紧凑算法。假设系统内存容量为100KB。要能处理内存回收的时候上下邻合并的问题;对随机出现的进程i申请jKB内存,程序能判断是否能分

3、配;释放随机的首地址为Handle的内存块;要求输出内存使用情况和空闲情况。有使用界面,并且可以自动演示和手动演示内存的申请、释放和显示内存情况。1.3设计分析操作系统的内存管理是指系统软件对其他应用程序使用内存时所作的管理,是一种统筹关系。内存管理对于编写出高效率的Windows程序是非常重要的,这是因为Windows是多任务系统,它的内存管理和单任务的DOS相比有很大的差异。DOS是单任务操作系统,应用程序分配到内存后,如果它不主动释放,系统是不会对它作任何改变的;但Windows却不然,它在同一时刻可能有多个应用程序共享内存,有时为了使某个任务更好地执行,Windows系统可能会对其它任

4、务分配的内存进行移动,甚至删除。因此,我们在Windows应用程序中使用内存时,要遵循Windows内存管理的一些约定,以尽量提高Windows内存的利用率。本设计应采用活动分区方案,假定固定内存容量,能处理内存回收时上下邻合并问题,并在申请内存判断能否分配。1.4设计思想(1)分区存储管理:分区管理是把内存划分成若干个大小不等的区域,除操作系统占用一个区域之外,其余由多道环境下的各并发进程共享。分区管理是满足多道程序设计的一种最简单的存储管理方法。 (2) 动态分区法:动态分区法在作业执行前并不建立分区,分区的建立是在作业的处理过程中进行的,且其大小可随作业或进程对内存的要求而改变。改变了固

5、定分区法中那种即使是小作业也要占据大分区的浪费现象,从而提高了内存的利用率。 (3)动态分区时的分配与回收:动态分区时的分配与回收主要解决三个问题:a.对于请求表中的要求内存长度,从可用表或自由链中寻找出合适的空闲区分配程序。b.分配空闲区之后,更新可用表或自由链。c.进程或作业释放内存资源时,和相邻的空闲区进行链接合并,更新可用表或自由链。 (4)最先适应法:最先适应法要求可用表或自由链按起始地址递增的次序排列。该算法的最大特点是一旦找到大于或等于所要求内存长度的分区,则结束探索。然后,该算法从所找到的分区中划出所要求的内存长度分配给用户,并把余下的部分进行合并后留在可用表中,但要修改其相应

6、的表项。 3.概要设计内存管理是计算机系统以一种优化性能的方式,在需要内存的不同进程(如操作系统或应用程序调用)之间将有限的内存进行分配的过程。执行这种任务的通用技术叫做虚拟内存技术,这项技术利用保留的磁盘空间存储不在物理内存中的对象,来模拟比实际可用的内存大得多的地址空间。在多道程序设计中,会有多个用户同时要求加载到内存,通常它们先进入到一个输入队列中,等待CPU从中选择下一个执行程序。但是内存容量是有限的,这就要求操作系统能够按照某种策略,将这些内存空间合理地分配给队列中的每一个程序。此设计为了了解操作系统活动分区内存管理的分配与回收方式,掌握内存的申请、释放、显示的运行过程,学会如何把学

7、到的知识用于解决实际问题。这次课程设计练习并掌握了编译C+程序,学会调试C+程序,学会如何把学到的知识用于解决实际问题,培养了我们的动手能力。3.1函数调用关系图Getchar()Releasm()Getchar()Display()显示内存状况申请内存Getchar()Getm()释放内存Display自动演示Main() 图3.13.2程序流程图开始初始化菜单演示内存分配状况自动演示内存管理自动创建新进程自动申请进程空间可用内存空间充足内存空间不足自动演示结束手动管理退出申请内存释放内存显示内存状况退出输入进程号输入释放进程号输入该进程申请的内存释放进程成功内存充足充足内存空间不足,不能创

8、建进程。进程创建成功图4.13.33.44.各模块相关算法4.1头文件声明#include#include#include#include#define MAX10240#define S 14.2变量定义ypedef structint i; /记录区号char *t;/记录区的起始地址int flag;/表明该区是否是空闲的page;4.3信号量定义typedef struct nodeint c;/在头结点中存放的是该进程所占内存的大小int i;/在非头结点中存放的是进程号,在后续结点中存放的是该进程所占的内存的区号int fg;/表明该进程号已经存在,如果有新进程要编号必须用另外的编

9、号struct node *next;nd;nd *headMAX/4;page pgMAX/4;int init(char *);int getm(int);int releasem(int);int display();int sleep(int);5.详细设计6调试分析与测试结果6.1程序运行结果如下所示:图6.1.1程序运行界面 图6.1.2自动演示内存管理 图6.1.3手动分配内存 图6.1.4释放内存图6.1.5内存分配情况图6.1.6初始化菜单7.源程序#include#include#include#include#define MAX 128#define S 1typede

10、f structint i; /记录页面号char *t;/记录页面的起始地址int flag;/表明该页面是否是空闲的page;typedef struct nodeint c;/在头结点中存放的是该进程所占内存的大小int i;/在非头结点中存放的是进程号,在后续结点中存放的是该进程所占的内存的页号int fg;/表明该进程号已经存在,如果有新进程要编号必须用另外的编号struct node *next;nd;/int f=0;nd *headMAX/4;page pgMAX/4;int init(char *);int getm(int);int releasem(int);int di

11、splay();int sleep(int);int main()char *p;int n,m,j,k,i,l;p=(char *)malloc(MAX*sizeof(char);init(p); for(i=0;iMAX/4;i+)pgi.i=i;pgi.t=p+i*4;pgi.flag=0;/for(i=0;i100;i+)printf(%c -%dn,pi,pi);while(1)printf(n自动演示内存管理1n手动管理2n退出0 n);scanf(%d,&l);if(l=2)while(1)printf(_n);printf(|1 申请内存 |n);printf(|2 释放内存

12、|n);printf(|3 显示内存状况 |n);printf(|0 退出 |n);printf(_);printf( 输入选择:);scanf(%d,&k);switch(k)case 1:system(cls);getm(0);getchar();break;case 2:system(cls);releasem(0);getchar();break;case 3:system(cls);display();getchar();break;case 0:return 0;default:printf(输入错误,重新输入);break;else if(l=1)/long t;int i;sr

13、and(unsigned)time(&t);system(cls);for(i=0;i);sleep(1);printf(xianzai);sleep(1);printf(kaishi);sleep(1);printf(yanshi);sleep(1);printf(neicun);sleep(1);printf(guanlin);sleep(1);for(i=0;i4;i+)getm(1);display();sleep(3);else break;int init(char *p)int i;for(i=0;inext=NULL;headi-fg=0;for(i=0;iMAX;i+)*(p

14、+i)=95; return 0;int getm(int x)int i,j,m,n,k=0,flag=0,a=0,b=0;nd *p,*q;char ch;long t;srand(unsigned)time(&t);if(x=0)while(1)printf(输入进程号:);/*if(isdigit(ch)=0)printf(进程号非法,重新输入 n);continue;n=ch-48;*/ scanf(%d,&n);if(n10)printf(进程号非法,重新输入n);continue;q=headn;if(headn-fg=1)printf(该进程号已存在,重新输入!n);conti

15、nue;else headn-fg=1;printf(输入该进程申请的内存大小:);scanf(%d,&m);headn-c=m;break;if(x=1) while(1)n=rand()%10;q=headn;if(headn-fg=1)continue;else headn-fg=1;printf(产生新进程-进程号:%dn,n);while(1)m=rand()%MAX;if(mMAX/10)break;printf(该进程申请的内存大小:%dn,m);headn-c=m;break;if(m%4=0)j=m/4;else j=m/4+1;for(i=0,k=0;i=j) headn-

16、i=n; for(i=0;i=j)break;if(pgi.flag=0) p=(nd *)malloc(sizeof(nd);q-next=p;p-i=i;q=p;p-next=NULL;flag=1;pgi.flag=1; if(a=j-1&m%4!=0)for(b=0;bm%4;b+)*(pgi.t+b)=(n+48);else for(b=0;b4;b+)*(pgi.t+b)=(n+48);a+;return 0;if(x=0)printf(n内存剩余空间不足,先释放一部分内存!nnn);return 0;if(x=1) / system(cls);printf(n内存剩余空间不足,开

17、始释放一部分内存!nnn);/ sleep(S);while(1) releasem(1);/ display();/ sleep(S);if(m%4=0)j=m/4;else j=m/4+1;for(i=0;iMAX/4;i+)if(pgi.flag=0)k+; if(ki=n;for(i=0;i=j)break;if(pgi.flag=0) p=(nd *)malloc(sizeof(nd);q-next=p;p-i=i;q=p; p-next=NULL; flag=1;pgi.flag=1;if(a=j-1&m%4!=0)for(b=0;bm%4;b+)*(pgi.t+b)=(n+48)

18、;else for(b=0;bfg=0)printf(该进程号不存在,重新输入!n);continue;break;if(x=1)while(1)n=rand()%10;if(headn-fg=0)continue;printf(释放进程%d的内存n,n);sleep(S);break;p=head0;i=0;for(i=0;ifg=0;p=headi-next;while(p!=NULL)pgp-i.flag=0;/ for(j=0;jnext;break;return 0;int display()FILE *fp;fp=fopen(d:mem1.txt,a+);int i=0;print

19、f(模拟内存分配状况n);for(i=0;iMAX/4;i+) if(pgi.flag=1)/ printf()printf(%c ,*(pgi.t);fprintf(fp,%c ,*(pgi.t);printf(%c ,*(pgi.t+1);fprintf(fp,%c ,*(pgi.t+1);printf(%c ,*(pgi.t+2); fprintf(fp,%c ,*(pgi.t+2);printf(%c ,*(pgi.t+3); fprintf(fp,%c ,*(pgi.t+3);else printf(_ _ _ _ );fprintf(fp,_ _ _ _ );if(i+1)%4=0

20、)printf(n);fprintf(fp,n); printf(nn);fprintf(fp,nn);printf(起始地址:%dn,pg0.t);fprintf(fp,起始地址:%dn,pg0.t);printf(进程状况:n);fprintf(fp,进程状况:n);for(i=0;ifg=1) printf(jingchenhao:%d分配内存大小%dn,i,headi-c);fprintf(fp,进程号:%d分配内存大小%dn,i,headi-c);printf(n); fprintf(fp,n);fclose(fp);return 0; int sleep(int x)long t,

21、j,k;j=time(&t);while(1)k=time(&t);if(k-j=x)return 0;总结做课程设计是为了对平时学习的理论知识与实际操作相结合,在理论和实践上进一步巩固已学基本理论及应用知识并加以综合提高,学会将知识应用于实际的方法,提高分析和解决问题的能力。在做课程设计的过程中,深深感觉到自身所学知识的有限。有些题目书本上没有提及,所以就没有去研究过,做的时候突然间觉得自己真的有点无知,虽然现在去看依然可以解决问题,但还是浪费了许多,这一点是必须在以后的学习中加以改进的地方,同时也要督促自己在学习的过程中不断的完善自我。作为操作系统,磁盘上内存的申请,调用,释放,等等,那些

22、并不重要,最重要的是能理解不同进程间内存空间的利用含义。 这次课程设计基本上含盖了大学一年纪学习到的C+ 语言知识点,课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。这次课设使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订。编程的风格也很重要,同学只关心程序运行的结果,而对程序代码的结构的良好丝毫不在意。这是非常不可取的,如果我们希望将来从事编程工作,在这一点上该引起足够的重视。这是严谨的态度,很重要。这次课程设计加强了我对计算机操作系统的认识,对我个人而言是对所学课程内容掌握情况的一次自

23、我验证。通过课程设计提高了我对所学知识的综合应用能力,全面检查并掌握所学的内容,培养独立思考的能力,在分析问题、解决问题的过程中,我更是获得一种成功的喜悦。参考文献1. 汤子瀛,哲凤屏.计算机操作系统.西安电子科技大学学出版社.2. 王清,李光明,计算机操作系统.冶金工业出版社.3. 孙钟秀等,操作系统教程. 高等教育出版社.4. 曾明,Linux操作系统应用教程. 陕西科学技术出版社. 5. 张丽芬,刘利雄.操作系统实验教程. 清华大学出版社.6. 孟静,操作系统教程原理和实例分析. 高等教育出版社.7. 周长林,计算机操作系统教程. 高等教育出版社.8. 张尧学,计算机操作系统教程,清华大学出版社.9. 任满杰,操作系统原理实用教程,电子工业出版社.致谢在将近2个星期的课程设计中,我遇到了不少的难题,但在同组同学的帮助下,最后终于成功完成了课程设计任务书所要求的任务。这次课程设计锻炼了我解决实际问题的能力,尽管课设花了我不少的时间和精力,可我认为这是值得的,因为在这过程中,接触了很多的同学,从同学那里学到了很多东西,锻炼了我的交际能力和独自解决问题的能力。在此感谢陈文娟老师,她以往的基础课程为我的这次课设打下了基础。感谢陈老师这两周来的辛勤指导,同时也要感谢同学们几天来的帮助,在他们无私的帮助下我的这次课设才能够顺利完成。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁