动态分区分配方式的模拟实验报告
一、实验目的
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态
分区存储管理方式及其实现过程的理解。
二、实验要求
用 C 语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程
alloc()和回收过程 free()。其中,空闲分区通过空闲分区链来管理;在进行
内存分配时,系统优先使用空闲区低端的空间。
三、实验内容
1.假设初始状态下,可用的内存空间为 640KB,并有下列的请求序列:
1 作业 1 申请 130KB。
2 作业 2 申请 60KB。
3 作业 3 申请 100KB。
4 作业 2 释放 60KB。
5 作业 4 申请 200KB。
6 作业 3 释放 100KB。
7 作业 1 释放 130KB。
8 作业 5 申请 140KB。
9 作业 6 申请 60KB。
10 作业 7 申请 50KB。
11 作业 6 释放 60KB。
请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每
次分配和回收后显示出空闲内存分区链的情况。
四、实验结果
1
五、实验小结
在做这个实验的过程中,我遇到了很多问题,而且很多地方很多地方考虑不
全面,比如:链表指针部分和内存回收时空闲区的合并部分。
首次适应算法中,空闲分区链是按地址递增的次序链接的,当要分配内存空
间时,就查表,在各空闲分区中查找满足大小要求的可用块,只要找到第一个足
以满足要求的空间就停止查找,并把它分配出去,如果该空闲空间与所需空间大
小一样,则将该分区 的状态改为 1,即已被分配,若还有剩余,则将剩余空间
重新划为一个空闲分区,有新的起始地址,状态为 0。
最佳适应算法的空闲链是按照空闲块的大小为序、 按增量方式排列的,即
4
小块在前,大块在后,它在满足需要的前提下,尽量分配最小的空闲块,这样每
次查找分配时第 1 次找到的能满足要求的必然的最佳的, 若空闲空间大小与要
分配的大小相差不多时, 可 直接将其状态改为 1 即可,若有剩余,则将剩余
空闲空间重新划分为一个空闲区,并根 据空闲区的大小对链表进行重新排序。
动态分区常用的数据结构有空闲分区表和空闲分区链,用来记录内存的使用
情况, 此题中我采用的是空闲分区链的结构, 用链指针将所有的分区链接成一
条链, 每个分区 的结构如下所示:
struct memory
{
struct memory *former;
int address;//地址
int num;//作业号
int size;//分配内存大小
int state;//状态 0 表示空闲 1 表示已分配
struct memory *next;
};
前向指针和后向指针分别用于与当前分区的前后分区相链接,address 用于
说明当前分区的起始地址,状态字为 0 时表示当前分区空闲,为 1 时表示已分配,
num 为分配的作业号,size 表示分配的内存大小。
这些都是在做的过程中逐步完善的, 所遇到的这些问题通过查阅资料得以
解决。题目做完后,我对内存动态分区部分又有了更加深刻的理解,我个人的编
程能力也得到了一定程度的提高。
六、附录
#include
#include
#include
using namespace std;
struct memory
{
5
struct memory *former;
int address;//地址
int num;//作业号
int size;//分配内存大小
int state;//状态 0 表示空闲 1 表示已分配
struct memory *next;
};
typedef struct memory MEMORY;
MEMORY *mem;
const int size_min=10;//内存允许的最小空闲块的大小
bool is_optimist=false;//判断是否是最佳适应算法
void init();
void FF();
void alloc(MEMORY *,MEMORY *);//首次适应算法分配内存
void free(MEMORY *);//首次适应算法回收内存
void sort(MEMORY *);//对内存链进行排序
void insert(MEMORY *,MEMORY *);
void free_optimist(MEMORY *);
void print(MEMORY *);//打印内存链
void main()
{
int i=0;
while(1)
{
cout<<("\nPlease select a number(1,2,0)");
cout<<("\n 1--首次适应算法");
cout<<"\n 2--最佳适应算法"<>i;
if(i==1)
{
cout<<("\nThis is an example for FF:\n");
is_optimist=false;
init();
6
FF();
}
else if(i==2)
{
cout<<"\nThis is an example for optimist method;\n";
is_optimist=true;
init();
FF();
}
else if(i==0)
{
exit(1);
}
}
}
void init()
{
mem=new MEMORY;
mem->size=640;
//mem->state=0;
mem->former=0;
mem->next=0;
}
void FF()//首次适应算法
{
int i;
int work[]={130,60,100,200,140,60,50};//作业序列
//int assignment;
MEMORY *running;
for(i=0;i
running->former=NULL;
running->address=0;
running->num=i+1;
running->size=work[i];
running->state=0;
running->next=NULL;
//cout<<"作业初始化成功"<num<