<C++项目>高并发内存池

news2024/12/21 19:39:13

项目介绍:

原型是goole的开源项目tcmalloc(全称:Thread-Caching Malloc),用于替代系统的内存分配相关的函数(malloc, free).知名度非常高。

项目要求知识储备和难度:

会用到C/C++、数据结构(链表、哈希桶)、操作系统内存管理、单例模式、多线程、互斥锁等等。

什么是内存池

池化技术

所谓“池华技术”,就是程序先向系统申请过量的资源,

内存池要解决的两个问题

一)效率问题:

举个例子,我们向家里要生活费,有两种方式;

  • 每次要花钱时都去找爸爸妈妈。

  • 一次把一个月的生活费拿完,自己每次要花钱的时候就去自己的小钱包就可以了。

内存池就是这样,一次申请过量的内存,要用的时候直接去自己申请的内存池中去拿就可以了。

二)内存碎片的问题:

内存碎片的分类:

a、外碎片

b、内碎片

malloc

C/C++中我们要动态申请都是通过malloc去申请内存的,但是我们要知道,实际我们不是直接去申请内存的,malloc实际就是一个内存池,如下图,malloc()相当于向操作系统“批发”了较大部分的内存,然后零售给程序用 ,不同平台实现的malloc有所不同,而我们这里介绍的tcmalloc是一种在多线程情况下更快的实现方式。

循序渐进---设计一个定长的内存池

我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以使用,但是什么场景下都可以使用就意味着什么场景下都不会有很高的性能,下面我们来设计一个定长的内存池过过度,同时它是作为我们最终项目实现了一个基础组件。

解决问题:固定大小的内存申请释放需求

特点:

  1. 性能达到极致

  1. 不考虑内存碎片等问题

自由链表:管理那些换回来的内存块,将下一个内存块的地址存放在当前结点的头四个字节处。可以通过*(void**)来实现,原因是不同位的机器地址长度不同。后续的结点加入通过头插来实现。

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

现代很多的开发环境都是多核多线程,在申请内存的场景下,必然存在激烈的锁竞争问题。malloc本身其实已经很优秀,那么我们项目的原型tcmalloc就是在多线程高并发的场景下更胜一筹,所以我们这次实现的内存池需要考虑以下几个方面的问题。

  1. 性能问题。

  1. 多线程环境下,锁竞争问题。

  1. 内存碎片问题。

concurrent memory pool主要由以下3个部分构成:

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

2. central cache:中心缓存是所有线程所共享,thread cache是按需从central cache中获取的对 象。central cache合适的时机回收thread cache中的对象,避免一个线程占用了太多的内存,而 其他线程的内存吃紧,达到内存分配在多个线程中更均衡的按需调度的目的。central cache是存 在竞争的,所以从这里取内存对象是需要加锁,首先这里用的是桶锁,其次只有thread cache的 没有内存对象时才会找central cache,所以这里竞争不会很激烈。

3. page cache:页缓存是在central cache缓存上面的一层缓存,存储的内存是以页为单位存储及分 配的,central cache没有内存对象时,从page cache分配出一定数量的page,并切割成定长大小 的小块内存,分配给central cache。当一个span的几个跨度页的对象都回收以后,page cache 会回收central cache满足条件的span对象,并且合并相邻的页,组成更大的页,缓解内存碎片 的问题。

一)thread cache设计

二)central cache设计

三) page cache设计

四)基数树优化

总结:

tcmalloc和malloc相比优化地方在哪?

在多线程的条件下是无锁的,大大降低了锁的竞争性能消耗

解决了内存外碎片的问题

下面是我画的整个项目运行是的流程图,文字部分实在不想打第二遍,大家将就图看看吧

内存申请的大致过程:

内存释放的大致过程:

代码都放在码云了,大家需要的可以看看

