6.3 内存池模式

UCIe 1.0协议层实战解析:PCIe 6.0与CXL 2.0/3.0到底怎么选? 本文深入解析UCIe 1.0协议层的核心架构,对比PCIe 6.0与CXL 2.0/3.0的技术特性,提供实战选型框架。通过详细的技术实现和性能数据,帮助工程师在高性能计算和异构集成中做出最优协议选择,提升系统效率和性能。 阅读详情

Bruce Powel Douglass大师介绍-优快云博客https://blog.youkuaiyun.com/ChatCoding/article/details/134665868嵌入式软件开发从小工到专家-优快云博客https://blog.youkuaiyun.com/ChatCoding/article/details/135297955C嵌入式编程设计模式源码-优快云博客https://blog.youkuaiyun.com/ChatCoding/article/details/134819019

静态分配模式是一种内存管理策略,仅适用于系统本质上静态的系统。

内存池模式也是一种内存管理策略,它在系统启动时预先分配一定数量的对象,并在需要时提供给客户端使用。这种模式既避免了动态分配的非确定性和碎片化,又提供了静态分配的灵活性,适用于需要在运行期间分配和回收大量相似对象的系统。

6.3.1 Abstract

许多应用程序中,大量的客户端可能需要创建对象,例如数据对象或消息对象。这些对象的需求往往难以预测。这时,预先创建对象池就很有意义(此时,没必要初始化对象)。客户端可根据需要获取对象,用完后归还池中。

6.3.2 Problem

内存池模式适用于以下系统:

  • 系统需要频繁创建和销毁大量相似的小型对象,例如事件、消息或数据对象。
  • 系统无法承受动态内存分配带来的问题,例如内存碎片、性能开销和安全问题。
  • 系统无法预先静态分配所有对象,例如由于系统过于复杂或对象的数量无法确定。

具体来说,内存池模式可以解决以下问题:

  • 内存碎片:内存池模式可以避免频繁创建和销毁对象造成的内存碎片,从而提高内存利用率。
  • 性能开销:内存池模式可以减少系统的性能开销,例如减少垃圾回收的开销。
  • 安全问题:内存池模式可以减少内存泄漏和越界访问等安全问题。

6.3.3 Pattern Structure

图 6-3 展示了内存池模式的结构。可参数化的泛型池管理器类用于创建特定类型的池化对象。系统中通常会存在多个这样的实例化池,但每个特定的池化类型只有一个。

每个池创建并管理其对象集,在需要时分配对象,并返回分配对象的引用或句柄给客户端。在释放后,对象将被放回可用对象列表。

6.3.4 Collaboration Roles

客户端(Client)

在嵌入式系统中,任何需要使用resourceClass类的对象都是客户端。客户端通过调用ResourcePool::allocate()向池请求对象,并在使用完成后通过ResourcePool::release()释放对象归还给池。

通用池管理器(Generic Pool Manager)

通用池管理器是一个模板类,它使用模板参数pooledClass和BufferSize分别指定要池化的对象类型和数量。

内存池(PooledClass)

PooledClass 表示实例化类对象对所对应的存储空间(内存池)。它可以是任何你想要的对象,但通常情况下,它们是简单、小型的类,由各种客户端使用。例如,在嵌入式系统中,PooledClass 可以是事件、消息、数据对象等。

资源池管理器(Resource Pool Manager)

资源池管理器类是已实例化的通用池管理器,系统中可以有多个这样的实例,但每个特定资源类最多只有一个实例。

模板实例化是指为模板类或模板函数指定具体的类型的过程。

6.3.5 Consequences

优点:

  • 避免动态内存分配的复杂性: 内存池模式在系统启动时一次性分配所有内存,不需要动态分配内存。这消除了动态内存分配带来的诸多问题,例如内存碎片、分配时间不确定性等,从而提高了系统的稳定性和可预测性。
  • 适用于复杂系统: 内存池模式可以处理一定程度的非确定性对象分配,因此比静态分配模式更适合复杂系统。尤其适用于以下场景:
    • 系统可能需要许多不同的客户端共享大量通用对象,但这些对象的分配数量和分布无法在设计阶段确定。
    • 系统需要在运行时根据实际需求动态分配对象。
  • 提高性能: 由于所有池化对象都在系统启动时创建,不需要动态分配内存,可以减少内存分配的操作,从而提高系统的运行效率。

