DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1121|回复: 0
打印 上一主题 下一主题

[待整理] 嵌入式系统e_slab的研究与实现

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-10 07:44:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
随着硬件技术的发展和内存容量的扩大,操作系统中内存管理技术日趋完善。但是在嵌入式领域中,硬件性能和内存容量远远落后于PC机,其内存管理受到多种因素制约,若直接采用操作系统中的内存管理技术,不仅难以达到预期效果,而且会影响嵌入式系统的性能。
       
        在嵌入式系统内存管理设计过程中,发现操作系统中的slab分配器虽然在PC机上有良好的性能,但是在嵌入式系统中不但不能发挥其优势,还降低了系统的整体性能。本文通过分析,指出了slab分配器的不足,并给出相应的解决方案。实验结果表明,slab分配器经过改进可适用于嵌入式系统。
       
        1 slab分配器分析
       
        操作系统内核运行时会频繁地为某些对象分配内存空间,而这些对象往往只需要几十或几百KB的空间,如果直接采用页面管理器进行内存分配,将产生很多内存碎片,造成严重的内存浪费。slab分配器支持细粒度的内存分配,较好地解决了此问题。由于性能优越,slab被Linux、FreeBSD等操作系统采用,是目前应用最广的内核内存管理器之一[1]。
       
        1.1 slab分配器设计思想
       
        基于页面分配器[2],将一页或几页的内存组织起来,划分成一定数量的小块内存,这种连续的页面称之为slab。它为内核中使用频繁的对象建立专门的缓冲区(cache),每种类型的对象都有自己专用的cache[2]。一个cache管理着多个slab,每个slab又管理着多个对象。slab的大小与所管理对象的大小有关。根据slab管理对象的分配情况,可将每个cache中的slab分为3类[3-4]:(1)slab管理的对象已经完全分配,没有空闲的对象;(2)slab管理的对象部分分配,还有部分空闲对象;(3)slab中的对象都未分配,都是空闲对象。
       
        不同的slab分别放入不同的队列中,即每个cache管理3个slab队列,cache与cache之间的关系如图1虚框①内所示,cache与slab的关系如图1虚框②内所示。
       
        当slab分配器接收到内存申请时,根据所申请内存的大小找到合适的cache,从cache管理的第二类slab中分配对象,若失败则从第三类slab中分配对象,若还不成功则说明cache中没有空闲对象,须为cache创建一个新的slab,从新的slab中分配空闲对象。
       
        对象释放过程中,不仅要清空对象占用的空间,而且还要调整对象所属slab的状态,判断是否改变此slab在cache中的位置。
       
        slab分配器采用着色机制将不同slab中的对象放入不同的偏移处,利用硬件高速缓存的映射机制,将页的不同偏移映射到硬件缓存的不同地址。而每个slab的开始部分访问频率最高,只要slab中起始对象的偏移不同则映射到硬件高速缓存的位置就不同,从而降低了频繁换入换出的性能损失[4-5]。
       
        1.2 slab分配器在嵌入式系统中的缺陷
       
        slab分配器虽然能解决系统对小块内存的频繁需求,但是管理结构复杂,内存分配策略开销较大。在内存受限的嵌入式系统中,slab的缺陷大大影响了系统的整体性能。总之,slab分配器存在以下三方面的缺陷:
       
            (1)slab管理结构和存储开销较大
       
        每个slab由slab描述结构、管理空闲对象的整型数组和对象三部分组成,整型数组把slab中空闲对象组成一个顺序队列,数组大小与对象数有关,每个对象对应一个整数,如图2所示。当对象较小时,整型数组将造成较大的内存开销。
       
       
            (2)cache结构复杂而且数量较多
        系统中存在着专用对象和通用对象。专用对象专门存储特定用途的数据结构,例如CPU、文件系统等,其数量与系统密切相关;通用对象用来存储一般的数据结构,大小在几十KB到几千KB之间(一般为2的整次幂字节),有十多种。不管是专用对象还是通用对象,slab分配器都为其建立了一个cache结构,众多cache组织和管理的较大开销是嵌入式系统难以承受的。
       
            (3)复杂的队列管理
       
        如图1所示,slab分配器中存在较多的队列,每个cache管理着3个slab队列,每个slab队列与cache组成循环队列。所有的cache组成双向循环队列。面对众多的队列,如何有效地管理是很困难的。
       
        1.3 slab在嵌入式系统中的改进
       
        针对上节中slab分配器的三点缺陷,给出相应的改进方案。
       
            (1)改进slab结构
       
        针对slab中对象管理数组开销过大的问题,可以将多个不同的slab合并成一个slab,从而减少slab的数量,即一个slab管理对象的大小可在一个小范围内浮动。由于slab中对象大小不同,无法确定slab中对象的大小、数量和位置,所以必须重新设置slab结构。
       
            (2)限制slab分配器管理的内存粒度范围
       
        由于内核内存管理器主要负责细粒度的内存管理,所以限制所管理对象的大小。对于大块内存的申请,直接由页面分配器处理。
       
            (3)精简队列管理
       
        简化cache中繁杂的队列,将cache中的前两个slab队列合并成一个队列。
       
        本文将经过上述三方面改进的分配器称之为e_slab分配器。
       
        2 e_slab分配器设计
       
        2.1 基本管理结构

       
            e_slab分配器有3个重要的基本结构,下面分别对其作相关介绍。
       
            (1)object_t结构
            typedef  struct object {
                    unsigned long size;
                    unsigned long offset;
            } object_t;
       
            object_t是描述对象的基本结构,每个对象对应一个object_t结构,它描述了对象的大小和下一个空闲对象的地址。
       
            (2)e_slab_t结构
            typedef struct e_slab _s {
                    struct list_head    list;
                    void                *s_mem;
                    unsigned int        units;
                    unsigned int        free;
            } e_slab _t;
       
            e_slab _t是管理对象的基本结构,它不仅描述了本结构的页块起始地址,而且存储了空闲对象的数量和地址等信息。
       
            object_t、e_slab _t和对象结构如图3虚框②内所示。
       
            (3)cache结构
            typedef struct cache_s {
                    struct list_head    next;
                    struct list_head    slab_list;
                    unsigned int        objsize;
                    unsigned int        gfporder;
                    unsigned int        num;
                    …
            } cache_t;
       
            cache的描述结构为cache_t,它主要描述了所管e_slab的基本信息。由于cache_t结构大小相同,可把cache_t看做一个专用对象,所有的cache组织在一起。
       
            cache管理的所有e_slab被加入到list队列。把管理所有cache的结构称之为cache_cache。cache_cache与cache之间有两种关系:一种是双向队列关系,如图3虚框①内所示,cache_cache利用双向链表将系统中所有的cache(包括专用cache和通用cache)组成循环队列;一种是cache与对象之间的关系。
       
         
        2.2 e_slab分配器初始化
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-12-29 01:15 , 耗时 0.090578 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表