4分区式储器管理.docx
《4分区式储器管理.docx》由会员分享,可在线阅读,更多相关《4分区式储器管理.docx(14页珍藏版)》请在冰豆网上搜索。
4分区式储器管理
操作系统实验报告
分
区
式
储
器
管
理
实验四:
分区式储器管理
一.实验目的
模拟实现一个简单的固定(或可变)分区存储管理系统,进一步加深对分区分配方案设计思想的理解。
二.实验属性
该实验为设计性实验。
三.实验仪器设备及器材
普通PC386以上微机
四.实验要求
本实验要求2学时完成。
本实验要求完成如下任务:
(1)建立相关的数据结构,作业控制块、已分配分区及未分配分区;
(2)实现一个分区分配算法,如最先适应分配算法、最优或最坏适应分配算法;
(3)实现一个分区回收算法;
(4)给定一批作业/进程,选择一个分配或回收算法,实现分区存储的模拟管理;
(5)将整个过程可视化显示出来。
实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。
实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。
五.实验提示
1、本实验虽然不以前面实验为基础,但建议在其界面中继续增加分区存储管理功能。
2、数据结构:
分区说明表,用数组实现。
3、存储管理:
建议采取固定分区法管理内存。
编写内存分配、内存回收算法。
4、主界面设计:
在界面上增加一个内存分配按钮、内存回收按钮、并将就绪队列显示区用做分区说明表的显示。
触发内存分配按钮,弹出作业大小输入框,输入后调用内存分配函数,在分区说明表中看到分配的分区。
触发内存回收按钮,弹出作业大小输入框,输入后调用内存回收函数,在分区说明表中看到回收分区状态的改变。
5、功能测试:
从显示出的分区说明表,可查看操作的正确与否。
实验步骤
1、主要数据结构设计
1).程序中自由链队列的结点类型可描述如下:
structfreelink{
intlen,address;/*len为分区长度;address为分区起始地址
structfreelink/*next;
}
2).内存占用区用链表描述,其结点类型描述如下:
structbusylink{
charname;/*作业或进程名name=’S’表示OS占用
intlen,address;
structbusylink*next;
}
3).设全程量:
structfreelink*free_head=NULL;//自由链队列(带头结点)队首指针
structbusylink*busy_head=NULL,//占用区队列队(带头结点)首指针
structbusylink*busy_tail=NULL;//占用区队列队尾指针
2、主要函数设计
1)requireMemo(charname,intrequire)
函数名称:
requireMemo(charname,intrequire)
功能描述:
在空闲区域链中找到第一个满足条件的结点,将其分配掉,如果结点的长度大于require,则剩下的又将作为一个空闲结点插入到空闲区域链中
输入参数:
charname,intrequire
输出参数:
无
程序流程图:
2、测试数据及运行结果
1)测试数据准备
假定系统的内存共640K,初始状态为操作系统本身占用64K。
在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完成;在t3时间之后,作业E请求50K的内存空间;在t4时间之后,作业D完成。
要求编程序分别输出t1、t2、t3、t4时刻内存的空闲区的状态。
2)运行结果及说明
a.测试目标:
运用按最佳适应算法[1](空闲区未归并时的)
运行结果:
b.测试目标:
运用按最佳适应算法(空闲区归并时的)
运行结果:
六、实验总结
本次实验采用最佳适应算法来分配内存,然后分别输出未进行内存回收时和进行回收时,每过5ms内存的分配情况,进行对比。
通过此次实验我对内存分配、以及回收有了更加深刻的认识。
七、程序源代码
按最先适应算法
#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->lenlen))//如果此结点还有多余,就此又重新插入到空闲区域链中(按照长度由小到大的次序排列)
{
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->lenlen))
{
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()
{
inti;
printf("空闲区未归并,请输入1,归并时请输入2:
\n");
scanf("%d",&i);
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);
if(i==2)
freeMemo('D');
printf("内存占用区为:
\n");
printlink1();
printf("内存空闲区为:
\n");
printlink();
return0;
}