缺点:

  • 对设计要求高: 内存池模式要求在设计阶段确定所有池化对象的类型和数量。如果这种决策失误,可能会导致系统在启动或运行过程中内存不足而崩溃。
  • 系统扩展受限: 内存池模式的系统难以根据新的需求进行扩展,因为池的大小在设计阶段就已确定。因此,该模式更适合于需求明确、相对稳定的嵌入式系统。

总结:

内存池模式是一种有效的内存管理模式,适用于需要频繁创建和销毁大量相似小型对象的嵌入式系统。在使用该模式时,需要注意其对设计要求高、系统扩展受限等缺点,并结合系统的实际需求进行权衡。

6.3.6 Implementation Strategies

本节提供了实现模式的策略,特别是在C++中。建议重写new和delete操作符以使用池管理器,这可以隐藏应用程序程序员不必直接处理池化与动态分配的复杂性。

内存池模式的实现相对简单。在 C++ 中,为了方便使用,通常会重写 new 和 delete 运算符,使其直接调用池管理器进行分配和释放操作。这样,应用程序开发人员无需关心是动态分配还是池化分配,简化了代码。

扩展与组合:

内存池模式可以与其他设计模式组合使用,例如与工厂模式([1])结合,根据需要创建特定的子类型对象。

具体实现参见《C++高级编程》

6.3.7 Related Patterns

内存池模式与其他内存管理模式的关系:

  • 静态分配模式: 适用于相对简单的嵌入式系统,所有内存分配都在系统启动时完成,不需要动态分配,优点是稳定可预测,缺点是灵活性较低。
  • 动态分配模式及其变种: 适用于更复杂的系统,允许在运行时动态分配内存,优点是更灵活适应需求变化,缺点是容易产生内存碎片降低性能,并带来内存泄漏风险。
  • 抽象工厂模式 [1] (Abstract Factory Pattern): 可以与内存池模式结合使用,在不同的运行环境中创建针对特定环境的池化对象,提高代码的可重用性和灵活性。

总结:

内存池模式是嵌入式系统中常用的内存管理技术,适用于需要频繁创建和销毁大量相似小型对象的场景。选择合适的内存管理模式需要根据系统复杂性、性能需求和灵活性等因素进行权衡,并考虑与其他模式的组合使用。

6.3.8 Sample Model

原书内容存在错误,见红色

对象模型 (图 6-4a):

图 6-4a 展示了基于图 6-3 所示模式派生出来的类模型的对象关系。系统中存在一个 TempDataPool 对象,管理着 1000 个 TempData 对象实例。图中还展示了三个 TempDataPool 的客户端:

  • TempSensor: 每半秒记录一次温度的温度传感器。每次记录温度时,TempSensor 会从池中分配一个 TempData 对象来存储温度信息。然后,它将这个对象传递给两个客户端:TempView 和 TempHistory。TempView 用于将温度显示在 GUI 界面上,TempHistory 用于维护最近几秒钟的温度历史记录。
  • TempView: 一个 GUI 对象,负责将温度值显示在用户界面上。当 TempView 显示完温度后,它会释放之前从池中分配的 TempData 对象,归还给池中。
  • TempHistory: 维护最近 10 秒钟的温度历史数据。对于前 20 个温度样本,TempHistory 不会释放接收到的 TempData 对象,而是将它们缓存起来。当收到新的温度数据时,它会释放最老的 TempData 对象,腾出空间存储新的数据。

时序图 (图 6-4b):

图 6-4b 演示了对象在运行期间的一个场景:

  1. 系统启动时,首先创建 TempDataPool 对象,并由它创建 1000 个 TempData 对象,存储在池中。
  2. TempSensor 从池中分配一个 TempData 对象,存储测得的温度值。
  3. TempSensor 将 TempData 对象分别传递给 TempView 。
  4. TempView 将温度值显示在 GUI 界面上。
  5. TempView 显示完温度后,释放 TempData 对象,将其放回池中。
  6. TempSensor 将 TempData 对象分别传递给 TempHistory。
  7. TempHistory 将 TempData 对象存储起来,维护最近 10 秒钟的温度历史记录。
  8. 对于前 20 个温度样本,TempHistory 不会释放接收到的 TempData 对象。
  9. 当收到第 21 个温度数据时,TempHistory 会释放最老的 TempData 对象,腾出空间存储新的数据。

