malloc/free

 

  • 设计特点:分区段管理以1MB为粒度(方便归还group给操作系统),bitmap应用,多对双向链表负责不同大小内存块管理,嵌入式指针,缓式回收。
  • 初始化,会向操作系统拿一块内存作为malloc管理内存的基本数据结构,比如header和region等数据结构。
  • malloc初始设有16个header,一个header管理1MB内存,一个header里有32+64位bit(猜测32bit用来指示group使用情况,64bit指示上次使用的group64对链表),还有有两根指针,一根指向管理区域region,一根指向管理的1MB内存。一个region有一个指示性index (当前应该分配第几个group),32*64bit数组和32个group。32个group对应1MB内存,每个group管理32KB,8页。32*64bit数组,每64bit对应一个group中64对链条的状态(01表示该对链表是否挂有区块)。一个group有64对指针和一个int计数器。分配一次计数器加一,释放一次计数器减一。每一个group有64对指针,第 i 对负责 i * 16 字节区块的管理,依次类推,最后一对负责大于1024字节的内存。
  • 初始8页都挂在group最后一对链条上。
  • 每次分配内存时先做边界调整,然后去64对中对应的那一对链表去拿(比如要130h,130h/16 - 1 = 18,应该由第18对链表服务),如果该对没有挂可分配的区块,就向后去寻找可分配的链表。或者拿新的group。
  • free一次,检查是否需要合并操作,若能够合并先做合并,然后将空闲区块挂回对应的链条(比如要130h,130h/16 - 1 = 18,应该由第18对链表服务),合并至多能合并到8页都挂在group最后一对链条上。
  • 相邻区块合并需要借助cookie,合并操作的目的避免过多碎片的产生。
  • 判断一个group是否全回收的条件是group计数器是否为0。
  • 缓式设计(两个全回收group释放一个),回收一个group的时候,会有一个指针指向该header,当下一个group全回收,就归指针所指group。
  • 边界标记设计:上下cookie,记录区块大小,和该块是否被使用,0表示未使用,1表示已使用。

 

posted @   stu--wy  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示