内存池的面试整理

文章详细描述了如何通过无锁机制实现线程安全的内存申请,涉及ThreadCacheTLS、freeList管理、内存对齐规则、哈希映射、中央缓存与页面缓存的协作,以及慢开始策略和内存释放流程。

文章思路来源

注意:不是面试官问的问题,我只是按照问答的形式进行整理

  • 如何实现无锁申请?
    • 每个线程申请自己的TreadCacheTLS对象,来管理自己的freeList数组。
  • 小内存的大小?
    • 0-256K,并且对申请到的内存进行字节对齐,保证申请到的内存可以映射到对应的freeList中。
    • 映射规则?
      • 从128字节开始每个区间8倍递增,从16(8到16是两倍)字节开始对齐每8倍递增,到256KB,8K对齐结束。每个区间为16,56,56,56,24,共208个freeList
    • 为什么从8字节开始对齐?让freeList保存下一个节点的地址,即使在64位系统下
  • freeList如何管理内存?
    • 将申请到的内存块头插到对应的freeList,每次需要内存就头删一个内存块。

  • 如何向centralCache申请内存?
    • 首先利用相同的哈希值(两个cache都包含相同数量的哈希桶)来得到对应的spanList,获取到一个span,里面存储的是切好size大小的freeList,并且物理空间是连续的。然后返回ThreadCache需要的内存块数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值