
C++高并发内存池
文章平均质量分 79
学习Github上谷歌tcmalloc原型
https://gitee.com/mirrors/tcmalloc
NUC_Dodamce
醉生梦死谁成器,拓马长枪定乾坤。
展开
-
C++_项目高并发内存池结项——性能瓶颈分析与基数树进行性能突破,打包静态库
现在项目已经可以正常运行,但相比malloc来讲,在申请次数较少时性能比较差每轮申请10000次内存每轮申请100次文章目录1. 性能分析2. 使用基数树进行优化1. 性能分析VS2022下性能分析其次是:根据上图可知,消耗最大的是释放空间时合并Span到PageCache时锁消耗时间比较多,其次是通过页号找到对应的Span的哈希映射,加锁耗时比较大。2. 使用基数树进行优化基数树的定义...原创 2022-03-18 17:33:26 · 1874 阅读 · 0 评论 -
C++_项目高并发内存池——优化-测试与查错Span链表中自由链表尾未置空--与malloc在多线程的情况下对比性能
测试代码:#include"ConcurrentAlloc.h"//ntimes:一轮申请与释放内存的此时 rounds:一共测试几轮 nworks线程数void TestBenchMarkMalloc(size_t ntimes, size_t rounds, size_t nworks) { std::cout << "Malloc Test" << std::endl; std::vector<std::thread>ThreadPool(nworks原创 2022-03-16 13:40:51 · 1674 阅读 · 0 评论 -
C++_项目高并发内存池——优化(定长内存池配合脱离new申请空间)(释放空间时不需要传大小)
文章目录1. 定长内存池配合脱离new申请空间2. 释放空间时不需要传大小1. 定长内存池配合脱离new申请空间根据C++项目高并发内存池_定长内存池可知,使用定长内存池比直接new申请对象效率要高。在PageCache向系统申请内存时我们使用new创建了许多Span对象来管理向系统申请的大块内存,这个Span对象是new出来的。以及在线程创建属于自己的ThreadCache时,也使用了new来申请ThreadCache对象,我们可以联系定长内存池,把这些申请过程用定长内存池替代,效率更高。定长线程原创 2022-03-16 10:53:00 · 512 阅读 · 0 评论 -
C++项目高并发内存池_大于256KB的内存申请
紧跟C++项目高并发内存池_三层缓存文章目录C++代码Commen.h:添加了向直接向堆中释放空间SystemFree函数ConcurrentAlloc.h:添加了线程申请超过256KB空间情况PageCache:申请Span和释放内存过程添加了大于32页的情况单线程测试当申请内存小于256KB时,走前三层缓存获得内存。当申请内存大小大于256KB时就需要新的方法进行申请。256KB=32页(一页定义为8KB),直接向PageCache申请,并且记录申请的内存页号与span的对于关系。如果大于Pa原创 2022-03-15 19:06:34 · 2620 阅读 · 0 评论 -
C++项目高并发内存池_三层缓存释放内存过程设计与联调
文章目录ThreadCache释放内存,将一部分多余的空间节点链表给CentralCacheCentralCache将从ThreadCache获取的空间节点合并为Span(MergeSpan)PageCache将前后页号的从CentralCache获取的Span合并成一个大Span挂起多线程下测试代码位置紧跟高并发内存池申请内存联调接下来就是高并发内存池的内存释放过程ThreadCache释放内存,将一部分多余的空间节点链表给CentralCache如果ThreadCache中的FreeList中空间原创 2022-03-05 19:51:02 · 960 阅读 · 4 评论 -
C++项目高并发内存池_PageCache设计 以及 项目申请内存联调
紧跟CentralCache设计之后文章目录PageCache整体设计PageCache整体设计PageCache结构也是哈希桶结构,每个桶的数据都是Span链表。ThreadCache与CentralCache哈希桶的映射规律一致,PageCache哈希桶是根据页数分桶的。Span节点大小为一页的在哈希桶的第一个桶,Span大小为两页的在第二个桶依次类推CentralCache中Span节点被切分成小内存块给ThreadCache使用,而PageCache中的Span不切块。CentralCa原创 2022-03-04 21:10:44 · 665 阅读 · 0 评论 -
C++项目高并发内存池_CentralCache设计
文章目录CentralCache设计思路CentralCache设计思路当线程缓存没有内存时,要中心缓存申请内存。CentralCache被所有线程共有,需要加锁,为了减少竞争锁资源的力度,选择采用哈希桶锁的方式管理中心缓存层的内存。eg:如果线程1需要1号桶,线程2需要2号桶。桶的编号不同,锁不同所以不存在竞争。减少的锁的竞争。中心缓存中的以页为单位的大块空间靠span管理...原创 2022-03-03 11:46:36 · 966 阅读 · 0 评论 -
C++项目高并发内存池_ThreadCache设计
文章目录thread cache设计思路thread cache设计思路thread cache:每一个线程都有一个独立的空间,当线程都要申请空间(小于256KB)时直接在线程内部申请,不需要加锁竞争。根据之前设计的定长内存池可知,一条链表管理释放内存只能处理固定内存大小的情况如:这个自由链表每个节点都是4字节,这条链表只能处理申请4字节空间的情况。而实际线程申请的空间不一定是相同的所以这里需要多条链表来处理。多条链表用哈希桶来管理但是哈希桶中桶个数为多少合适呢,假设以8字节为一个桶这里选择原创 2022-03-01 14:54:15 · 941 阅读 · 0 评论 -
C++项目高并发内存池_整体框架设计
高并发内存池相比与malloc来讲,在多线程的场景下效率更高。这个内存池主要要考虑的问题是:性能多线程环境下,锁竞争问题内存碎片问题高并发内存池主要有3层线程缓存层(thread cache):每一个线程都有一个独立的空间,当线程都要申请空间(小于256KB)时直接在线程内部申请,不需要加锁竞争。中心缓存层(central cache):中心缓存是所有线程共享的空间,线程缓存是按需从中心缓存中获取的对象。当线程缓存的内存不够时向中心缓存申请空间,中心缓存在适当的情况下要回收线程缓存,避免原创 2022-02-28 15:10:22 · 496 阅读 · 0 评论 -
C++项目高并发内存池_定长内存池
文章目录思路C++代码Release与直接new开空间测试思路首先定义ObjectPool类,类成员(char*)_memory提前向系统申请内存。如果有申请内存的行为,则_memory指针向后移动,将分出的内存给要申请的地方。如果有归还内存的地方时,选择使用(void*)freeList链表将所有要归还内存链接起来但是要注意,归还内存内部保存的是下一个归还节点的地址,所以这个归还节点在32位下要大于4字节,64位下大于8字节。这个链表最后指向nullptr在链表内部的空间块中保存指向下一原创 2022-02-27 21:04:19 · 632 阅读 · 0 评论