当前位置:文档之家› 计算机操作系统动态分区存储管理方式下的内存空间的分配及回收实验报告

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

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

计算机操作系统

实验报告

实验二

实验题目:存储器管理

系别:计算机科学与技术系

班级:

姓名:

学号:2

一、实验目的

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

二、实验容

编写程序完成动态分区存储管理式下的存分配和回收的实现。具体容包括:确定用来管理存当前使用情况的数据结构;

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

分情况对作业进行回收;

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

三、实验原理

分配:动态分区存储管理式把存除OS占用区域外的空间看作一个大的空闲区。当作业要求装入存时,根据作业需要存空间的大小查询存中各个空闲区,当从存中找到一个大于或等于该作业大小的存空闲区时,选择其中一个空闲区,按作业要求划出一个分区装入该作业。

回收:作业执行完后,它所占用的存空间被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。四、实验法

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

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

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

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

五、实验步骤

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

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

配”)

●空闲分区表:起始地址、长度、标志(0表示“空表项”,1表示“未

分配”)

struct used_table {

float address; //已分分区起始地址

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

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

char zuoyename;

}; //已分配区表

Struct free_table[ {

float address; //空闲分区起始地址

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

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

}; //空闲分区表

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

●首次适应算法:为作业分配存,要求每次找到一个起始地址最小的适合作

业的分区(按起始地址递增排序)。

●最大碎片size:要求当找到的空闲分区-作业的大小的值小于或等于size

时,将该分区全部分配给作业(数组后面元素向前移);

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

闲分区长度=空闲分区长度-作业长度,

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

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

1、上邻:条件:回收作业的始址=某个空闲区的始址+长度

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

2、下邻:条件:回收作业的始址+作业的长度=某个空闲区的始址

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

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

3、上下邻:条件:1,2条件同时成立

操作:空闲区的始址=上邻的始址

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

删除下邻

4、无上下邻:

操作:找flag=0的行

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

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

六、实验代码

# include

# include

#define M 10 //允的空闲区表长最大为m

#define N 10 //允的最大作业数量为n

#define MIN 1 //碎片的最大值

#define SADDRESS 200 //空闲分区初始的起始地址

#define SLENGTH 150000 //空闲分区的初始长度

struct used_t{

float address; //已分分区起始地址

float length; //已分分区长度

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

}used_table[N];

struct free_t{

float address; //空闲分区起始地址

float length; //空闲分区长度

int flag; //空闲分区表登记栏目用0表示空栏目,1表示

未分配

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

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

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

void main(){

int i,a;

float zyl;

char zyn;

//空闲分区表初始化

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){case 0: //当选择0时退出程序

return;

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

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

cin>>zyn>>zyl;

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

break;

}

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

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

cin>>zyn;

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

break;}

case 3: { //a=3 显示主存情况,输出空闲区表和已分配区表cout<<"\n输出空闲区表:"<

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

for(i=0;i

相关主题
文本预览
相关文档 最新文档