什么是匿名mmap?

  • mmap最初是一个将文件映射到内存中的系统调用
  • 但是,如果将”/dev/zero”作为fd参数传递,它可以用作内存预留API
  • 使用此API,mmap可以直接从kernel中获取Huge Block(默认情况下超过128k字节),而不是从heap获取

再次回顾一下size的低位bit

低位第二个bit是IS_MMAPED标志位

另一个标志位如果是ON,那么将不是从free list获取而是通过MMAP。free的时候也不会连接到free list,而是使用munmap().

数据构造图解

不存在free状态的huge,因为它在释放的同时返回到操作系统

这种方式的优点

  • Huge Block的malloc,free都是O(1)
  • 不容易产生碎片空间(因为它不需要管理列表)
  • 内存浪费少(由于以相同size再次进行malloc的概率很小,因此立即将其返回给操作系统是一个明智的策略)

目前已有的结果

变好的地方:

  • malloc是典型的O(1)
  • free是典型的O(1)
  • 碎片现在很难出现
  • header size实际上是4bit
  • 当发生brk时,K&R malloc需要对freelist进行一次遍历,这种方式只需要找到比要求的size大的bin,平均探索花费是1/2

变差的地方:

  • ???

即便如此

实际上还是输给了K&R malloc

因为实际上,large size block的malloc->free->malloc的重复操作很慢