![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
tcmalloc
文章平均质量分 64
学代码的章北海
这个作者很懒,什么都没留下…
展开
-
【tcmalloc】(三)通用头文件的设计
哈希桶节点上挂的自由链表,不同模块都会使用。原创 2023-12-23 21:15:37 · 395 阅读 · 0 评论 -
【tcmalloc】(四)上层调用接口设计
提供给上一层用户申请内存调用,调用时会创建出当前线程的内存线程缓冲区,同时进入内存池逻辑。原创 2023-12-23 21:17:13 · 380 阅读 · 0 评论 -
【tcmalloc】优化方法
此项目本意是脱离malloc的使用,但若使用new的话仍然会使用到malloc。因为centralcache和pagecache本身是单例,不考虑创建对象的问题,但是每个线程自身拥有个线程缓冲区和span结构是要考虑new的问题的,引入定长内存池替换new可一提高效率。原创 2023-12-23 21:11:40 · 451 阅读 · 0 评论 -
【tcmalloc】(六)释放流程
tcmalloc的源码考虑了内存的大小和链表的长度。这里实现的是简单的版本之考虑了链表的长度。当释放内存块后会挂到线程缓冲区对应的自由链表上,当检测到当前自由链表的长度大于我们一次批量申请的大小之后就会将当前自由链表的一部分(一个批量)还给centralcacahe。不是全拿走,有可能有剩余个其他先线程使用。centralcache拿到以后要继续向pagecache归还。原创 2023-12-17 15:47:06 · 193 阅读 · 0 评论 -
【tcmalloc】(五)pagecache设计(申请)
用于给centralcache分配内存,也采取哈希桶结构。重点有两个区别,桶的划分规则跟上两层不一致。这一层没有采取区间划分,一页page是第一个桶两页是第二个,以此类推。第二个区别是自由链表同样悬挂的是span,但这里的span不用切分小块内存。在centralcache那一层直接计算出要申请多少页,直接定值法找到pagechace的桶节点进行申请。每一个桶节点的页表页数不相等。原创 2023-12-17 10:49:47 · 62 阅读 · 0 评论 -
【tcmalloc】(四)centralcache设计(申请)
中心cache,用于threadcache的桶节点没有自由链表时,向下寻找内存的下一层数据结构。起到均衡调度的作用。同样采取和线程缓存一样的哈希桶映射规则。这样方便能直接找到一下层的桶节点,不同点是中央内存区是所有线程共享的所以就有加锁问题。这里用的是桶锁。这样的优点是不同桶之间不会有竞争问题。不同线程申请不同大小的内存空间,会去不同的桶低下找空间。另一个不同点,线程内存区下挂的是大当前桶节点,同样大小的小内存。原创 2023-12-16 16:45:00 · 64 阅读 · 0 评论 -
【tcmalloc】(二)整体设计和thread cache(申请)
内存池需要考虑以下几方面的问题。1. 性能问题。2. 多线程环境下,锁竞争问题。3. 内存碎片问题(外碎片(内存不连续无法使用),内碎片(因为对齐规则的浪费))malloc 一进入多线程就加锁,tcmalloc有可能不用加锁。1.thread cache:线程缓存是每个线程独有的,用于小于256KB的内存的分配,线程从这里申请内存不需要加锁,,这也就是这个并发线程池高效的地方。原创 2023-12-14 16:22:25 · 92 阅读 · 0 评论 -
【模拟tcmalloc】(一)定长内存实现
固定大小的内存申请释放需求,特点是性能达到极致,不考虑内存碎片问题。原创 2023-12-13 21:00:00 · 57 阅读 · 0 评论