计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc

上传人:b****2 文档编号:389225 上传时间:2022-10-09 格式:DOC 页数:9 大小:55KB
下载 相关 举报
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc_第1页
第1页 / 共9页
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc_第2页
第2页 / 共9页
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc_第3页
第3页 / 共9页
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc_第4页
第4页 / 共9页
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc

《计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc》由会员分享,可在线阅读,更多相关《计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc(9页珍藏版)》请在冰豆网上搜索。

计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告.doc

计算机操作系统

实验报告

实验二

实验题目:

存储器管理

系别:

计算机科学与技术系

班级:

姓名:

学号:

2

一、实验目的

深入理解动态分区存储管理方式下的内存空间的分配与回收。

二、实验内容

编写程序完成动态分区存储管理方式下的内存分配和回收的实现。

具体内容包括:

确定用来管理内存当前使用情况的数据结构;

采用首次适应算法完成内存空间的分配;

分情况对作业进行回收;

编写主函数对所做工作进行测试。

三、实验原理

分配:

动态分区存储管理方式把内存除OS占用区域外的空间看作一个大的空闲区。

当作业要求装入内存时,根据作业需要内存空间的大小查询内存中各个空闲区,当从内存中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业要求划出一个分区装入该作业。

回收:

作业执行完后,它所占用的内存空间被收回,成为一个空闲区。

如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。

四、实验方法

实现动态分区的分配与回收,主要考虑三个问题:

第一、设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域(利用结构体类型数组来保存数据);

第二、在设计的数据表格基础上设计内存分配算法(采用首次适应算法找合适的分区(对空闲分区表进行排序),分配时要考虑碎片问题);

第三、在设计的数据表格基础上设计内存回收算法(分四种情况进行回收(上邻、下邻、上下邻和无相邻分区)。

五、实验步骤

第一,设计记录内存使用情况的数据表格

l已分配分区表:

起始地址、长度、标志(0表示“空表项”,1表示“已分配”)

l空闲分区表:

起始地址、长度、标志(0表示“空表项”,1表示“未分配”)

 structused_table{

floataddress;//已分分区起始地址

floatlength;//已分分区长度,单位为字节

intflag;//已分配表区登记栏标志,用0表示空栏目,

charzuoyename;

};//已分配区表

Structfree_table[{

floataddress;//空闲分区起始地址

floatlength;//空闲分区长度,单位为字节

intflag;//空闲分区表登记栏目用0表示空栏目,1表示未配

};//空闲分区表

第二,在设计的表格上进行内存分配

l首次适应算法:

为作业分配内存,要求每次找到一个起始地址最小的适合作业的分区(按起始地址递增排序)。

l最大碎片size:

要求当找到的空闲分区-作业的大小的值小于或等于size时,将该分区全部分配给作业(数组后面元素向前移);

l否则,给作业分割出一部分空间时,其余部分仍作为新的空闲分区登记(空闲分区长度=空闲分区长度-作业长度,

l空闲分区起始地址=空闲分区起始地址+作业长度

第三,在设计的表格上进行内存回收。

1、上邻:

条件:

回收作业的始址=某个空闲区的始址+长度

操作:

空闲区的长度=空闲区的长度+作业的大小

2、下邻:

条件:

回收作业的始址+作业的长度=某个空闲区的始址

操作:

空闲区的始址=回收作业的始址

空闲区的长度=空闲区的长度+作业的长度

3、上下邻:

条件:

1,2条件同时成立

操作:

空闲区的始址=上邻的始址

空闲区的长度=上邻的长度+作业的长度+下邻的长度

删除下邻

4、无上下邻:

操作:

找flag=0的行

空闲区的始址=回收作业的始址

空闲区的长度=作业的长度

六、实验代码

#include

#include

#defineM10//允许的空闲区表长最大为m

#defineN10//允许的最大作业数量为n

#defineMIN1//碎片的最大值

#defineSADDRESS200//空闲分区初始的起始地址

#defineSLENGTH150000//空闲分区的初始长度

structused_t{

floataddress;//已分分区起始地址

floatlength;//已分分区长度

intflag;//已分配表区登记栏标志,用0表示空栏目

}used_table[N];

structfree_t{

floataddress;//空闲分区起始地址

floatlength;//空闲分区长度

intflag;//空闲分区表登记栏目用0表示空栏目,1表示未分配

}free_table[M];//空闲分区表

voidallocate(char,float);//分配算法子程序

voidreclaim(char);//回收算法子程序

voidmain(){

inti,a;

floatzyl;

charzyn;

//空闲分区表初始化

free_table[0].address=SADDRESS;//空闲分区表的起始地址

free_table[0].length=SLENGTH;//空闲分区表的长度

free_table[0].flag=1;//标志位置1表示未分配

for(i=1;i

{ free_table[i].address=0;

free_table[i].length=0;

free_table[i].flag=0;}//0表示空栏目

//已分分区表初始化

for(i=0;i

{ used_table[i].address=0;

used_table[i].length=0;

used_table[i].flag=0;}

while

(1){cout<<"请选择功能项:

"<

<<"1-分配主存"<

<<"2-回收主存"<

<<"3-显示主存"<

<<"0-退出"<

<<"选择功能项(0-3):

";

cin>>a;

switch(a){case0:

//当选择0时退出程序

return;

case1:

{//a=1分配主存空间

cout<<"\n请输入作业名zyn和作业所需长度zyl(作业名为一个字符,长度zyl要小于"<

"<

cin>>zyn>>zyl;

allocate(zyn,zyl);//为作业zyn分配主存空间

break;

}

case2:

{//a=2回收主存空间

cout<<"\n请输入要回收分区的作业名:

";

cin>>zyn;

reclaim(zyn);//回收作业zyn的主存空间

break;}

case3:

{//a=3显示主存情况,输出空闲区表和已分配区表

cout<<"\n输出空闲区表:

"<

<<"起始地址分区长度标志"<

for(i=0;i

if(free_table[i].flag!

=0)

cout<

<

cout<<"\n按任意键,输出已分配区表……";

cin.get();

cout<<"\n输出已分配区表:

"<

<<"起始地址分区长度标志"<

for(i=0;i

if(used_table[i].flag!

=0)//输出已分配给作业的表目

cout<

<

break;}

default:

{

cout<<"\n没有该选项!

"<

break;

}}}

cin.get()}//分配算法子程序

voidallocate(charzyn,floatzyl)

{floatad;

intk=-1;

inti=0;

while(i

{//找空间大于zyl的最小空闲区登记项k

if(free_table[i].length>=zyl&&free_table[i].flag==1)

k=i;

i++;}

if(k==-1)

{//未找到可用空闲区,返回

cout<<"无可用空闲区!

"<

return;}

/*找到可用空闲区,开始分配:

若空闲区大小与作业要求分配的空间差小于MIN,则将找到的空闲区全部分配给该作业;若空闲区大小与要求分配的空间的差大于minisize,则从空闲区划出一部分分配给作业。

*/

if(free_table[k].length-zyl<=MIN)

{free_table[k].flag=0;

ad=free_table[k].address;

zyl=free_table[k].length;

for(i=k;i

free_table[i]=free_table[i+1];}

else{

free_table[k].length=free_table[k].length-zyl;

ad=free_table[k].address;

free_table[k].address=free_table[k].address+zyl;

}

/*修改已分配区表*/

i=0;

while(used_table[i].flag!

=0&&i

used_table[i].address=ad;

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

当前位置:首页 > 考试认证 > IT认证

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

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