《兰州理工大学操作系统课设.doc》由会员分享,可在线阅读,更多相关《兰州理工大学操作系统课设.doc(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、*实践教学* 兰州理工大学计算机与通信学院2013年秋季学期操作系统原理课程设计题 目: 内存管理模拟系统 专业班级: 计算机科学与技术三班 姓 名: 学 号: 指导教师: 李 睿 成 绩: 目 录前 言I摘 要II正 文31.设计思想32.函数的调用关系图33.相关的各模块的伪码算法44.调试分析与测试结果5设计总结9致谢11参考文献12附录:源程序13前 言计算机操作系统是计算机中的关键性技术,它的设计与实现体现了程序设计与软件工程的精髓。计算机操作系统原理课程那个是计算机科学与技术及相关专业的核心课程,历来为计算机及信息学科所重视。操作系统原理课程设计正是该课程时间环节的集中表现,它不仅
2、可使学生巩固理论学习的概念、原理、设计及算法,同时也可培养软件开发所应有的系统结构设计和软件工程素养。摘 要操作系统的内存管理是指系统软件对其他应用程序使用内存时所作的管理,是一种统筹关系。本设计采用活动分区方案,但不采用紧凑算法。假设系统内存容量为100KB。能处理内存回收的时候上下邻合并的问题;对随机出现的进程i申请jKB内存,程序能判断是否能分配;释放随机的首地址为Handle的内存块;同时输出内存使用情况和空闲情况。关键词:内存管理操作系统;管理系统;内存的分配和回收正 文1.设计思想内存管理是计算机系统以一种优化性能的方式,在需要内存的不同进程(如操作系统或应用程序调用)之间将有限的
3、内存进行分配的过程。执行这种任务的通用技术叫做虚拟内存技术,这项技术利用保留的磁盘空间存储不在物理内存中的对象,来模拟比实际可用的内存大得多的地址空间。在多道程序设计中,会有多个用户同时要求加载到内存,通常它们先进入到一个输入队列中,等待CPU从中选择下一个执行程序。但是内存容量是有限的,这就要求操作系统能够按照某种策略,将这些内存空间合理地分配给队列中的每一个程序。此设计为了了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。2.
4、函数的调用关系图Getchar()释放内存显示内存状况自动演示申请内存Display()Releasm()Getchar()Display()Getchar()Getm()Man()Getchar()3.相关的各模块的伪码算法typedef structint i; /记录区号char *t;/记录区的起始地址int flag;/表明该区是否是空闲的page;typedef struct nodeint c;/在头结点中存放的是该进程所占内存的大小int i;/在非头结点中存放的是进程号,在后续结点中存放的是该进程所占的内存的区号int fg;/表明该进程号已经存在,如果有新进程要编号必须用另
5、外的编号struct node *next;nd;nd *headMAX/4;page pgMAX/4;int init(char *);int getm(int);int releasem(int);int display();int sleep(int);4.调试分析与测试结果程序运行结果如下图4-1所示:运行界面如图4-1 运行界面自动演示界面如图4-2、4-3所示:图4-2 自动演示图4-3 自动界面手动申请内存如图4-4所示:图4-4 手动申请内存申请内存选择1,如图4-5所示:图4-5 申请内存释放内存如图4-6所示:图4-6 释放内存显示内存状况选择3,如图4-7所示:图4-7
6、显示内存设计总结每一次的实践,都会有很大的收获。决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。再一个问题是回收时候的合并,对地址的修改不是很有把握。着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。之前大多用的c语言,对结构体,对象等知识淡忘了很多,这一次的实践让我找回了很多学过的知识点,也弥补
7、了很多的不足之处。逻辑思维也得到了锻炼,写代码也不再像初学的时候那么繁琐,自己都能感觉到那一点点的进步,顿时也觉得充实起来。还有一个难点就是为作业找到最佳空闲区,此处是参照了一些资料后,理清了条件,然后用一个while()两个if()语句循环嵌套就实现了此功能。实践中也发现自身很多的不足,比如上理论课时认为已经理解了的算法原理在用代码实践时,发现还是有模糊和思考不周的地方。 实践中最困难的是以前没有做过界面,所以虽然程序在大家的努力下还算顺利地完成了,功能测试也通过了,可是界面的制作却成了比较大的难题。好在之前在面向对象课程实验和程序设计课程设计中都用到过MFC,于是确定了用C+来制作界面。但
8、是因为以前界面程序编写较少,所以界面的编写遇到了许多困难,特别是实现内存分配表和空闲分区表的输出遇到了很大的挫折,最后在查阅资料、认真思考的基础上实现内存分配表和空闲分区表的输出,并最终作出了内存管理子系统。在添加控件和消息映射的时候,问题不是很大,但是在对相应控件添加代码和给类添加成员函数的时候,要将源代码对应的部分添加进去,且要注意修包含的头文件。这些地方一直频繁出错,或在功能得不到实现,大家一起边找资料边学习新的知识,通过很多次的尝试,终于做出了界面,虽然不太好看,而且功能也很简单,但这也是也经过大家很大努力才完成的。学习着,收获着,并快乐着,这真是小组成员们共同的感触。对于自身不足的地
9、方,大家也有了比较清晰的认识,对未来的发展,也有了个参照,将遇到的困难一个个跨过,并最终完成此次课程设计,真的感觉很有收获很有成就感。同时也培养了团队合作精神,几次的讨论,大大提升了我们合作的默契度,体会到合作的重要性。动手能力也得到了提高,当然,我们的设计还有很多的不足之处,有些问题没能很好解决,但通过不断学习和实践,我们一定会做的更好。 致谢 三周的课设的结束了,在此期间李老师也很辛苦,为我们的课程设计给予引导,给了我们很多的帮助。同时,当我们遇到困难时耐心地为我们作讲解并加以引导,我们感谢李老师对我们的悉心指导。总之,此次内存管理系统课设遇到好多问题,不仅仅是C程序中的相关知识还有许多专
10、业技术知识。以后还要在这方面继续努力。此外,我在克服它的过程中还得到了许多同学的鼓励和帮助。在此也表示感谢。 参考文献1. 汤子瀛,哲凤屏.计算机操作系统.西安电子科技大学学出版社.2. 王清,李光明.计算机操作系统.冶金工业出版社.3. 孙钟秀等. 操作系统教程. 高等教育出版社4. 曾明. Linux操作系统应用教程. 陕西科学技术出版社. 5. 张丽芬,刘利雄.操作系统实验教程. 清华大学出版社.6. 孟静,操作系统教程原理和实例分析. 高等教育出版社7. 周长林,计算机操作系统教程. 高等教育出版社8. 张尧学,计算机操作系统教程,清华大学出版社9. 任满杰,操作系统原理实用教程,电子
11、工业出版社附录:源程序#include#include#include#include#define MAX 128#define S 1typedef structint i; /记录页面号char *t;/记录页面的起始地址int flag;/表明该页面是否是空闲的page;typedef struct nodeint c;/在头结点中存放的是该进程所占内存的大小int i;/在非头结点中存放的是进程号,在后续结点中存放的是该进程所占的内存的页号int fg;/表明该进程号已经存在,如果有新进程要编号必须用另外的编号struct node *next;nd;/int f=0;nd *hea
12、dMAX/4;page pgMAX/4;int init(char *);int getm(int);int releasem(int);int display();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);printf(* 1.自动演示内存
13、管理 *n); printf(* 2.手动管理 *n); printf(* 0.退出 *n); printf(*n);scanf(%d,&l);if(l=2)while(1)printf(*n);printf(*1.申请内存 *n);printf(*2.释放内存 * n);printf(*3.显示内存状况 *n);printf(*4.退出 *n);printf(*);printf( 输入选择: );scanf(%d,&k);switch(k)case 1:system(cls);getm(0);getchar();break;case 2:system(cls);releasem(0);get
14、char();break;case 3:system(cls);display();getchar();break;case 0:return 0;default:printf(输入错误,重新输入:);break;else if(l=1)long t;int i;srand(unsigned)time(&t);/用来设置随机时间的种子system(cls);for(i=0;i);sleep(1);printf(现在);sleep(1);printf(开始);sleep(1);printf(演示);sleep(1);printf(内存);sleep(1);printf(管理n);sleep(1)
15、;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+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(jingchen
16、haofeifa,chongxinshurun);continue;n=ch-48;*/ scanf(%d,&n);if(n10)printf(进程号非法,重新输入n);continue;q=headn;if(headn-fg=1)printf(该进程号存在,重新输入!n);continue;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(新进程-
17、进程号:%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-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
18、+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内存剩余空间不足,开始释放一部分内存!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
19、;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;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
20、=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()int i;FILE *fp;fp=fopen(d:mem1.txt,a+);printf(模拟内存分配状况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(
21、%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)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(进程号:%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,j,k;j=time(&t);while(1)k=time(&t);if(k-j=x)return 0;
限制150内