PCIe 6.x/CXL 3.x重定时器:高速链路训练与信号再生关键解析 高速互连技术持续演进,PCIe 6.0引入PAM4和FEC后,信号完整性面临更严苛挑战。作为物理层信号再生器件,重定时器(Retimer)通过CDR时钟恢复与重新采样,将长链路分段,有效改善眼图和误码率。它与传统Redriver的核心差异在于能否参与PAM4均衡和LTSSM链路训练。在CXL 3.x内存池化等复杂拓扑中,重定时器成为扩展物理距离、保障CXL.mem可靠性的关键。理解重定时器在PCIe 6.x/CXL 3.x链路中的工作原理,对工程师完成选型、调试和故障定位至关重要。 阅读详情

相关推荐

Glog 与 spdlog 性能对比评测:C++ 日志库 3 大场景吞吐量实测

本文对C++两大主流日志库Glog和spdlog进行了全面的性能对比评测,通过单线程同步模式、多线程异步模式等三大场景的吞吐量实测,揭示了spdlog在高性能日志处理中的显著优势。测试结果显示spdlog在吞吐量和内存占用上均优于Glog,特别是在异步模式下可达580万条/秒的惊人性能,为C++开发者提供了关键的日志库选型参考。

weixin_30787531的博客 304

Antigravity设计模式在Qwen3-ASR-0.6B流处理中的应用

本文介绍了如何在星图GPU平台上自动化部署Qwen3-ASR-0.6B镜像,并应用Antigravity设计模式优化语音识别流处理。该方案能显著降低长音频处理时的内存占用,适用于实时会议字幕生成、客服语音分析等场景,提升资源利用率和系统稳定性。

weixin_35811662的博客 343

PCIe Gen6技术解析:高速数据传输与硬件设计挑战

PCIe(Peripheral Component Interconnect Express)作为计算机硬件中的高速串行总线标准,其最新一代Gen6将数据传输速率提升至64 GT/s,实现了带宽的翻倍增长。这一技术突破主要依赖于PAM4信号调制、轻量级前向纠错(FEC)和FLIT模式封装等核心技术,有效应对了数据中心和高性能计算中对高带宽和低延迟的迫切需求。在硬件设计层面,Gen6对信号完整性和电源完整性提出了更高要求,包括低损耗PCB材料的使用和精细的电源管理策略。这些技术进步不仅提升了NVMe SSD和

339

高性能 KVStore 内存池设计

该自定义内存池通过类型特化 + Slab 分级 + O(1) 映射 + 精简头部,在 KV 存储场景下实现了超越成熟分配器的性能,并降低了内存消耗。其核心思想是:充分预知分配模式,用极简的数据结构和快速路径换取速度,同时保证异常情况下的正确释放。未来可进一步扩展为多线程版本,只需为每个池添加独立锁或无锁队列即可。

m0_67522305的博客 351

【高并发内存池】第一弹---深入解析内存池:项目介绍、原理及设计定长内存池全攻略

项目介绍:做的是什么,知识储备;什么是内存池:池化技术,内存池,内存池主要解决的问题,malloc;设计定长的内存池:VirtualAlloc,brk,mmap,成员变量,管理释放的对象,释放对象,申请对象,性能测试~~~

小林熬夜学习编程的博客 2112

告别卡顿与浪费:用PCIe 6.0的L0p技术,让你的数据中心带宽和功耗都‘聪明’起来

本文深入解析PCIe 6.0的L0p技术如何通过动态调整链路宽度,实现数据中心带宽与功耗的智能优化。L0p技术允许在不中断业务的情况下精细调控PCIe链路,显著降低能耗15-25%,同时保持高性能。文章详细介绍了L0p的核心原理、部署实践及其与Flit模式等新特性的协同效应,为数据中心能效提升提供创新解决方案。

weixin_30425949的博客 593

C++集成Qwen3-ForcedAligner-0.6B:高性能字幕生成引擎开发

本文介绍了如何在星图GPU平台上自动化部署Qwen3-ForcedAligner-0.6B字幕生成镜像,实现高性能音文强制对齐功能。该方案通过C++集成优化,可快速生成精确到词级的视频字幕,大幅提升字幕制作效率,适用于视频编辑、实时字幕生成等应用场景。

weixin_42511373的博客 74

单例模式的内存池

可以参照之前的两篇博客《普通内存池的实现》、《通用内存池的实现》单例模式的实现:(1)构造函数写在私有成员里面(2)有一个静态的成员函数用来生成一个唯一的对象代码实现:#include <iostream> using namespace std; const int MEM_POOL_SIZE = 5; template<typename T> class MEM_P...

MOON5555的博客 551

Qwen3-ASR-0.6B在C语言项目中的集成开发指南

