动态内存分配算法实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档