1.分区(partition)
内存管理的目的是允许应用程序能从一大块内存中分配和释放一小块内存,这是在内存分配器的控制下进行的。在OS21系统中,将这大块内存称作partition(分区)。内存的一个分区结构体存在如下属性:1)被管理的内存块;2)当前被分配的和释放状态;3)内存状态分配与释放的策略。
内存分配/释放的方法与partition被使用的方法相似,仅仅是分配算法上的差异。partition管理的内存区域并无特殊之处,既可是静态数组或局部数组,也可是一块绝对地址,也可是其他partition所分配的一块空间(一个partition又可分配出多个partition)。由于多个内存分区可以互存,使得应用程序的不同部分使用了不同的内存分区,如果某部分应用程序出现错误,不会影响到整个系统,这种机制可以提高OS21系统应用程序的容错性。
Partition控制块结构体如下:
struct partition_s
{
semaphore_t * lock;
partition_t * parent;
memory_allocate_fn allocate;
memory_deallocate_fn deallocate;
memory_reallocate_fn reallocate;
memory_status_fn status;
void * state;
size_t size;
};
第一个元素用于对该partition的加锁,互斥操作,通过两个宏来实现:_PARTITION_LOCK(p)、_PARTITION_UNLOCK(p)。
2. 内存分配策略
OS21支持三类分区:
1)Heap: 堆分区的分配类似于C语言中的malloc()和free(),使用memory_allocate()与memory_deallocate()。OS21具有将释放后的两块相邻内存合并的功能。尽管这种方式十分通用,但仍有些不足:分配和释放的时机不确定,这取决于之前的分配/释放以及空闲空间的搜索性能。
2)Fixed: 分配固定块大小,克服了heap分配的缺点,意味着分配和释放内存块消耗固定的时间。使用partition_create_fixed()或partition_create_fixed_p()来创建fixed分区,但调用memory_allocate()时不需要分配大小作为参数。
3)Simple: allocate only, no free, zero bytes overhead。
下图是一个分区与多个分区之间的关系:
OS21操作系统-存储管理
一般当创建根分区后,还需要在此基础上创建heap、fixed、simaple三种类型之一的分区。