本文介绍了如何在星图GPU平台上自动化部署Qwen3-ASR-0.6B镜像,实现低延迟、高精度的本地化语音识别。该轻量级模型专为C语言项目优化,适用于嵌入式语音助手、工业设备语音控制等资源受限场景,支持52种语言及方言,可离线运行并保障数据隐私。

weixin_35756130的博客 288

组态王|以一定的时间间隔查询某个时间段内的历史数据

使用该函数其他都可以满足,唯一问题是变量的选择,当切换站点后查询历史数据时,所选的变量依然是上次站点查询时所选择的变量,每当更换站点查询时都需要重新选择变量,这一点太繁琐,是用户和操作者无法忍受的。但是由于现场可能数据变化并非太过频繁,想要实现记录频率不变,还是以1分钟一次的频率进行存储,但是报表查询的时候想要只显示整点的数据。其中日历控件的设置与之前的历史数据查询是一样的,报表的抬头设置都是不用变的,此处不再赘述,有兴趣的可以。以上为组态王中以一定的时间间隔查询某个时间段内的历史数据的实现过程。

做有价值的事,积累有价值的笔记! 2544

ESP32-S3打造离线语音助手:从零部署自定义唤醒词与本地大模型推理【实战指南】

本文详细介绍了如何利用ESP32-S3芯片打造离线语音助手,包括自定义唤醒词训练与本地大模型推理的实战指南。通过硬件架构解析、音频处理优化及性能调优技巧,实现低延迟、高隐私保护的语音交互方案,特别适合智能家居和物联网应用。

weixin_30296405的博客 608

Qwen3-ASR-0.6B性能优化:基于数据结构的推理加速

本文介绍了如何在星图GPU平台上自动化部署Qwen3-ASR-0.6B镜像,显著提升语音识别推理效率。通过数据结构优化与内存池设计,该镜像可稳定支撑在线教育场景下的实时字幕生成,满足多教师并发课程的低延迟(<100ms TTFT)需求,大幅增强教学互动体验。

weixin_36444661的博客 238

从涡流求解器到瞬态场:Maxwell 3D里无线充电仿真,选对求解器能省一半计算时间

本文深入探讨了Maxwell 3D在无线充电仿真中涡流求解器与瞬态求解器的选择策略,帮助工程师优化计算效率与精度。通过对比分析两种求解器的适用场景、性能差异及实战技巧,揭示如何根据频率特性、材料非线性和动态过程需求做出精准选择,可节省高达50%的计算时间。特别针对3D线圈模型的无线充电系统设计提供了专业建议。

weixin_26861329的博客 231

避开嵌入式开发的暗礁:STM32F103RBT6常见误区与实战优化指南

本文深入剖析STM32F103RBT6微控制器在嵌入式开发中的常见误区,包括电源管理、ADC噪声抑制、内存优化等关键问题。提供实战优化方案,如启用PVD电压监控、多通道ADC配置技巧及高效内存管理策略,帮助开发者提升系统稳定性和性能。

e3f4g5的博客 147

YF-S401水流量传感器在STM32上的精准计量实现

本文详细介绍了YF-S401水流量传感器与STM32微控制器的集成应用,实现精准水流计量。通过外部中断和外部时钟两种脉冲计数方案,结合硬件配置、软件滤波和校准技巧,确保高精度流量测量。适用于智能家居和工业自动化中的水控系统,提升系统稳定性和测量准确性。

rainy的博客 896

电源芯片TPS54560典型应用电路及设计详解

TPS54560 是一款配有集成型高侧 MOSFET 的 60V、5A DC-DC转换器,输入电压范围7-60V,输出电压可通过外部反馈电阻设置成略低于输入电压的任意值。**所以,**R5=31.25KΩ、R6:10KΩ(常用值)时,即可设置输出电压为 3.3V。**所以,**R5=140KΩ、R6:10KΩ(常用值)时,即可设置输出电压为12V。设计 TPS54560 的输出电压时,主要通过外部反馈电阻网络来设置输出电压。因此,输出 3.3V ,输入电压24V时推荐的电感值为 8µH 至 10µH。

weixin_42306872的博客 1万+

C++内存池介绍与经典内存池的实现

内存池(Memory Pool)是一种内存分配方式。通常我们习惯直接使用new、malloc等API申请内存,这样做的缺点在于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。

Doublelv 的博客专栏。 4万+

不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤

