logo资料库

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

第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
资料共15页,剩余部分请下载后查看
动 态 内 存 分 配 算 法 实 验 报 告 院系:*****************学院 班级:************** 姓名:********** 学号:*************
一.实验题目:动态内存分配算法 二、实验目的 深入了解动态分区存储管理方式内存分配与回收的实现 三、实验要求 熟悉存储管理中动态分区的管理方式及 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
分享到:
收藏