动
态
内
存
分
配
算
法
实
验
报
告
院系:*****************学院
班级:**************
姓名:**********
学号:*************
一.实验题目:动态内存分配算法
二、实验目的
深入了解动态分区存储管理方式内存分配与回收的实现
三、实验要求
熟悉存储管理中动态分区的管理方式及 Windows 环境下,VC++
程序设计方法
四、实验内容
1,确定定内存空闲分配表和进程内存分配表
2,采用首次适应算法完成内存空间的分配
3,采用最佳适应算法完成内存空间的分配
4,实现内存回收功能
五、实验结果
首次适应算法结果
最佳适应算法
最坏适应算法
六、实验总结
首次适应算法:从表头指针开始查找课利用空间表,将找到的第一个
大小不小于“请求”的空闲块的一部分分配给用户。
最佳适应算法:将可利用空间表中一个大小不小于“请求”且最接近
“请求”的空闲块的一部分分配给用户。
最坏适应算法:将可利用空间表中一个大小不小于“请求”且是链表
中最大的空闲块的一部分分配给用户。
以上是动态内存分配的三种算法思想,算法采用数据结构中的双
向链表实现。
附录(算法代码):
#include
#include
#define Free 0 //空闲状态
#define Used 1 //已用状态
#define OK 1
//完成
#define ERROR 0 //出错
#define MAX_length 32767 //最大内存
空间为 32767KB
typedef int Status;
符 Status 定义成一个数据型标识符
int n = 0;
typedef struct freearea { // 定义 一个 结
构体 freearea,并对这个空闲分区进行
说明
//typedef 将 标 识
//分区号
int ID;
long size;
//分区大小
long address; //分区地址
//当前状态
int state;
} ElemType;
typedef
linked list
储结构
struct DuLNode { //double
// 线性表的双向链表存
ElemType data;
struct DuLNode *prior; //前趋指针
struct DuLNode *next; //后继指针
} DuLNode, *DuLinkList;
DuLinkList free_list;
//空闲链表
DuLinkList alloc_list; //已分配链表
Status alloc(int);//内存分配
void free_memory(int ID, int method); //
内存回收
Status first_fit(int ID, int size); //首次适
应算法
Status best_fit(int ID, int size); //最佳适
应算法
Status worst_fit(int ID, int size); //最坏
适应算法
void
*insert); //首次适应插入排序
first_fit_insert(DuLNode
best_fit_insert(DuLNode
void
*insert);
void
*insert); //最坏适应插入排序
//最佳适应插入排序
worst_fit_insert(DuLNode
DuLNode *independent_node(DuLNode
*node); //断开节点 node 与相邻节点的
联系,使其孤立
//将节点 node 分割,返回分配的节点
信息,node 为剩余内存信息
//node 为双指针形式,因为可能需要对
node 的值进行修改
DuLNode
**node, int ID, int size);
*slice_node(DuLNode
void show();//查看分配
Status Initblock();//开创空间表
Status Initblock()// 开创带头节点的内
存空间链表,头节点不用
{
alloc_list
=
(DuLinkList)malloc(sizeof(DuLNode));
=
(DuLinkList)malloc(sizeof(DuLNode));
free_list
//头节点不用
alloc_list->prior = alloc_list->next
node->data.address = 0;
node->data.size = MAX_length;
node->data.ID = 0;
node->data.state = Free;
//将 node 节点放到空闲链表中
node->prior = free_list;
node->next = NULL;
free_list->next = node;
return OK;
= NULL;
NULL;
free_list->prior = free_list->next =
//空闲列表初始为整个内存大小,
放到 node 节点中
DuLNode
=
(DuLNode*)malloc(sizeof(DuLNode));
*node