不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤 一般情况下,我们使用西门子的S7通信时都是将网络中的PLC的IP设置在同一网段,那么如果涉及到旧项目改造时,不方便修改IP地址,只能进行2个网段通信时,可以参考以下步骤: 准备条件: 2个路由器 CPU 1212C 主动连接 CPU 314C-2PN/DP 被动连接 网络搭建如下图所示: S7-1212C一侧 建立S7主动连接 ,IP地址:192.168.5.40,编写get/put 通信程序 S7-300 IP地址:192.168.0

Robot_PLC_HMI_Automation 2万+

【项目设计】高并发内存池(一)[项目介绍|内存池介绍|定长内存池的实现]

本项目实现的是一个高并发的内存池,它的原型是Google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替换系统的内存分配相关函数malloc和free。tcmalloc的知名度也是非常高的,不少公司都在用它,比如Go语言就直接用它做了自己的内存分配器。该项目就是把tcmalloc中最核心的框架简化后拿出来,模拟实现出一个mini版的高并发内存池,目的就是学习tcmalloc的精华。

m0_60338933的博客 1599

告别 Python!C# 直接跑 YOLO 目标检测:工控机边缘推理终极方案

set;set;set;set;set;stringget;set;get;set;get;set;get;set;get;set;告别 Python 依赖,不是排斥 Python 的训练能力,而是为了工程化的极致。在工控机这个资源受限、稳定性要求极高的战场上,是目前最优雅、最高效的解决方案。更少的依赖= 更少的故障点。更快的速度= 更高的产线节拍。更简单的部署= 更低的人力成本。现在,拿起你的 C# 项目,导入那个.onnx。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 422

Archery通过OpenResty代理转发后登录一直提示Forbidden

测试几遍,连账号密码都没用验证,因为不管输什么都是提示Forbidden。找到配置文件settings.py,下面命令可到配置文件路径。回到页面刷新,随便输入个账号密码,验证失败证明请求成功了。查看Preview,提示CSRF验证失败,请求被中断。域名:dba.hkeasyspeed.com。打开开发者工具查看,网络里面可以看到报403。添加一条配置,把你配置域名添加进去。可以看到页面可以正常访问到。进入Archery容器。重启Archery容器。正常输入账号密码,OK。

万物皆可学 3147

C++ ⾼性能内存池

小知识点补充项⽬介绍1.这个项⽬做的是什么?当前项⽬是实现⼀个⾼并发的内存池,他的原型是google的⼀个开源项⽬tcmalloc,tcmalloc全称 Thread-Caching Malloc,即线程缓存的malloc,实现了⾼效的多线程内存管理,⽤于替代系统的内存分配相关的函数(malloc、free)。2.用到的知识这个项⽬会⽤到C/C++、数据结构(链表、哈希桶)、操作系统内存管理、单例模式、多线程、互斥锁等等⽅⾯的知识。小知识点补充。

ljw的博客 3498

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【C++】从零实现一个高并发内存池

从零实现一个高并发内存池🎄项目介绍◎项目的内容介绍◎要求的知识储备◎内存池的介绍 🎄项目介绍 ◎项目的内容介绍 ◎要求的知识储备 ◎内存池的介绍

love_guanghui的博客 5154

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

一文看懂内存池原理及创建(C++实现)

实现一个高并发的内存池 1. 什么是内存池 1.1 池化技术 池是在计算技术中经常使用的一种设计模式,其内涵在于:将程序中需要经常使用的核心资源先申请出来,放到一个池内,有程序自管理,这样可以提高资源的利用率,也可以保证本程序占有的资源数量,经常使用的池化技术包括内存池,线程池...

bigchen 6948

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【高并发内存池】项目介绍 + 定长内存池 + 整体框架设计

当前项目是实现一个高并发的内存池,他的原型是google的⼀个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。我们这个项目是把tcmalloc最核新的框架简化后拿出来,模拟实现出一个自己的高并发内存池,目的就是学习tcamlloc的精华。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。

fight_p的博客 1630

高并发内存池(一):项目简介+定长内存池的实现

这个项目是实现一个高并发的内存池。它的原型是google的一个开源醒目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的线程内存管理,用于替代系统的相关内存分配函数(malloc,free)。这个项目是对tcmalloc的一个简化版,是对tcmalloc的学习,实现一个我们自己的高并发内存池。在该项目中涉及到的C++知识包括数据结构(链表,哈希桶),操作系统内存管理,单例模式,多线程 以及互斥锁等等。

2401_82677021的博客 1309
上一篇: 6.2 静态内存分配模式
下一篇: 实时嵌入式:优先级反转
Let's Chat Coding
博客等级 码龄3年 1020粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值