高并发内存池项目(TCmalloc--mini版)
文章平均质量分 63
Gay~
Those times you get up early you work hard,Those times you stay up late and you word hard,Those times when you don't feel like working,you too tired,you don't want to push yourself,but you do it anyway,That is actually the dream,That's the dream,it's not the destnation,it's the journey.
展开
-
高并发内存池项目(TCmalloc--mini版)(代码实现完整版)
kobe082410/高并发内存池 - 码云 - 开源中国 (gitee.com)原创 2023-09-02 00:17:44 · 66 阅读 · 0 评论 -
十一、做高并发内存池项目过程中遇到的bug以及调试bug的方法和心得
第三个bug出现在释放内存的判断条件上,自己定义的变量MAX_BYTES和C++库里面定义的一个宏MAXBYTES混到了一起,本来是用自己定义的这个MAX_BYTES变量作为判断条件的,但是手误写成了C++库中的宏MAXBYTE,导致释放内存的时候出现了很严重的问题,这个bug调试了三天才调试出来,真的很坑。由于这个项目都是内存分配的问题,出现bug非常不好查,总之一句话,写的时候认真认真再认真,重要的事情说三遍,不然一个bug够你调3天的了。不妨来评论区留言一下,让更多的小伙伴能够早早避坑吧!原创 2023-09-02 00:11:18 · 861 阅读 · 0 评论 -
九、idSpanMap使用基数树代替原本的unordered_map 十、使用基数树前后性能对比
基数树说白了也是一种哈希结构,基数树分为一层基数树,两层基数树,三层基数树。原创 2023-09-01 23:07:41 · 255 阅读 · 0 评论 -
八、性能测试
一路点进去就会发现最终的耗时多的罪魁祸首就是在锁的竞争上,因为锁竞争本来在时间成本上就是最多的,所以我们要想提高内存池的性能就应该思考我们该如何减少锁竞争的问题。现阶段我们写的内存池的性能还比不上malloc,所以这样的内存池也将毫无意义,所以我们要进一步分析一下我们的内存池究竟慢在哪里?通过性能分析报告可知性能的瓶颈点主要在于ConcurrentFree函数的调用,耗时的占比最高。原创 2023-09-01 23:01:25 · 263 阅读 · 0 评论 -
七、高并发内存池--Page Cache
PageCache是以span的大小(以页为单位)和下标一一对应为映射关系的哈希桶,下标是几就说明这个哈希桶下挂的span的大小就是几页的,是绝对映射的关系。因为PageCache也是全局只有唯一一个的,所以为了防止出现线程安全的问题,在访问PageCache之前要先加上一把大锁锁住整个PageCache,为什么这里是加一把大锁锁住整个PageCache而不是加桶锁锁住要访问的那个桶呢?原创 2023-09-01 23:00:04 · 280 阅读 · 0 评论 -
六、高并发内存池--Central Cache
central cache也是一个哈希桶结构,他的哈希桶的映射关系跟thread cache是一样的。不同的是他的每个哈希桶位置挂是SpanList链表结构,不过每个映射桶下面的span中的大内存块被按映射关系切成了一个个小内存块对象挂在span的自由链表中。如果在thread cache中申请不到内存就会到central cache的同一个位置申请,thread cache和central cache的哈希桶的映射关系是完全一致的。中心缓存central cache是如何工作的?原创 2023-09-01 22:58:08 · 146 阅读 · 0 评论 -
五、高并发内存池--Thread Cache
thread cache是哈希桶结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表。每个线程都会有一个thread cache对象,这样每个线程在这里获取对象和释放对象时都是无锁的。每一个线程都有一个自己的Thread Cache,即每个线程在向自己的Thread Cache申请内存时是线程安全的,无需加锁,线程之间是不会相互产生影响的,所以大大加快了申请内存的效率。但是每一个线程是在什么时候创建这个自己的Thread Cache的呢?又是怎么创建的呢?原创 2023-09-01 22:56:25 · 148 阅读 · 0 评论 -
四、高并发内存池整体框架设计
现代很多的开发环境都是多核多线程,在申请内存的场景下,必然存在激烈的锁竞争问题。malloc本身其实已经很优秀,那么我们项目的原型TCmalloc就是在多线程高并发的场景下更胜一筹,所以这次我们实现的内存池需要考虑以下几方面的问题。concurrent memory pool主要由以下3个部分构成:1、thread cache:线程缓存是每个线程独有的,用于分配小于256KB的内存的,线程从这里申请内存不需要加锁,每个线程独享一个thread cache,这也就是这个并发线程池高效的地方。原创 2023-09-01 22:54:29 · 246 阅读 · 0 评论 -
三、定长内存池
我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以使用,而什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们就先来设计一个定长内存池作为一个开胃菜,当然这个定长内存池在后面的高并发内存池中也是有价值的,所以学习他目的有两层,第一是先熟悉一下简单内存池是如何控制的,第二是它会作为我们后面内存池的一个基础组件。原创 2023-09-01 22:51:10 · 253 阅读 · 0 评论 -
一、项目介绍 二、什么是内存池?
当前项目是实现一个高并发的内存池,它的原型是google的一个开源项目TCmalloc,TCmalloc全称是Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。这个项目是把TCmalloc最核心的框架简化后拿出来,模拟实现出一个自己的mini版的高并发内存池,目的就是学习TCamlloc的精华部分,而并非造一个更好的轮子。原创 2023-09-01 22:49:21 · 269 阅读 · 0 评论