注意:不是面试官问的问题,我只是按照问答的形式进行整理
- 如何实现无锁申请?
- 每个线程申请自己的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需要的内存块数。

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

被折叠的 条评论
为什么被折叠?



