header需要必要的约束
- 首先,分配的内存块不需要free list的指针,bk,fd等
- 可以简单的删除它
- 需要注意访问方法
当我们转向malloc_chunk结构体来访问它时,可以看到存在fd,bk,实际上它们已经被用户应用所使用,如果访问会造成内存破坏
很难从源代码中读取
约束继续进行
- 经常要考虑的
- prev_size在free时候的合并处理是必要的
- 只有当prev处于free状态时,是必要的
- 只有在prev处于free状态时才记录prev_size
- 那么,如何确认prev是否是free状态(先有鸡还是先有蛋的问题)
32位系统的指针
- 最低2位固定是0
- glibc malloc实际上内部会取8的倍数,因此最低3位是0
- size记录两个指针之间的差,当然,最低3位同样是0
也就是说
size的最低一位用于记录prev的使用状态
结构体类型和内存中的数据结构不一致,这是为什么难以读区的原因
在时间序列中
显然,从malloc header直接访问malloc chunk会出错,因为fd,bk被用户应用所使用
free的时候会第一次写入fd,bk,prev_size
prev_in_use flag是1
size之外,malloc时不会确保,但它是free的,可以直接使用
源上的内存破坏很多
可以进行约束了吗
- 从某种意义上来说,今天的代码阅读是最难的一部分(其他部分是可读性很好的C语言)
- 接下来是最大的课题。malloc是典型的O(n),来解决这个问题吧
这里有一点主意
- 在free list中,不需要讲所有的列表都连接起来
- size是固定8的倍数
- best fit应当是O(1)