Rt-thread源码剖析(3)——内存管理

本文重点

mempool其实存在优先级翻转问题,详见内存池释放        

内存管理概述

        首先,内存管理方式可以分为几类,而根据不同的分类标准则可以得到不同的结果。

        以内存获取的时机为标准,可以分为动态初始化和静态初始化两种方式,这两种内存分配的核心差异在于,静态初始化的内存是在编译是就确定的,他并不涉及内存分配,初始化对应的函数也是rt_object_init,而其余所有设计内存分配的方式,都是在程序运行中实现的。

        以动态分配时内存获取的时间是否可控分类,又可以把动态内存管理分为两类,第一类通过RT_KERNAL_MALLOC获取内存,第二类通过rt_mp_alloc获取内存

  • RT_KERNAL_MALLOC:在运行时根据需要分配和释放内存,提供更大的灵活性。动态内存管理又可细分为,以下三种方式共用同一软件接口,因此只能选其一;而mempool则可与他同时使用:

    • 小内存管理(Small Memory Management):针对小块内存的分配,采用简单快速的算法,但可能产生碎片。
    • SLAB 分配:针对大内存块的分配管理

        以上两种方式都是管理一块连续的内存,只是算法不同,而memheap则是多块内存,他们通过宏定义来决定启用哪个

  • 内存堆管理(MemHeap):系统中存在多个内存堆的时候,用户只需要在系统初始化时将多个所需的 memheap 初始化,并开启 memheap 功能就可以很方便地把多个 memheap(地址可不连续)粘合起来用于系统的 heap 分配
  • rt_mp_alloc内存池管理(MemPool):预先分配固定大小的内存块,适用于需要高效、快速分配和释放固定大小内存块的场景,避免碎片化,且获取内存时间是完全固定的,因此又称为静态内存分配

               

静态初始化

        在 RT-Thread 实时操作系统中,内核对象(如线程、定时器等)可以通过静态方式进行初始化,即在编译时分配内存。这种方式需要用户在调用 rt_timer_initrt_thread_init 等函数时,提供预先分配好的内存块。

静态初始化的特点:

  • 编译时确定内存:所需的内存空间在编译阶段就已确定,不依赖于运行时的内存分配。这意味着在系统运行期间,不会发生内存申请或释放的操作,减少了内存碎片和分配失败的风险。

  • 高可控性:由于内存布局在编译时已知,开发者可以精确控制内存的使用,提高系统的稳定性和可靠性。

  • 无运行时开销:避免了动态内存分配带来的运行时开销,如内存管理算法的执行时间等

该方式其实并不涉及什么内存分配和内存管理,以下着重讲一下设计内存管理的部分

动态初始化

        当需要在运行时获取需要的内存时,就涉及到了内存分配

        内存分配根据时间是否可控,又分为动态内存分配和静态内存分配(mempool)

Mempool静态内存分配

        首先要感性地理解内存池是怎么样的一个东西:

        有一块内存,基本上是static修饰的静态一个数组,然后你需要把他切成一块块的block,这个block是别人想要用内存时的单位,不管对方需要多少,每次获取就是给一个block;每个block之间通过链表链接

        然后有一个mempool控制块,维护有几个block可用之类的信息

        如果想使用内存池,则需要开启RT_USING_MEMPOOL宏

内存池的初始化:

  • 静态初始化:使用 rt_mp_init 函数,开发者需要提供内存池的起始地址、总大小以及每个内

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值