项目代码:ConcurrentMemoryPool · 绅士.永/C++_Learn - 码云 - 开源中国 (gitee.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式—“行为变化”

在组件构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 典型模式有:Command、Visitor 一、Command 动机 在软件构建过程中,"行为请求者"与“行为实现…

看完这篇,立马看懂理想首款纯电MEGA

作者 | 马波编辑 | 德新 6月17日,理想召开了首届家庭科技日活动。 这场打着家庭幌子的科技发布会,信息密度高到有些超出预期。但是看完这场发布会,理想超级旗舰车型 W01,也就是同时在本场发布会公布名称的理想MEGA,它…

硅谷之火重燃武大

关注、星标公众号,直达精彩内容 来源:技术让梦想更伟大 作者:李肖遥 昨天看到雷军雷总在武汉大学的毕业典礼上,朴实的演讲,看似吹牛,实则也是一种勉励。 雷军大学一年级时,在武大图书馆看到一本…

基于java,springboot的音乐分享平台

背景 音乐网站与分享平台的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、音乐资讯管理、音乐翻唱管理、在线听歌管理、留言板管理、系统管理,用户:首页、个人中心、音乐翻唱管理、我的收藏管理&…

MySQL - 单表数据量大表优化方案

一. 前言 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化。 二. 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整…

软考:软件工程:软件开发与测试,黑盒测试,白盒测试

软考:软件工程: 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 (1&#…

年轻人的储蓄困境:愿望与现实的交锋(原因及解决之道)

年轻人存款难吗?探讨年轻人存款问题是目前社会热议的话题之一。最近的一项调查称,大约五分之一的年轻人存款在一万元以内,而存款超过10万元的年轻人只占总人数的53.7%。这一数据引发了广泛的关注和讨论,究竟是什么原因导致了年轻人…

基于开源项目二次开发KKPrinter实现打印机共享,远程跨网络实现不同网络打印机共享,客户端利用虚拟打印机截取打印文件转发至物理打印机(附源码)

基于开源项目二次开发KKPrinter实现打印机共享,远程跨网络实现不同网络打印机共享,客户端利用虚拟打印机截取打印文件转发至物理打印机(附源码)。实现方案有很多种,这里主要介绍 2 种,并附详细的实现过程和…

MySQL学习笔记之索引优化与查询优化

文章目录 前言数据准备建表创建函数插入数据创建删除索引函数 索引失效案例全值匹配最佳左前缀法则主键插入顺序计算、函数导致列索引失效函数导致索引失效计算导致索引失效 类型转换导致列索引失效范围条件右边的列索引失效不等于导致列索引失效is not null不能使用索引like以…

探索“AI+算力”:加速创新与增长的无限潜力

随着科技的飞速发展,人工智能(AI)技术正成为各行各业的关注焦点。在这个充满激情和创新的时代,"AI算力"的结合应用成为科技行业的热门话题,甚至引发出"AI算力最强龙头"的网络热门等式。本文将探讨…

数据结构-哈希-哈希表实现

哈希表实现 一,哈希概念哈希概念常见哈希函数哈希冲突哈希冲突的解决 二,闭散列实现闭散列的结构插入查找删除闭散列总结 三,哈希桶实现哈希桶的结构插入查找删除析构拷贝构造赋值运算符重载 四,哈希表总结开散列与闭散列的比较哈…

设备虚拟化基础 - PCI

目录 1. 配置空间概念和作用 2. 通过配置空间发现设备 3. Linux读取PCI配置空间接口 4. 内核中具体读取配置空间实例 5. Virtion设备自定义空间 6. Linux读取Capabilities List代码解析 1. 配置空间概念和作用 详细的定义可以参考PCI Spec的第六章《Configuration Space…

嵌入式操作系统(嵌入式学习)

嵌入式操作系统 嵌入式操作系统是什么?嵌入式操作系统有哪些?常用的嵌入式操作系统及其特点对初学者的建议 嵌入式操作系统是什么? 嵌入式操作系统是一种专门设计和优化用于嵌入式系统的操作系统。它是在资源受限的嵌入式设备上运行的操作系…

No CMAKE_Swift_COMPILER could be found问题解决

编译OpenCV的IOS平台包,出错: CMake Error at CMakeLists.txt:20 (enable_language): No CMAKE_Swift_COMPILER could be found. 出错定位,原因是启用Swift语言时没有找到CMAKE_Swift_COMPILER变量 CMAKE官方文档说明启用Swift语言方法 cmake 3.15开始支持swift 查找swift …

简单介绍html/javascript、ajax应用

文章目录 前言1、html1.1.、html实例1.2、HTML文档的后缀名1.3、HTML 编辑器1.4、HTML 标题1.5、HTML 段落1.6、HTML 链接1.7、HTML 图像1.8、HTML 表格1.8.1、HTML 表格实例1.8.2、HTML 表格和边框1.8.3、HTML 表格表头 1.9、HTML <input> 标签1.10、Bootstrap 教程1.10…

开发常用命令合集(Docker、K8s、Linux、Windows等)

开发常用命令合集&#xff08;Docker、K8s、Linux、Windows等&#xff09; 1 Docker 详情查看&#xff1a;https://blog.csdn.net/weixin_45565886/article/details/130130361 1.1 基础命令 ①拉取、查看、删除镜像 docker pull nginx #下载最新版镜像名:版本名&#xff08…

元数据驱动架构的官方数据空间设计

淘宝开放平台是阿里与外部生态互联互通的重要开放途径&#xff0c;通过开放的产品技术把阿里经济体一系列基础服务&#xff0c;像水、电、煤一样输送给我们的商家、开发者、社区媒体以及其他合作伙伴&#xff0c;推动行业的定制、创新、进化, 并最终促成新商业文明生态圈。 开放…

PHP简单入门

PHP是一种流行的服务器端编程语言&#xff0c;被广泛用于Web开发。许多著名的网站和应用程序都是使用PHP编写的&#xff0c;例如Facebook、Wikipedia和WordPress等。本篇文章将为您介绍如何入门PHP编程。 环境配置 在开始使用PHP之前&#xff0c;需要先配置开发环境。要在本…

3ds MAX绘制花坛

绘制一个八边形花坛&#xff1a; 首先绘制一个八边形&#xff0c;并将它转换为可编辑样条线&#xff1a; 在前视图中绘制一个长方形&#xff0c;参数如图&#xff0c;可以按照喜好变换弧度等 注意&#xff0c;长方形的宽要和八边形的边长对应。 接下来我们通过旋转创建完整的…

测试流程体系

目录&#xff1a; 软件测试基本概念软件测试模型软件测试工作流程测试左移和测试右移 1.软件测试基本概念 通过手工或者工具对"被测对象"进行测试验证实际结果与预期结果之间是否存在差异 软件测试作用 通过测试工作可以发现并修复软件当中存在的缺陷&#xff…