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

【计算机基础】-48-Slab与Memory Pool可以共存吗?他们的API函数相同吗?代码示例

Slab 与 Memory Pool 可以共存,且它们的 API 完全不同、用途互补
它们是 RT-Thread 中两种独立的内存管理机制,分别用于内核对象缓存用户自定义固定大小内存池


一、核心对比

特性Slab AllocatorMemory Pool (rt_mp_t)
用途内核自动管理 TCB、信号量等对象用户手动创建/管理固定大小内存池
API无直接用户 API(内核自动调用)rt_mp_create(),rt_mp_alloc(),rt_mp_free()
是否共存✅ 是(完全独立)✅ 是
ISR 安全⚠️ 间接支持(通过内核对象)✅ 直接支持(rt_mp_alloc(..., RT_WAITING_NO)
内存来源系统堆(heap)或静态内存用户指定(堆 or 静态数组)

🔑关键区别

  • Slab 是“内核对象池”,用户不直接操作;
  • Memory Pool 是“用户内存池”,用户显式创建和使用。

二、API 对比(完全不同)

✅ Slab Allocator

  • 无用户级 API
  • 当你调用rt_thread_create()时,内核自动从 Slab 分配 TCB
  • 用户无法直接“分配一个 slab 对象”。
// 用户代码(不涉及 slab API) rt_thread_t tid = rt_thread_create("t1", entry, RT_NULL, 512, 10, 10); // → 内部:TCB 从 slab cache 分配(若启用 RT_USING_SLAB)

✅ Memory Pool

  • 完整用户 API
    rt_mp_t rt_mp_create(const char *name, rt_size_t block_size, rt_size_t block_total); void* rt_mp_alloc(rt_mp_t mp, rt_int32_t timeout); void rt_mp_free(void *block);

三、共存示例:同时使用 Slab 和 Memory Pool

#include <rtthread.h> // 1. 启用 Slab(用于内核对象) // rtconfig.h: // #define RT_USING_SLAB // 2. 创建用户 Memory Pool(用于 ISR 数据包) static rt_mp_t packet_pool = RT_NULL; int memory_init(void) { // 创建 64 字节 x 10 块的内存池 packet_pool = rt_mp_create("pkt_pool", 64, 10); if (packet_pool == RT_NULL) { rt_kprintf("Failed to create memory pool\n"); return -1; } return 0; } INIT_APP_EXPORT(memory_init); // 3. ISR 中使用 Memory Pool(安全!) void uart_isr(void) { void *buf = rt_mp_alloc(packet_pool, RT_WAITING_NO); // 不阻塞 if (buf) { uart_read(buf, 64); rt_mb_send(data_mb, (rt_ubase_t)buf); // 发给线程处理 } } // 4. 线程处理数据并释放 void data_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_data(buf); rt_mp_free(buf); // 归还到 Memory Pool } } } // 5. 同时创建多个线程(TCB 由 Slab 管理) void create_workers(void) { // 这些 TCB 由 Slab 分配(零碎片、高速) for (int i = 0; i < 5; i++) { char name[8]; rt_sprintf(name, "w%d", i); rt_thread_t t = rt_thread_create(name, worker_entry, RT_NULL, 512, 20, 10); rt_thread_startup(t); } }

运行时行为

  • rt_thread_create()→ TCB 从Slab分配;
  • rt_mp_alloc()→ 内存块从Memory Pool分配;
  • 两者互不影响,完美共存

四、内存布局示意

+---------------------+ | System Heap | ← Small Memory / Buddy 管理 | | | +-----------------+ | | | Slab Cache | | ← Slab 从 heap 切出一块管理 TCB | | [TCB][TCB][...] | | | +-----------------+ | | | | +-----------------+ | | | Memory Pool | | ← rt_mp_create() 从 heap 或静态内存分配 | | [64][64][64]... | | | +-----------------+ | +---------------------+

💡 注意:Memory Pool 也可以从静态数组创建,不占用 heap:

static uint8_t mp_buffer[64 * 10]; rt_mp_t mp = rt_mp_create_static("mp", 64, 10, mp_buffer);

五、何时用 Slab?何时用 Memory Pool?

场景推荐机制
创建/删除线程、信号量、定时器Slab(内核自动优化)
ISR 中分配内存(如网络包、传感器帧)Memory Pool(ISR-safe)
用户自定义固定大小对象池Memory Pool
减少内核对象碎片Slab

✅ 总结

问题答案
Slab 与 Memory Pool 能共存吗?能,且推荐共存
API 相同吗?

完全不同(Slab 无用户 API,Memory Pool 有完整 API)

Slab内核分配内核对象时使用,没有分配给用户使用。

是否冲突?不冲突(Slab 管内核对象,Memory Pool 管用户数据)

🔑一句话
“Slab 是内核的私有对象池,

Memory Pool 是用户的公有内存池——各司其职,和谐共存。”

合理组合两者,可构建高性能、低碎片、实时可靠的嵌入式系统。

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

相关文章:

  • MIT_65840 Lab2 KV Server 与分布式锁
  • iPaaS从连接到智能:企业集成平台选型进入新阶段
  • 分期乐购物额度怎么提取?零基础新手也能轻松搞定! - 团团收购物卡回收
  • 2026年深圳古驰手表维修推荐评测:非官方维修点选择指南与全国服务网点排名 - 十大品牌推荐
  • 源码阅读:Android UI分发机制
  • 10 个新颖且有挑战性的 Python 编程题目
  • 2026年广东地区金蝙蝠工艺家具性价比分析,怎么选不吃亏 - 工业推荐榜
  • 【IEEE出版、往届会后4个月检索】第八届信息科学、电气与自动化工程国际学术会议(ISEAE 2026)
  • 2026年深圳古驰手表维修推荐榜单评测:非官方维修网点服务与售后中心选择指南 - 十大品牌推荐
  • uv pyseekdb:把 RAG 环境与检索落地成本降到最低
  • 语言、开发语言程序设计语言--SMP(软件制作平台)语言基础知识之六十一
  • 教你轻松处理永辉超市购物卡 - 团团收购物卡回收
  • 基于ID3算法的MATLAB销量预测实现
  • 从“防贼”到“信人”——管理的本质回归
  • 安科士 SFP-10G-T 光模块实战指南,企业中短距万兆网络部署无忧
  • 手把手教你应用 Faster-Whisper 实时语音输入转文本,本地部署教程
  • Agilex 5 SOC FPGA 的HPS外设 信号引脚分配怎么会出现在Pin Planner里面?要怎么分配引脚?(无需分配)
  • 如何高价回收永辉超市购物卡? - 团团收购物卡回收
  • 不踩雷! 降AIGC网站 千笔·专业降AI率智能体 VS Checkjie,专科生专属
  • 【Security】基于Claude Code的多智能体AI代码审计系统设计与工程化落地
  • C++课后习题训练记录Day102
  • MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化调度 电气热耦...
  • AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 427
  • 2026别错过!降AI率平台 千笔·专业降AI率智能体 VS 文途AI,本科生专属首选
  • 无锡黑锋科技 HF6120S 16V/2A 同步降压转换器技术解析
  • 2026 春节档电影推荐:春节档必看哪个电影?我把第一选择留给张艺谋《惊蛰无声》 - SFMEDIA
  • 2.2 Transformer架构深度解析:自回归与掩码模型的奥秘
  • 聊聊福州纵横美术详细介绍,哪家性价比高 - 工业推荐榜
  • 2025年重型货架采购指南:口碑标杆企业推荐,物流货架/大仓库货架/货架厂仓储货架,重型货架供应商口碑推荐榜 - 品牌推荐师
  • TensorFlow学习系列05 | 实现运动鞋品牌识别