4分区式储器管理.docx

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

4分区式储器管理.docx

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

4分区式储器管理.docx

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;

}

 

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

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

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

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