1 动态分区内存管理机制
1.1 动态分区内存管理概述
在许多小型嵌入式系统中并未实现虚拟内存机制,动态分区内存管理机制仍然是首选。分区存储管理是满足多道程序设计的最简单的存储管理方法,它允许多个用户程序同时存在系统内存中,即共享内存空间。早期的分区存储管理采用固定分区的方法,把内存空间分成若干个大小不等的区域,称为分区。每个用户程序(作业、进程)调入内存后,占用其中1个分区,程序运行完成后释放该分区。这种存储管理方法的主要问题是内存使用效率极低,很快就被淘汰了。取而代之的是动态分区存储管理技术。图1显示的是动态内存管理的数据结构。
1.2 动态分区内存分收算法及其性能分析
在动态内存分配机制中一般采用两种设计方案:最佳适应算法和首次适应算法。最佳适应算法要求所有的空闲内存块按照内存块的大小,由小到大链接在一起。首次适应算法中所有的空闲内存块都是按地址由小到大链接的。图2显示了这2种算法的流程(假设系统申请的内存块大小为n)。
最佳适应算法和首次适应算法在分配内存的流程上是一致的,然而由于空闲内存块的组织形式不同,其分配的性能也不尽相同。最佳适应算法由于每次分配都是首先分配与所要求的内存块大小最接近的空闲内存块,因而其内存利用率相对较高。然而由于在内存回收过程中需要合并那些地址相邻的空闲块,最佳适应算法往往需要遍历整个空闲区链表以寻找符合条件的内存块。而首次适应算法由于是按照地址的顺序相连,因而在内存回收方面有着最佳适应算法无法比拟的性能。
图3显示了在几种不同情况下,动态分区内存回收机制所采取的策略。
在A中,释放区回收后合并成新内存块f,其首地址为f1内存块的首地址,大小为f1和R内存块的大小之和。在B中,释放区回收后合并成新内存块f,其首地址为R内存块的首地址,大小为f1和R内存块的大小之和。在C中,释放区回收后合并成新内存块f,其首地址为f1内存块的首地址,大小为f1和R以及f2内存块的大小之和。在D中,释放区回收后不进行合并,直接插入空闲区链表并返回。
动态分区内存的分配机制有效地避免了内存内部碎片的存在,同时在内存回收策略中使用合并算法也极大地减少了内存外部碎片存在的可能性。然而,当系统需要分配大量的小块内存时,动态分区内存管理机制的性能却并不令人满意。其不足之处主要存在以下2个方面:
①当系统分配大量的小块内存后,其空闲区表或空闲区队列将会变得异常庞大。无论是首次适配算法还是最佳适应算法都需要遍历空闲区搜索合适的内存块,因此过于庞大的空闲区结构使搜索算法变得低效。
②系统在某些特定的时刻往往会对大量的小块内存进行频繁分配和回收。频繁地对小块内存进行分割分配和合并回收,其实时性表现得并不令人满意。
基于以上2点,如何在动态分区内存管理机制的基础上优化小块内存的管理机制,成为提高动态分区内存管理性能的关键因素之一。
2 小块内存动态缓存分配机制
大部分实时操作系统内存分配机制并未对大块内存和小块内存的分配做出不同的算法设计,然而在实际分配过程中,很难用一种分配算法兼顾大小内存的高效分配。针对动态分区内存管理机制中对小块内存分配的局限性,提出了小块内存动态缓存机制。该机制在继承了动态分区管理机制优良性能的同时,优化了小块内存的管理,对内存管理的实时性和高效性都有一定提高。系统中同时存在2种内存数据结构,分别为小块内存和大块内存设计。大块内存依旧采取动态分区内存管理机制,而小块内存采取动态缓存分配。小块内存数据结构如图4所示。