内存管理机制

aCoral内存管理机制

aCoral内存管理机制在伙伴系统基础上,采用了位图法方式提高内存分配和回收速度的确定性,更能满足系统实时性的需求。

aCoral内存管理机制分为两级,上一级采用改进的伙伴系统,负责确定要分配的内存的大小,下一级根据上一级确定的大小进行具体物理内存分配。

  1. 因为第一级内存管理总会分配2N大小的内存,解决了系统外部碎片和内部碎片问题。
  2. 第二级采用了固定块和可变大小两种内存管理方式。
  3. 除内核外,应用程序一般直接使用第一级的伙伴系统。

aCoral第一级内存管理算法

在这里插入图片描述

真正的物理内存被分成了两部分,一部分由内存控制块结构所使用,内存初始化函数buddy_init()将逐个初始化这些结构。剩下的内存是用户可用内存。

这些内存被划分为众多基本块,每个基本块的大小通过常量BLOCK_SIZE配置,这些基本内存块是从0到n逐个标记的。这样内存的分配和回收都是基于序列的。

逻辑上这些内存块被组织成了m层,最大层数m通过LEVEL配置,第0层每个内存块大小为BLOCK_SIZE,第1层每个内存块大小为2*BLOCK_SIZE,到第n层内存块大小为BLOCK_SIZE<<n。

aCoral第二级内存管理算法

内存资源池存储管理

内存资源池管理属于固定大小内存管理系统,内存池中内存块的分配和回收是基于第一级内存管理系统的,因为内存池中的内存块时由第一级内存管理的。

内存池资源管理系统主要用于操作系统的一些常用结构的内存管理
例如,线程控制块TCB、事件控制块ECB等,这些结构在系统运行过程中,比如会用到,而且会频繁地建立和释放。

使用第一级管理系统当然可以满足这些需求,为什么还要用的内存资源池这种机制进一步管理这些结构,对其进行内存分配和回收呢?

虽然第一级内存管理算法单次分配和回收内存的效率已经很高,但是频繁地回收和释放还是要消耗一定的时间。如果可以事先分配一些常用结构大小的内存,并把他们组织起来形成内存资源池,那么当操作系统真正需要的时候只需要将这些指针返回即可。在操作系统使用完这些结构并且销毁时,就可以把这些结构所占用的内存还给内存资源池,而不用进行真正的内存回收。

在这里插入图片描述
每一类资源[如线程控制块TCB结构(aCoral定义了六种资源类型)]可以拥有多个资源池Pool,每个资源池只为一种类型的资源所使用(内存体现就是相同大小内存块)。

资源控制块Pool_ctrl负责一类资源的管理,一个资源池控制块会对应多个资源池,如图所示就包括两个资源池Pool1、Pool2。

开始的时候,系统会根据需要为每一类资源控制块(如TCB)分配一些资源池,一旦资源池的资源用完时,可以重新申请一个资源池,然后挂载到空闲资源池链表上。每个资源池对应一个Pool结构,这个结构有两个重要的指针base_adr和res_free,分别用来指向资源对象数组的基址和空闲资源对象,每个资源对象对应一个资源控制块,如线程控制块TCB。如果某资源池的资源对象都用完时,res_free会指向NULL。

typedef struct {
  unsigned int type;
  unsigned int size;            ///<size of one single resource eg.size of TCB
  unsigned int num_per_pool;    ///<the amount of resource in one pool eg.there are 20 TCBs in one TCB pool
  unsigned int num;             ///<the amount of pools which contain a certain type of resource(maybe TCB) in system at present will be added once one pool created; restrict by max_pools below;
  unsigned int max_pools;       ///<upbound of the amount of pools for this type. eg. the number of TCB pool limited to 2 because that there are at most 40 thread in system at one time and every TCB pool contains 20.
  acoral_list_t *free_pools;
  acoral_list_t *pools,list[2];
  unsigned char *name;
}acoral_pool_ctrl_t;
/**
 * @brief  资源池
*/
typedef struct {
   void *base_adr; ///<这个有两个作用,在为空闲的时候,它指向下一个pool,否则为它管理的资源的基地址
   void *res_free;
   int id;
   unsigned int size;
   unsigned int num;
   unsigned int position;
   unsigned int free_num;
   acoral_pool_ctrl_t *ctrl;
   acoral_list_t ctrl_list;
   acoral_list_t free_list;
}acoral_pool_t;

为了实现资源池的管理,aCoral定义了资源对象。

typedef union {
   int id; //资源ID,当资源池空闲时,ID的高16位表示该资源对象在资源池的编号
   int next_id;
}acoral_res_t;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值