介绍
在该实验中,需要用C语言实现一个动态存储分配器(dynamic storage allocater)。需要实现malloc、free、realloc等功能。当然不仅要正确的实现相关功能也要满足速度效率等要求。
实验准备
- 实验材料:
原始实验包github下载
原始实验包中测试用的trace不存在,下面下载测试文件的链接:12 traces
本博主的实现的最终版本mm.c源文件 93/100分
执行make命令时可能出现以下问题
fatal error sys/cdefs.h no such file or directory
致命错误: sys/cdefs.h:没有那个文件或目录
出现此错误是因为在64位Linux操作系统中打算编译出32位的程序,解决方案
如下:sudo apt-get install build-essential libc6-dev libc6-dev-i386
- 必要知识:
《深入理解计算机系统》第二版第9章虚拟存储器的内容需要熟悉。特别是9.9节动态存储器分配中9.9.12节“综合:实现一个简单的分配器” 存储器实现的必要技术:
针对空闲块的组织方法有以下三种:
a.隐式空闲链表(implicit free list)
b.显式空闲链表(explicit free list)
c.分离空闲链表(segregated free list)查找空闲块的三个方法:
a.首次适应(first fit)
b.最佳适配(best fit)
c.下一次适配(next fit)
实验小建议
a.先最简单的开始实现,也即是书本上的范例隐式空闲链表的实现方法。然后一步步一次实现其他的方法
以下是我依次实现的其他两个版本
mm.c 隐式空闲链表+首次适配+原始realloc版
mm.c 显示空闲链表+首次适配+原始realloc版
mm.c 分离空闲链表+最佳适配+改进的realloc版b.最后的优化需要根据不同的trace进行分析优化
c.需要用到gdb调试,修改Makefile文件,对于编译命令加入
-g
字段,并且删除-02
优化字段,防止调试时出现怪异问题(i.e 调试时程序不是一行一行顺序 ,而是跳跃的)
最终版本实现的思路
- 空闲块的组织方法-segregated free list
segregated free list 中大小类的分类方法如下,并且将该list表放在heap的头部,通过序言块将它与数据隔离。在每一个大小类中,空闲块按照size由大到小排序。
PUT(heap_listp,0); /*block size list<=32*/
PUT(heap_listp+(1*WSIZE),0); /*block size list<=64*/
PUT(heap_listp+(2*WSIZE),0); /*block size list<=128*/
PUT(heap_listp+(3*WSIZE),0); /*block size list<=256*/
PUT(heap_listp+(4*WSIZE),0);