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)