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

【计算机基础】-46-“用合适的工具做合适的事” —— 通用场景用 Small Memory, 实时关键场景用 不同size的Memory Pool, 内核对象用 Slab, 大内存用 Buddy。

下面结合 RT-Thread 的实际代码,为你展示“用合适的工具做合适的事”的四种典型场景及对应代码示例。


✅ 总体原则回顾

场景推荐机制理由
通用动态分配Small Memoryrt_malloc/rt_free简单、灵活,适合任意大小
实时关键路径(如 ISR)多个不同 size 的 Memory Pool确定性延迟,ISR-safe
内核对象(TCB、信号量等)Slab Allocator零碎片,O(1) 分配
大块内存(>1KB)Buddy System低碎片,高效合并

一、1. 通用场景:Small Memory(默认堆)

📌 适用:普通应用层数据,如字符串、临时结构体

// rtconfig.h 中确保启用(默认已启用) #define RT_USING_SMALL_MEM // 应用代码 void general_usage(void) { // 分配一个动态数组 int *buffer = (int *)rt_malloc(100 * sizeof(int)); if (buffer) { for (int i = 0; i < 100; i++) { buffer[i] = i; } rt_kprintf("Sum: %d\n", buffer[99]); rt_free(buffer); // 释放 } }

✅ 优点:简单直接
缺点:不能在 ISR 中使用,长期运行可能碎片化


二、2. 实时关键场景:多尺寸 Memory Pool(推荐用于 ISR)

📌 适用:网络包、传感器帧、中断处理中的内存分配

#include <rtthread.h> // 创建多个不同大小的内存池 static rt_mp_t pkt_pool_64; // 64 字节包 static rt_mp_t pkt_pool_256; // 256 字节包 static rt_mp_t pkt_pool_1024; // 1KB 包 int mp_init(void) { pkt_pool_64 = rt_mp_create("mp64", 64, 10); pkt_pool_256 = rt_mp_create("mp256", 256, 5); pkt_pool_1024 = rt_mp_create("mp1024", 1024, 2); return 0; } INIT_APP_EXPORT(mp_init); // ISR 中安全分配 void uart_rx_isr(void) { // 假设收到一个 200 字节的数据包 void *buf = rt_mp_alloc(pkt_pool_256, RT_WAITING_NO); // 不阻塞! if (buf) { uart_read(buf, 200); // 交给线程处理... rt_mb_send(data_mb, (rt_ubase_t)buf); } // 若失败,可丢包或用更小池 } // 处理线程 void data_process_thread(void *param) { rt_ubase_t msg; while (1) { if (rt_mb_recv(data_mb, &msg, RT_WAITING_FOREVER) == RT_EOK) { void *buf = (void *)msg; process_packet(buf); rt_mp_free(buf); // 归还到对应 pool } } }

✅ 优点:

  • rt_mp_alloc()ISR-safe
  • 确定性延迟(无搜索、无锁竞争);
  • 零碎片(固定块大小)。

三、3. 内核对象:Slab Allocator(自动用于 TCB 等)

📌 适用:RT-Thread 内核自动管理线程、定时器等对象

// rtconfig.h #define RT_USING_SLAB // 启用 Slab // 用户无需手动创建 slab! // 当你调用 rt_thread_create() 时,内核自动从 TCB slab 分配 void create_threads(void) { // 这些 TCB 对象由 Slab 分配器提供 rt_thread_t t1 = rt_thread_create("t1", entry1, RT_NULL, 512, 10, 10); rt_thread_t t2 = rt_thread_create("t2", entry2, RT_NULL, 512, 10, 10); rt_thread_startup(t1); rt_thread_startup(t2); // 删除时自动归还到 slab cache rt_thread_delete(t1); // TCB 内存不释放到系统,而是缓存复用 }

🔍 内部机制(RT-Thread 源码):

  • rt_thread_create()→ 调用rt_object_allocate(RT_Object_Class_Thread)
  • 若启用 Slab,则从thread_slab_cache分配,不调用rt_malloc

✅ 优点:

  • 创建/删除线程极快;
  • 无内存碎片;
  • 支持对象初始化(ctor)。

四、4. 大内存场景:Buddy System

📌 适用:文件系统缓存、图形帧缓冲、大网络缓冲区

