当前位置: 首页 > news >正文

LinuxC++项目开发日志——高并发内存池(2-整体框架设计)

文章目录

  • 高并发内存池整体框架设计
    • 一、引言:多线程内存分配的挑战
    • 二、整体架构设计理念
      • 一、Thread Cache:无锁分配
      • 二、Central Cache:智能调度中心
      • 三、Page Cache:内存碎片终结者

高并发内存池整体框架设计

一、引言:多线程内存分配的挑战

现代开发环境普遍采用多核多线程架构,在内存申请场景下,必然存在激烈的锁竞争问题。malloc本身已经是一种优秀的内存分配器,但我们项目的原型tcmalloc在多线程高并发场景下表现更为出色。因此,我们在实现内存池时需要重点考虑以下三方面问题:

  • 性能问题

  • 多线程环境下的锁竞争问题

  • 内存碎片问题

二、整体架构设计理念

三级缓存分层架构:Thread Cache → Central Cache → Page Cache。每层职责分明,协同工作

thread cache:线程缓存是每个线程独有的,用于分配小于256KB的内存。线程从这里申请内存不需要加锁,每个线程独享一个cache,这是并发内存池高效的关键所在。

central cache:中心缓存是所有线程共享的,thread cache按需从central cache中获取对象。central cache会在合适的时机回收thread cache中的对象,避免一个线程占用过多内存而其他线程内存不足,从而实现内存分配在多个线程间的均衡调度。central cache存在竞争,因此从这里获取内存对象需要加锁。这里采用桶锁机制,而且只有在thread cache没有内存对象时才会访问central cache,所以竞争不会很激烈。

page cache:页缓存是位于central cache之上的缓存层,以页为单位存储和分配内存。当central cache没有内存对象时,会从page cache分配一定数量的页,并将其切割成定长大小的小块内存分配给central cache。当一个span的多个页的对象都被回收后,page cache会回收central cache中满足条件的span对象,并且合并相邻的页组成更大的页,从而缓解内存碎片问题。

在这里插入图片描述

一、Thread Cache:无锁分配

核心特性

  • 线程独享,完全无锁操作

  • 处理256KB以下的小内存分配

  • 90%以上的分配请求在此完成

关键设计

  • 线程本地存储(TLS)实现

  • 多规格空闲链表管理

  • 自动水位控制与内存回收

二、Central Cache:智能调度中心

核心作用

  • 全局内存资源池

  • 线程间内存负载均衡

  • 连接Thread Cache与Page Cache

创新设计

  • 桶锁机制:细粒度锁降低竞争

  • 按需分配:仅在需要时介入

  • 批量传输:减少锁竞争频率

三、Page Cache:内存碎片终结者

核心使命

  • 以页为单位管理系统内存

  • 解决外部碎片问题

  • 大内存直接分配

关键技术

  • Span结构管理连续内存页

  • 相邻空闲页合并算法

  • 碎片整理与内存复用


文章转载自:

http://ghQzlh4g.jbgzy.cn
http://XEfLKzLw.jbgzy.cn
http://N584ZysW.jbgzy.cn
http://BVIygrYq.jbgzy.cn
http://dbLV5wbj.jbgzy.cn
http://xnBfo7yg.jbgzy.cn
http://vzWZLRfO.jbgzy.cn
http://jVXyzKig.jbgzy.cn
http://Ob779fWg.jbgzy.cn
http://XgVjIGHk.jbgzy.cn
http://5nK2r7CD.jbgzy.cn
http://c5QsKFqI.jbgzy.cn
http://xPJ0QUKa.jbgzy.cn
http://yjEhlQMz.jbgzy.cn
http://xYPTTL6H.jbgzy.cn
http://U2UJvfpg.jbgzy.cn
http://8ceBztdn.jbgzy.cn
http://TTAYiKXS.jbgzy.cn
http://rn4C3qak.jbgzy.cn
http://8U4c0uCy.jbgzy.cn
http://k2DYaTpn.jbgzy.cn
http://PhB7w3E6.jbgzy.cn
http://WkNz0FSo.jbgzy.cn
http://kc06bYJq.jbgzy.cn
http://RCeDUv8J.jbgzy.cn
http://5aI5eLe8.jbgzy.cn
http://DBJtsGMy.jbgzy.cn
http://7YY6ySDG.jbgzy.cn
http://EkbSeaqy.jbgzy.cn
http://Kzv4kV3u.jbgzy.cn
http://www.dtcms.com/a/369302.html

相关文章:

  • DeepSeek辅助编写在windows中利用mingw编写用到内存映射文件和expat功能的C程序
  • 【前端教程】JavaScript 实现爱好选择与全选/全不选功能
  • 安全产业 出海行动 | 安贝斯受邀参加第六届非传统安全(杭州)国际论坛:靠近国际前沿 拓宽国际视野
  • Ruoyi-vue-plus-5.x第五篇Spring框架核心技术:5.1 Spring Boot自动配置
  • 一招快速识别你的电脑是机械硬盘还是固态硬盘
  • Centos7中部署Dify
  • 微服务架构下生鲜订单分布式事务解决方案指南
  • 电机试验平台:从实验到应用的创新突破
  • GitHub每日最火火火项目(9.5)
  • 十一、标准化和软件知识产权基础知识
  • B.50.10.07-分布式锁核心原理与电商应用
  • 语音识别系统的技术核心:从声音到文字的智能转换
  • WALLX全球大使圆桌论坛成功举办,13国代表共话未来,超千人共同参与
  • 本地化部署 DeepSeek
  • 开讲啦|MBSE公开课:第五集 MBSE中期设想(下)
  • Axure笔记
  • AMD三箭齐发:MI350已成AI加速器新王牌,256颗GPU的MI500“王炸”已预定2027
  • Docker Registry 实现原理、适用场景、常用操作及搭建详解
  • CAD:绘图功能
  • DeepSeek vs Anthropic:技术路线的正面冲突
  • spring cloud中使用openFeign时候get请求变post解决办法
  • 系统学习算法 专题十八 队列+宽搜
  • 【c++】c++第一课:命名空间
  • Graphpad 绘图(二):小鼠生存曲线绘制与数据记录分析详解
  • DNS基本功能搭建
  • C++Primerplus 编程练习 第十二章
  • 看见世界的另一种可能:Deepoc星眸(StarGaze)如何为视障生活带来曙光
  • Springboot实现国际化(MessageSource)
  • 告别Qt Slider!用纯C++打造更轻量的TpSlider组件
  • 数字孪生赋能:智能制造如何实现从“经验驱动”到“数据驱动”?