武汉轻工大学实验二可变分区存储管理.docx
- 文档编号:15699434
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:13
- 大小:132.54KB
武汉轻工大学实验二可变分区存储管理.docx
《武汉轻工大学实验二可变分区存储管理.docx》由会员分享,可在线阅读,更多相关《武汉轻工大学实验二可变分区存储管理.docx(13页珍藏版)》请在冰点文库上搜索。
武汉轻工大学实验二可变分区存储管理
武汉轻工大学
数学与计算机学院
《操作系统》实验报告
题目:
可变分区存储管理
专业:
数学与计算机学院
班级:
计算机类1303班
学号:
1305110050
姓名:
刘文斌
指导老师:
黄川
2015年05月26日
1、目的和要求
通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。
2、实验内容
阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。
编写程序模拟实现内存的动态分区法存储管理。
内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。
假定系统的内存共640K,初始状态为操作系统本身占用64K。
在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完成;在t3时间之后,作业E请求50K的内存空间;在t4时间之后,作业D完成。
要求编程序分别输出t1、t2、t3、t4时刻内存的空闲区的状态。
3、实验环境
Windows操作系统、VC++6.0
C语言
4、设计思想
程序流程图:
5、源程序
#include
#include
#include
structfreelink
{
intlen,address;//len为分区长度;address为分区起始地址
structfreelink*next;
};
//内存占用区用链表描述,其结点类型描述如下:
structbusylink
{
charname;//作业或进程名name='S'表示OS占用
intlen,address;
structbusylink*next;
};
//并设全程量:
structfreelink*free_head=NULL;//自由链队列带头结点)队首指针?
structbusylink*busy_head=NULL,*busy_tail=NULL;//占用区队列队(带头结点)首指针
//占用区队列队尾指针
//设计子函数:
voidstart(void)/*设置系统初始状态*/
{
structfreelink*p;
structbusylink*q;
free_head=(structfreelink*)malloc(sizeof(structfreelink));
free_head->next=NULL;//创建自由链头结点
busy_head=busy_tail=(structbusylink*)malloc(sizeof(structbusylink));
busy_head->next=NULL;//创建占用链头结点
p=(structfreelink*)malloc(sizeof(structfreelink));
p->address=64;
p->len=640-64;//(OS占用了64K)
p->next=NULL;
free_head->next=p;
q=(structbusylink*)malloc(sizeof(structbusylink));
q->name='S';/*S表示操作系统占用*/
q->len=64;q->address=0;q->next=NULL;
busy_head->next=q;busy_tail=q;
}
voidrequireMemo(charname,intrequire)/*模拟内存分配*/
{
structfreelink*w,*u,*v,*x,*y;
structbusylink*p;
x=free_head;
y=free_head->next;
while((y!
=NULL)&&(y->len { x=y; y=y->next; } if(y! =NULL) { p=(structbusylink*)malloc(sizeof(busylink)); p->name=name; p->address=y->address; p->len=require; p->next=NULL; busy_tail->next=p;//把p插入到busy_head的尾部 busy_tail=p; w=x->next; x->next=w->next; if(w->len==require) { free(w); } else { w->address=w->address+require; w->len=w->len-require; u=free_head; v=free_head->next; while((v! =NULL)&&(v->len { u=v; v=v->next; } u->next=w; w->next=v; } } else printf("can'tallocate! \n"); } voidfreeMemo(charname)/*模拟内存回收*/ { structbusylink*p,*q; structfreelink*w,*u,*v,*s1=NULL,*s2=NULL; intlen,address; intflag1=1,flag2=1; p=busy_head->next; while((p! =NULL)&&(p->name! =name))//找到要回收的结点 { q=p; p=p->next; } if(p==NULL) { printf("%cisnotexist\n",name); } else { if(p==busy_tail) busy_tail=q; q->next=p->next; len=p->len; address=p->address; free(p); w=(structfreelink*)malloc(sizeof(freelink)); w->len=len; w->address=address; u=free_head; v=free_head->next; while((v! =NULL)&&(flag1==1||flag2==1))//归并算法 { if((w->address==(v->address+v->len))&&flag1) { s1=v; u->next=s1->next; w->address=v->address; w->len+=v->len; v=v->next; flag1=0; } elseif(((w->address+w->len)==v->address)&&flag2) { s2=v; u->next=s2->next; w->len+=v->len; v=v->next; flag2=0; } else { u=v; v=v->next; } } if(s1! =NULL) free(s1); if(s2! =NULL) free(s2); u=free_head; v=free_head->next; if(v! =NULL) { while((v! =NULL)&&(v->len { u=v; v=v->next; } } u->next=w; w->next=v; } } voidpast(inttime)/*模拟系统过了时间time,用sleep(),或者用个空循环*/ { Sleep(5); printf("时间%d后: \n",time); } voidprintlink()/*输出内存空闲情况(自由链的结点)*/ { structfreelink*p; p=free_head->next; if(p==NULL) printf("无空闲区! \n"); else { while(p! =NULL) { printf("首地址: %d\t长度: %d\n",p->address,p->len); p=p->next; } } printf("----------------------------------------\n"); } voidprintlink1()/*输出内存占用的情况*/ { structbusylink*p; p=busy_head->next; if(p==NULL) printf("无内存占有区! \n"); else { while(p! =NULL) { printf("名字: %c\t首地址: %d\t长度: %d\n",p->name,p->address,p->len); p=p->next; } } } //设计主函数: intmain() { start(); past(5); requireMemo('A',8);requireMemo('B',16); requireMemo('C',64);requireMemo('D',124); printf("内存占用区为: \n"); printlink1(); printf("内存空闲区为: \n"); printlink(); past(10); freeMemo('C'); printf("内存占用区为: \n"); printlink1(); printf("内存空闲区为: \n"); printlink(); past(15); requireMemo('E',50); printf("内存占用区为: \n"); printlink1(); printf("内存空闲区为: \n"); printlink(); past(20); freeMemo('D'); printf("内存占用区为: \n"); printlink1(); printf("内存空闲区为: \n"); printlink(); return0; } 6、实例运行结果 7、总结 首先,对链表又有进一步的理解,还有就是加深理解内存的分配与回收,分配与回收的策略,并掌握动态分区这种内存管理的具体实施方法。 再者,就是在编程中遇到的困难,在编写归并程序首先是自己考虑问题不全面,写的程序就只顾及到一个结点,而没有实现有两个结点的情况,于是后来再加了一条else语句,就没有出现问题。 还有一个问题就是将多余的结点free时也出现问题,加了一条if(s==NULL),成立就释放掉。 一开始把free语句写在while循环内,一旦把找到的结点释放掉,则找不到下一个结点,也会出错,所以应该把free放到while循环外。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉 轻工 大学 实验 可变 分区 存储 管理