内存管理的基本概念
在一般的实时嵌入式系统中,由于实时性的要求,很少使用虚拟内存机制。所有的内存都需要用户参与分配,直接操作物理内存,所分配的内存不能超过系统的物理内存,所有的系统堆栈的管理,都由用户自己管理。
在嵌入式实时操作系统中,对内存的分配时间要求更为苛刻,分配内存的时间必须是确定的。一般内存管理算法是根据需要存储的数据的长度在内存中去寻找一个与这段数据相适应的空闲内存块,然后将数据存储在里面。而寻找这样一个空闲内存块所耗费的时间是不确定的,因此对于实时系统来说,这是不可接受的,实时系统必须要保证内存块的分配过程在可预测的确定时间内完成,否则实时线程对外部事件的影响也将变得不可确定。
不同的嵌入式系统具有不同的内存配置和时间要求。所以单一的内存分配算法只可能适合部分应用程序。因此,RT-Thread将内存分配作为可移植层面(相对于基本的内核代码部分而言),RT-Thread有针对性的提供了不同的内存分配管理算法,这使得应用于不同场景的设备可以选择适合自身内存算法。
RT-thread的内存管理模块通过对内存的申请、释放操作,来管理用户和系统对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。
RT-Thread的内存管理分为静态内存管理和动态内存管理。
- 动态内存:在动态内存池中分配用户指定大小的内存块。
优点:按需分配,在设备中灵活使用。
缺点:内存池中可能出现碎片。 - 静态内存:在静态内存池中分配用户初始化时预设大小的内存块。
优点:分配和释放率高,静态内存池中无碎片。
缺点:只能申请到初始化预设大小的内存块,不能按需申请。
静态内存管理的运行机制
内存池(Memory Pool)是一种用于分配大量大小相同的内存对象的技术。它可以极大加快内存分配/释放的速度。
内存池在创建时先向系统申请一大块内存,然后分成大小相等的多个小内存块,小内存块通过链表连接起来(此链表也称为空闲内存链表)。每次分配的时候,从空闲内存链表中取出表头上第一个内存块,提供给申请者。物理内存中允许存在多个大小不同的内存池,每一个内存池又由多个大小相同的空闲内存块组成。当一个内存池对象被创建时,内存池对象就被分配给了一个内存池控制块,内存池控制块的参数包括内存池名,内存缓冲区,内存块大小,块数以及一个等待线程列表。
内核负责给内存池分配内存池对象控制块,它同时也接收用户线程的分配内存块申请,当获得申请信息后,内核就可以从内存池中为线程分配内存块。内存池一旦初始化完成,内部的内存块大小将不能再调整。