// rtconfig.h #define RT_USING_HEAP #define RT_USING_BUDDY // 注意:需在 linker script 中预留大块内存 // extern char _heap_start[], _heap_end[]; int buddy_test(void) { // 分配 2KB 内存(Buddy 会分配 2048 = 2^11) void *large_buf = rt_malloc(2000); if (large_buf) { rt_kprintf("Allocated large buffer at %p\n", large_buf); // 使用... memset(large_buf, 0xAA, 2000); rt_free(large_buf); // Buddy 会尝试合并相邻空闲块 } return 0; } MSH_CMD_EXPORT(buddy_test, test buddy system);

✅ 优点:

  • 碎片率远低于 Small Memory
  • 适合长期运行、频繁分配大块内存的系统;
  • 合并机制减少内存浪费。

⚠️ 注意:Buddy 最小分配单位较大(如 128B),不适合小对象


五、对比总结表

机制分配函数ISR 安全碎片典型用途
Small Memoryrt_malloc()❌ 否中~高通用应用数据
Memory Poolrt_mp_alloc()✅ 是ISR、固定帧
Slab内核自动(rt_thread_create⚠️ 间接支持TCB、信号量
Buddyrt_malloc()❌ 否大缓冲区、文件缓存

✅ 最佳实践建议

  1. ISR 中永远不要用rt_malloc()→ 用Memory Pool
  2. 高频创建线程?→ 确保启用RT_USING_SLAB
  3. 系统 RAM > 512KB 且用大 buffer?→ 考虑Buddy
  4. 不确定?→ 默认Small Memory足够应付大多数场景。

🔑终极口诀
“小用 malloc,ISR 用 pool,内核靠 slab,大块上 buddy。”

通过合理组合这四种机制,你的 RT-Thread 系统将兼具高效、稳定、实时三大特性。

http://www.jsqmd.com/news/377417/

相关文章:

  • ArkUI框架运行原理与常见性能优化方案
  • Apache Cassandra Connector Flink 与宽列存储的高吞吐协作 - 实践
  • 完整教程:【低空经济】低空经济智能制造基地建设方案
  • AI 画图全家桶来了!这回想自己手绘图都难了
  • 专业检测背书,标准引领品质——独语N627-1领跑学生护眼市场 - 资讯焦点
  • setupldr源代码分析之得到SetupDevice和打开文件txtsetup.sif和biosinfo.inf
  • 买中宁枸杞选哪个品牌?玺赞深耕十年,用道地品质筑牢口碑标杆 - 宁夏壹山网络
  • 计算机毕业设计Python+Django微博舆情分析系统 微博舆情预测 微博爬虫 微博大数 据(源码+LW文档+PPT+详细讲解)
  • 【深度解析】某水务集团“十五五“数据资产化战略:构建水务数据资产与水权交易双轮驱动的数字化新生态(WORD)
  • 1.1 从语言模型到LLM:万字详解大模型演进史
  • 洗碗粉(洗碗机清洁剂)市场细分观察:安全、效能与场景驱动的品牌分化
  • 2026选新型高清印刷机定制厂家,这份排行分析别错过,市场高清印刷机怎么选购精选实力品牌 - 品牌推荐师
  • 10.3 实战 多Agent协作完成一个复杂项目
  • 1.2 基础模型究竟是什么?一文搞懂AI工程核心概念
  • 【信息科学与工程学】【解决方案体系】光刻机
  • 我论文写得太像人了,结果系统说:你不是人??
  • $k$ 边最短路-矩乘
  • Linux随记
  • 你认真写下的每一个字,都值得被相信 ✨
  • 大润发购物卡快速变现攻略 - 团团收购物卡回收
  • SharePoint Online 网站配置时区
  • 河北粘钉一体机厂家2026年推荐榜,品质与口碑并存,河北粘钉一体机公司哪个好解决方案与实力解析 - 品牌推荐师
  • 大模型“涌现能力”的来源解析
  • 开题总被退回?试试百考通AI——专业、规范、0代写风险!
  • 2026年大型集团资产管理系统软件哪家好?资产管理系统平台推荐 - 品牌2025
  • 靶心转移:开发者成网络攻击首要突破口,供应链与AI暗战重构安全格局
  • 拒绝模板化!百考通AI生成个性化开题报告,贴合你的研究方向
  • 深入解析:TDengine C# 语言连接器入门指南
  • 抗衰产品哪款更靠谱?2026年高纯度NMN抗衰推荐,精准改善NAD+水平 - 资讯焦点
  • 3分钟生成高质量开题报告?百考通AI让选题不再卡壳!