Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1319697
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-04-02 11:20:39

Linux内核代码分析 slab.c by 刘亢
slab.c来自linux内核2.4.22版,本文件按照GNU协议发布。
一、准备知识:
  1. slab的概念:
    • 提出的原因:由于操作系统在运行中会不断产生、使用、释放大量重复的对象, 所以对这样的重复对象的生成进行改进可以大大提高效率
    • 最早由sun的工程师提出(1994年)并首先在sunos5.4上应用。
  2. slab算法的基本思路:分配: if(对相对应的缓存区有空闲位置) 使用这个位置,不必再初始化; else{ 分配内存; 初始化对象; } 释放: 在缓存中标记空闲,不做析构; 资源不足: 寻找未使用的对象空间; 按照要求对部分对象做析构; 释放对象占用的空间;
  3. 缓存区:每一个对象放在一个缓存区
  4. slab:每个slab块都是页面大小的整数倍(有上限)
  5. 着色:字节数按照硬件的要求对齐,可以大大提高硬件缓存的利用率和效率。
  6. slab块的两种管理模式:
    • on-slab 适用于小对象(小于1/8页),slab管理结构存放在slab块中。
    • off-slab适用于大对象,(大于等于1/8页),对象和slab块的管理结构都由cache_slabp中分配。 根据slab提出者的论文,slab不适合用在大对象上。
  7. slab涉及的重要操作:
    • 缓存区创建kmem_cache_create与销毁kmem_cache_destory
    • 缓存区收缩kmem_cache_shrink与扩张kmem_cache_grow
    • 对象分配kmem_cache_alloc与释放kmem_cache_free
    • 内核态内存的申请kmalloc与释放kfree
二、涉及的重要数据结构:
  1. typedef unsigned int kmem_bufctl_t:slab块中的管理结构
  2. cache_size表:保存了不同大小(2^n)页面指向cache_cache的两种指针(dma和非dma)。
  3. 链表:最重要的是在管理slab结构中出现的3个链表,分别为完全使用的,部分使用的和完全没用过的slab。
  4. 结构体:见下面的代码分析。
====
http://hi.baidu.com/starmyth/blog/item/e6d10ec7cc1c55d8d1006020.html

阅读(782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~