兰州理工大学操作系统课设Word文档格式.docx
《兰州理工大学操作系统课设Word文档格式.docx》由会员分享,可在线阅读,更多相关《兰州理工大学操作系统课设Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
![兰州理工大学操作系统课设Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/a8e299d5-dd94-4cf4-91be-dd6418091f05/a8e299d5-dd94-4cf4-91be-dd6418091f051.gif)
此设计为了了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。
2.函数的调用关系图
3.相关的各模块的伪码算法
typedefstruct
{inti;
//记录区号
char*t;
//记录区的起始地址
intflag;
//表明该区是否是空闲的
}page;
typedefstructnode
{intc;
//在头结点中存放的是该进程所占内存的大小
inti;
//在非头结点中存放的是进程号,在后续结点中存放的是该进程所占的内存的区号
intfg;
//表明该进程号已经存在,如果有新进程要编号必须用另外的编号
structnode*next;
}nd;
nd*head[MAX/4];
pagepg[MAX/4];
intinit(char*);
intgetm(int);
intreleasem(int);
intdisplay();
intsleep(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显示内存
设计总结
每一次的实践,都会有很大的收获。
决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。
在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。
再一个问题是回收时候的合并,对地址的修改不是很有把握。
着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。
之前大多用的c语言,对结构体,对象等知识淡忘了很多,这一次的实践让我找回了很多学过的知识点,也弥补了很多的不足之处。
逻辑思维也得到了锻炼,写代码也不再像初学的时候那么繁琐,自己都能感觉到那一点点的进步,顿时也觉得充实起来。
还有一个难点就是为作业找到最佳空闲区,此处是参照了一些资料后,理清了条件,然后用一个while()两个if()语句循环嵌套就实现了此功能。
实践中也发现自身很多的不足,比如上理论课时认为已经理解了的算法原理在用代码实践时,发现还是有模糊和思考不周的地方。
实践中最困难的是以前没有做过界面,所以虽然程序在大家的努力下还算顺利地完成了,功能测试也通过了,可是界面的制作却成了比较大的难题。
好在之前在面向对象课程实验和程序设计课程设计中都用到过MFC,于是确定了用C++来制作界面。
但是因为以前界面程序编写较少,所以界面的编写遇到了许多困难,特别是实现内存分配表和空闲分区表的输出遇到了很大的挫折,最后在查阅资料、认真思考的基础上实现内存分配表和空闲分区表的输出,并最终作出了内存管理子系统。
在添加控件和消息映射的时候,问题不是很大,但是在对相应控件添加代码和给类添加成员函数的时候,要将源代码对应的部分添加进去,且要注意修包含的头文件。
这些地方一直频繁出错,或在功能得不到实现,大家一起边找资料边学习新的知识,通过很多次的尝试,终于做出了界面,虽然不太好看,而且功能也很简单,但这也是也经过大家很大努力才完成的。
学习着,收获着,并快乐着,这真是小组成员们共同的感触。
对于自身不足的地方,大家也有了比较清晰的认识,对未来的发展,也有了个参照,将遇到的困难一个个跨过,并最终完成此次课程设计,真的感觉很有收获很有成就感。
同时也培养了团队合作精神,几次的讨论,大大提升了我们合作的默契度,体会到合作的重要性。
动手能力也得到了提高,当然,我们的设计还有很多的不足之处,有些问题没能很好解决,但通过不断学习和实践,我们一定会做的更好。
致谢
三周的课设的结束了,在此期间李老师也很辛苦,为我们的课程设计给予引导,给了我们很多的帮助。
同时,当我们遇到困难时耐心地为我们作讲解并加以引导,我们感谢李老师对我们的悉心指导。
总之,此次内存管理系统课设遇到好多问题,不仅仅是C程序中的相关知识还有许多专业技术知识。
以后还要在这方面继续努力。
此外,我在克服它的过程中还得到了许多同学的鼓励和帮助。
在此也表示感谢。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.
2.王清,李光明.《计算机操作系统》.冶金工业出版社.
3.孙钟秀等.操作系统教程.高等教育出版社
4.曾明.
Linux操作系统应用教程.陕西科学技术出版社.
5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.
6.孟静,
操作系统教程--原理和实例分析.高等教育出版社
7.周长林,计算机操作系统教程.高等教育出版社
8.张尧学,计算机操作系统教程,清华大学出版社
9.任满杰,操作系统原理实用教程,电子工业出版社
附录:
源程序
#include<
stdio.h>
stdlib.h>
ctype.h>
time.h>
#defineMAX128
#defineS1
{
inti;
//记录页面号
char*t;
//记录页面的起始地址
intflag;
//表明该页面是否是空闲的
intc;
//在非头结点中存放的是进程号,在后续结点中存放的是该进程所占的内存的页号
intfg;
structnode*next;
//intf=0;
intmain()
char*p;
intn,m,j,k,i,l;
p=(char*)malloc(MAX*sizeof(char));
init(p);
for(i=0;
i<
MAX/4;
i++)
{
pg[i].i=i;
pg[i].t=p+i*4;
pg[i].flag=0;
}
//for(i=0;
100;
i++)printf("
%c----%d\n"
p[i],p[i]);
while
(1)
printf("
************************************************\n"
);
printf("
*********1.自动演示内存管理*********\n"
*********2.手动管理*********\n"
*********0.退出*********\n"
scanf("
%d"
&
l);
if(l==2)
{
while
(1)
{
printf("
**********************************************\n"
**************1.申请内存**************\n"
**************2.释放内存**************\n"
**************3.显示内存状况**************\n"
**************4.退出**************\n"
**********************************************"
输入选择:
"
scanf("
k);
switch(k)
{
case1:
system("
cls"
getm(0);
getchar();
break;
case2:
releasem(0);
case3:
display();
case0:
return0;
default:
printf("
输入错误,重新输入:
"
}
}
}
elseif(l==1)
longt;
inti;
srand((unsigned)time(&
t));
//用来设置随机时间的种子
system("
for(i=0;
5;
-"
sleep
(1);
printf("
->
sleep
(1);
现在"
开始"
演示"
内存"
管理\n"
4;
getm
(1);
display();
sleep(3);
elsebreak;
}
intinit(char*p)
head[i]=(nd*)malloc(sizeof(nd));
head[i]->
next=NULL;
fg=0;
MAX;
*(p+i)=95;
return0;
intgetm(intx)
inti,j,m,n,k=0,flag=0,a=0,b=0;
nd*p,*q;
charch;
longt;
srand((unsigned)time(&
if(x==0)
while
(1)
输入进程号:
/*
if(isdigit(ch)==0)
jingchenhaofeifa,chongxinshuru\n"
continue;
n=ch-48;
*/
scanf("
n);
if(n<
0||n>
10)
进程号非法,重新输入\n"
continue;
q=head[n];
if(head[n]->
fg==1)
{printf("
该进程号存在,重新输入!
\n"
continue;
elsehead[n]->
fg=1;
输入该进程申请的内存大小:
m);
head[n]->
c=m;
break;
if(x==1)
{
n=rand()%10;
fg==1){continue;
新进程--->
进程号:
%d\n"
n);
m=rand()%MAX;
if(m>
MAX/10)break;
该进程申请的内存大小:
m);
if(m%4==0)j=m/4;
elsej=m/4+1;
for(i=0,k=0;
if(pg[i].flag==0)k++;
if(k>
=j)
head[n]->
i=n;
if(a>
=j){break;
if(pg[i].flag==0)
{
p=(nd*)malloc(sizeof(nd));
q->
next=p;
p->
i=i;
q=p;
flag=1;
pg[i].flag=1;
if(a==j-1&
&
m%4!
=0)
{`
for(b=0;
b<
m%4;
b++)*(pg[i].t+b)=(n+48);
else
a++;
return0;
if(x==0){printf("
\n内存剩余空间不足,请先释放一部分内存!
!
\n\n\n"
return0;
//system("
\n内存剩余空间不足,开始释放一部分内存!
//sleep(S);
{
releasem
(1);
//display();
//sleep(S);
if(m%4==0)j=m/4;
elsej=m/4+1;
if(pg[i].flag==0)k++;
if(k<
j)continue;
else
head[n]->
for(i=0;
if(a>
if(pg[i].flag==0)
{
p=(nd*)malloc(sizeof(nd));
q->
p->
q=p;
p->
flag=1;
pg[i].flag=1;
if(a==j-1&
{
for(b=0;
}
else
a++;
}
return0;
intreleasem(intx)
intn=0,i=0,j=0,flag=0;
nd*p;
//*******************************************************************************
输入要释放内存的进程号:
fg==0){printf("
fg==0){continue;
释放进程%d的内存\n"
sleep(S);
p=head[0];
i=0;
if((*head[i]).i==n)
flag=1;
head[i]->
p=head[i]->
next;
while(p!
=NULL)
pg[p->
i].flag=0;
//for(j=0;
j<
j++)*(pg[i].t+j)=95;
p=p->
intdisplay()
FILE*fp;
fp=fopen("
d:
mem1.txt"
"
a++"
模拟内存分配状况\n"
if(pg[i].flag==1)
//printf("
)
%c"
*(pg[i].t));
fprintf(fp,"
*(pg[i].t+1));
*(pg[i].t+2));
fprintf(fp,"
*(pg[i].t+3));
else{printf("
____"
if((i+1)%4==0){printf("
}
\n\n"
起始地址:
pg[0].t);
进程状况:
if(head[i]->
{printf("
%d分配内存大小%d\n"
i,head[i]->
c);
fclose(fp);
intsleep(intx)
longt,j,k;
j=time(&
t);
k=time(&
if(k