内存受限设备的应用层内存管理(一)

来源:互联网 发布:初级数据分析师内容 编辑:程序博客网 时间:2024/04/29 06:17

 内存受限设备的应用层内存管理(一)

Raveendran Vadakkoot and Neeraj S. Sharma

译 By 郭世龙

 

1.介绍

      动态内存分配在软件开发中一直扮演着重要的角色。事实系统应用程序频繁的分配和回收内存,因此会严重的影响着性能和碎片的产生。如果实时系统中的应用程序能够管理它们自己的内存,那么就能回的更好的性能和内存管理。这篇文章讨论一个中更快更好的实时系统的动态内存分配技术。

 

2.应用级内存管理技术

      在深入讨论内存管理的C++框架开发之前,先介绍两种常见的内存管理技术的背景知识,这两种内存管理技术在开发社区中非常流行。

    明晰列表(Explicit lists)

    分离列表(Segregated lists)

这里讨论的C++框架使用了分离列表机制。

 

2a. 明晰列表(Explicit lists)

 明晰列表一般都有如下的一个链接区:

     单链表或双链表

     链表也肯能是一个环形

图1显示了连续的堆区域如何连接成一个单链表。分配的单元一般都会有一个头用来存储单元的起始位置,接下来就是实际的动态数据。内存管理系统维护一个指向头的指针,空闲链表(freelist)。一旦得到一个对象大小为X的malloc()请求(就像C/C++这样的情况),系统将遍历空闲链表(freelist)找到大小为Y的内存块,假设Y>=X,这个对象适合存放。引起的问题是如果Y比X大很多。典型的内存管理系统采取最适合策略,让Y-X的值最小来减少内存碎片。用户也可能倾向“第一适合”策略。

图1明晰链结构

 

 优点

1.容易簿记

2.簿记消耗内存少

 

缺点

1.分配回收慢,所需时间不可预测

2.单元链接困难

3.管理不当可能出现链接环

4.总体算法困难

 

2b 分离链表

 分离链表是另一种机制,这种机制中,特别大小的内存块有不同的空闲链表。

   在这种情况下,有:

   不同尺寸的内存块有不同的空闲链表

    典型的是双向链表

    链接需要头和尾

    链接顺序不需要与内存块相同

 

 

图2分离链表结构

 

优点

1.更少的碎片

2.分配和回收快

3.单元链接容易

4.定位空闲块容易

 

缺点

1.簿记困难

2.在分配困难

 

 这里讨论的C++框架使用了分离链表机制

 

3.分离链表

   任何类型的内存管理都开始于一大块连续的内存和一块空闲的内存卡。这块空闲的连续内存块首先要被初始化。

 

 初始化

 初始时,空闲块会像如下图那样,它被称为空闲链表

 

图3空闲内存块(内存池)

 

这个大块被分成小块。所有的块都是同样的大小,被称为比如说大小为M单元或页。

 

图4内存分成页

 

 小于或等于M/2的对象被放在同一个单元/页中。也就是说,大小为M的一页可以持有最大为2个大小为M/2的对象,最大4个大小为M/4的对象。为了在一个单元中识别空闲块/单元,需要使用一个位图,使用的单元标记为1,未使用的单元标记为0。这很容易的从下面的图5看出来。

 

图5指示空闲或已分配的内存块的位图

 

    在图5中,阴影的表示被使用的单元,白色表示未被使用的单元。单元内每一个块大小都为M/4。内单元不是严格限制为大小为M/4的对象。这句的意思是大小为M/4的单元可以存储大小为X的对象,这里M/8<X<=M/4,这样使它成为一个完全的二分序列。

 

   速度和响应时间都是任何事实系统中的重要一方面。这也意味着内存管理在实时性方面也应该是快速的。2的幂算法最适合获得快速效率。这里讨论的应用层内存管理也使用了2的幂技术来获得更好的效率。

 

3a.分离列表和二分算法(buddy system)

    这里讨论的算法中,所有的内存分配都是基于对象的,这里对象的大小落在2的幂的范围内。例如, 被分配对象的大小比如说是35个字节,这个对象将落在大于32(2^5)小于等于64(2^6)这个分类里。

    每一页持有一种分类的对象,将对象分组成不同的分类。就是说,一个大小为‘m’的对象在页p中被分配,这样i< m <=j (j=i+1),这里i和j是2的幂次紧邻,页内的所有的对象大小都为p,这里p=2^j.

    例如,如果分配请求是使大小为17个字节的对象X,对这具体的分配请求,上面的等式就变成16<17<=32,这里i和j是2的4和5次幂,m等于17.在这个类别里的所有的对象有32个字节,无论是否需要32个字节。存储X的页里,都会存储大小为16<X<=32字节的对象。大小没有落入这个范围的对象分配请求都会转去不同的页。

落入同样的分类的对象都会用分离链表链接在一起如下图6所示。

 

 图6:分离链数据结构

 

    有一个头“head”指针指向分类链表的第一页,也有一个尾“tail”指针指向这个分类链表的最后一页。

 (待续。。。)

内存受限设备的应用层内存管理(二)

 内存受限设备的应用层内存管理(三)