动态内存分配算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动
态
内
存
分
配
算
法
实
验
报
告
院系:计算机与通信工程学院班级:计科08-1班
**:***
学号:************
一.实验题目:动态内存分配算法
二、实验目的
深入了解动态分区存储管理方式内存分配与回收的实现
三、实验要求
熟悉存储管理中动态分区的管理方式及Windows环境下,VC++程序设计方法
四、实验内容
1,确定定内存空闲分配表和进程内存分配表
2,采用首次适应算法完成内存空间的分配
3,采用最佳适应算法完成内存空间的分配
4,采用最坏适应算法完成内存空间的分配
5,实现内存回收功能
五、实验结果
首次适应算法结果
最佳适应算法
最坏适应算法
六、实验总结
首次适应算法:从表头指针开始查找课利用空间表,将找到的第一个大小不小于“请求”的空闲块的一部分分配给用户。
最佳适应算法:将可利用空间表中一个大小不小于“请求”且最接近“请求”的空闲块的一部分分配给用户。
最坏适应算法:将可利用空间表中一个大小不小于“请求”且是链表中最大的空闲块的一部分分配给用户。
以上是动态内存分配的三种算法思想,算法采用数据结构中的双向链表实现。
附录(算法代码):
#include
#include
#define Free 0 //空闲状态
#define Used 1 //已用状态
#define OK 1 //完成
#define ERROR 0 //出错
#define MAX_length 32767 //最大内存空间为32767KB
typedef int Status; //typedef将标识符Status定义成一个数据型标识符
int n = 0;
typedef struct freearea { //定义一个结构体freearea,并对这个空闲分区进行说明
int ID; //分区号
long size; //分区大小
long address; //分区地址
int state; //当前状态
} ElemType;
typedef struct DuLNode { //double linked list // 线性表的双向链表存储结构
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 first_fit_insert(DuLNode *insert); //首次适应插入排序void best_fit_insert(DuLNode *insert); //最佳适应插入排序
void worst_fit_insert(DuLNode *insert); //最坏适应插入排序DuLNode *independent_node(DuLNode *node); //断开节点node与相邻节点的联系,使其孤立
//将节点node分割,返回分配的节点信息,node为剩余内存信息
//node为双指针形式,因为可能需要对node的值进行修改
DuLNode *slice_node(DuLNode **node, int ID, int size);
void show();//查看分配
Status Initblock();//开创空间表
Status Initblock()//开创带头节点的内存空间链表,头节点不用
{
alloc_list = (DuLinkList)malloc(sizeof(DuLNode));
free_list = (DuLinkList)malloc(sizeof(DuLNode));
//头节点不用
alloc_list->prior = alloc_list->next = NULL;
free_list->prior = free_list->next = NULL;
//空闲列表初始为整个内存大小,放到node节点中
DuLNode *node = (DuLNode*)malloc(sizeof(DuLNode));
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;