4分区式储器管理Word文档格式.docx

上传人:b****5 文档编号:18921765 上传时间:2023-01-02 格式:DOCX 页数:14 大小:119.38KB
下载 相关 举报
4分区式储器管理Word文档格式.docx_第1页
第1页 / 共14页
4分区式储器管理Word文档格式.docx_第2页
第2页 / 共14页
4分区式储器管理Word文档格式.docx_第3页
第3页 / 共14页
4分区式储器管理Word文档格式.docx_第4页
第4页 / 共14页
4分区式储器管理Word文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

4分区式储器管理Word文档格式.docx

《4分区式储器管理Word文档格式.docx》由会员分享,可在线阅读,更多相关《4分区式储器管理Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

4分区式储器管理Word文档格式.docx

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<

windows.h>

#include<

stdio.h>

stdlib.h>

structfreelink

{

intlen,address;

//len为分区长度;

structfreelink*next;

};

//内存占用区用链表描述,其结点类型描述如下:

structbusylink

charname;

//作业或进程名name='

S'

表示OS占用

intlen,address;

structbusylink*next;

};

//并设全程量:

//自由链队列带头结点)队首指针?

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->

//创建占用链头结点

p=(structfreelink*)malloc(sizeof(structfreelink));

p->

address=64;

len=640-64;

//(OS占用了64K)

next=p;

q=(structbusylink*)malloc(sizeof(structbusylink));

q->

name='

;

/*S表示操作系统占用*/

len=64;

address=0;

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<

require))//找到第一个满足条件的空闲区

{

x=y;

y=y->

}

if(y!

=NULL)

p=(structbusylink*)malloc(sizeof(busylink));

p->

name=name;

address=y->

address;

len=require;

busy_tail->

//把p插入到busy_head的尾部

busy_tail=p;

w=x->

x->

next=w->

if(w->

len==require)

{

free(w);

}

else

w->

address=w->

address+require;

len=w->

len-require;

u=free_head;

v=free_head->

while((v!

(v->

w->

len))//如果此结点还有多余,就此又重新插入到空闲区域链中(按照长度由小到大的次序排列)

{

u=v;

v=v->

}

u->

next=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->

while((p!

=NULL)&

(p->

name!

=name))//找到要回收的结点

q=p;

p=p->

if(p==NULL)

%cisnotexist\n"

name);

else

if(p==busy_tail)

busy_tail=q;

q->

next=p->

len=p->

len;

address=p->

free(p);

w=(structfreelink*)malloc(sizeof(freelink));

w->

len=len;

address=address;

u=free_head;

v=free_head->

while((v!

(flag1==1||flag2==1))//归并算法

if((w->

address==(v->

address+v->

len))&

flag1)

s1=v;

u->

next=s1->

w->

address=v->

len+=v->

v=v->

flag1=0;

elseif(((w->

address+w->

len)==v->

address)&

flag2)

s2=v;

next=s2->

flag2=0;

else

if(s1!

free(s1);

if(s2!

free(s2);

if(v!

len))

voidpast(inttime)/*模拟系统过了时间time,用sleep(),或者用个空循环*/

Sleep(5);

时间%d后:

time);

voidprintlink()/*输出内存空闲情况(自由链的结点)*/

structfreelink*p;

p=free_head->

printf("

无空闲区!

while(p!

首地址:

%d\t长度:

%d\n"

p->

address,p->

len);

----------------------------------------\n"

voidprintlink1()/*输出内存占用的情况*/

无内存占有区!

名字:

%c\t首地址:

name,p->

//设计主函数:

intmain()

inti;

空闲区未归并,请输入1,归并时请输入2:

scanf("

%d"

&

i);

start();

past(5);

requireMemo('

A'

8);

B'

16);

C'

64);

D'

124);

内存占用区为:

printlink1();

内存空闲区为:

printlink();

past(10);

freeMemo('

past(15);

E'

50);

past(20);

if(i==2)

freeMemo('

);

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1