RTthread内存管理

RTthread内存管理包括小内存管理算法,通过数据头连接使用和空闲内存块。slab管理算法是一种内存池策略,按对象大小分zone,高效分配固定大小内存。memheap算法处理多个不连续内存堆的分配问题,整合多个内存源。

RTthread内存管理

小内存管理算法:

  是一个简单的内存分配算法,它一开始是一个大的内存。需要分配内存就从这块大内存上分割出来相对应的内存。且每个内存块都包含一个管理用的数据头。通过这个头把使用块与空闲块用双向链表方式连接起来。

在这里插入图片描述
magic:变数,被初始化为heap,标记是内存管理用的内存块。同时他也是个内存保护字。不可被改写。
used:指出当前内存块是否已经被分配。
申请内存时遍历链表,找到第一个符合malloc大小的内存来申请,如果这块内存块较大,就分割出需要申请的内存。释放时则是相反的过程,但分配器会查看前后相邻的内存块是否空闲,如果空闲则合并成一个大的空闲内存块。

slab管理算法:

slab管理算法可大体看做一种内存池管理算法,slab分配器会根据对象的大小分成多个区(zone),一个zone的大小在32k到128k之间,分配器会在堆初始化时根据堆的大小自动调整。系统中的zone最多包括七十二种对象,一次最大能够分配16k的内存空间,如果超出了16k那么直接从页分配器中分配。每个zone中分配大小固定的内存块,能够分配相同大小内存块的zone会连接在一个链表中,72种对象的链表则放在一个数组中统一管理。

在这里插入图片描述

slab内存分配

 假设分配一个 32 字节的内存,slab 内存分配器会先按照 32 字节的值,从 zone array 链表表头数组中找到相应的 zone 链表。如果这个链表不存在,则向页分配器分配一个新的 zone,然后从 zone 中返回第一个空闲内存块。如果链表存在,则这个 zone 链表中的第一个 zone 节点必然有空闲块存在(否则它就不应该放在这个链表中),那么就取相应的空闲块。如果分配完成后,zone 中所有空闲内存块都使用完毕,那么分配器需要把这个 zone 节点从链表中删除。

slab内存释放

分配器需要找到内存块所在的 zone 节点,然后把内存块链接到 zone 的空闲内存块链表中。如果此时 zone 的空闲链表指示出 zone 的所有内存块都已经释放,即 zone 是完全空闲的,那么当 zone 链表中全空闲 zone 达到一定数目后,系统就会把这个全空闲的 zone 释放到页面分配器中去。

memheap管理算法

该算法适用于系统含有多个地址可不连续的内存堆。使用memheap内存管理算法可以简化系统存在多个内存堆时的使用:当系统存在多个内存堆时,用户只需要在系统初始化的时候将多个所需的memheap初始化,并开启memheap功能就可以很方便的把多个memheap(地址可不连续)粘合起来用于系统的heqp分配。

memheap工作机制
先将多块内存加入memheap_item链表进行粘合。当分配内存块时,会先从默认内存堆去分配内存,分配不到时就查找memheap_item链表。尝试从其他内存堆分配内存块。

### RT-Thread 操作系统的内存管理实现方式与原理 #### 动态内存堆管理 RT-Thread 提供了一种灵活的动态内存分配方法,通过将 ZI 段结尾处到内存尾部之间的空间定义为内存堆来支持这种需求[^4]。当应用程序需要创建内核对象(如消息队列、邮箱或信号量)时,这些对象所需的存储区域即从此动态内存堆中获取。 #### 静态内存池管理 除了动态内存外,RT-Thread 还引入了静态内存池的概念用于更高效的资源控制。这种方式允许开发者预先配置好固定大小的数据块集合,在程序运行期间按需从中取出而不必担心碎片化问题。这种方法特别适合那些频繁申请释放相同尺寸缓冲区的应用场景[^1]。 #### 启动过程中的内存初始化 为了确保整个系统的正常运作,RT-Thread 设计了一个特定的启动流程。该流程始于启动文件加载阶段,并最终到达 `rtthread_startup()` 函数完成核心组件初始化工作之后才会跳转至用户的 `main()` 函数执行业务逻辑。值得注意的是,在某些开发环境中(例如 MDK-ARM),还可以利用其特有的 `$Sub` 和 `$Super` 扩展特性进一步增强这一过程,使得可以在不修改原有代码结构的前提下轻松集成额外的初始化步骤[^2]。 ```c // 示例:如何在MDK环境下自定义启动前的操作 void $Sub$$main(void) { // 自定义的系统初始化代码可以放在这里 rtthread_startup(); // 调用RT-Thread的标准启动函数 // 继续执行原始的main函数 $Super$$main(); } ``` 上述内容概述了 RT-Thread 内存管理系统的主要组成部分及其工作机制,同时也展示了实际编程实践中可能遇到的一些细节处理技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值