什么是匿名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的重复操作很慢