Slob分配对象大小是从三个链中选择的

static LIST_HEAD(free_slob_small);

static LIST_HEAD(free_slob_medium);

static LIST_HEAD(free_slob_large);

对于小于256字节的对象,将从free_slob_small链表中寻找slob进行分配;

对于小于1024字节的对象,将从free_slob_medium链表中寻找slob进行分配;

对于大于1024字节的对象,将从free_slob_large链表中寻找slob进行分配;

对于大于PAGE_SIZE的对象,将直接通过伙伴系统分配,不经手Slob分配器;

那么总共只有三个链表,Slob分配器的各类缓存怎么管理自己的空闲对象呢?实际上,所谓的不同类别的缓存都只是伪缓存,因为它们并没有专属自己的内存。当你在Slob分配器中创建一个缓存时,只是声明了该缓存的对象的大小size、对齐值align等,那么当要从该缓存分配对象时,将会根据size定位到相应的链表,寻求分配。因此专用缓存分配对象(kmem_cache_alloc())和普通缓存分配对象(kmalloc())并无太多区别,它们的对象都来源于这三个链表,只不过内核欺骗性的保留了这些接口而已。由此可以想象,struct kmem_cache这个结构在Slob分配器中是很简洁的

1.  struct kmem_cache {

2.      unsigned int size, align; //对象大小,对齐值

3.      unsigned long flags;      //属性标识

4.      const char *name;         //缓存名

5.      void (*ctor)(void *);     //分配对象时的构造函数

6.  };

在Slob分配器中,一个slob永远都是占用一个页框的大小,所以对于大于PAGE_SIZE的对象,会选择直接通过伙伴系统分配。

Slob分配器将描述slob的变量打包成一个结构,然后和页描述符struct page一起组成一个联合体,这样就可以直接利用页描述符已占有的空间,将页描述符中无关紧要的字段填充为slob的有效描述字段,这样便可以省下一笔内存了!

1.  struct slob_page {

2.      union {

3.          struct {

4.              unsigned long flags;/* 填充用,为了不覆盖page->flags */

5.              atomic_t _count;      /* 填充用,为了不覆盖page->_count */

6.              slobidx_t units;      /* slob的空闲单元数 */

7.              unsigned long pad[2];

8.              slob_t *free;       /* 指向第一个空闲块 */

9.              struct list_head list;  /* 用于链入slob全局链表 */

10.         };

11.         struct page page;

12.     };

13. };

1.  #if PAGE_SIZE <= (32767 * 2)

2.  typedef s16 slobidx_t;

3.  #else

4.  typedef s32 slobidx_t;

5.  #endif

对于不同类型的块来说,其管理数据也略有不同:

对于空闲的普通块(占用的单元数大于1),则第一个单元用来填充块的大小,第二个单元用来填充下一个空闲块的偏移

对于小得空闲块(只占用1个单元),则该单元填充下一个空闲对象的偏移的相反数,也就是说是一个负数

对于已经分配出去的块,第一个单元用来填充块的大小

linux Slob内存管理小析相关推荐

  1. 剖析linux的内存管理与分配

    文章目录 伙伴算法 **1.伙伴算法原理** **2.物理页的分配** **3. 物理页的释放 ** **总结** Slab分配机制 **1.Slab如何对内存进行管理?** **2.Slab中如何实 ...

  2. 全网独一无二值得收藏的,Linux的内存管理

    Linux的内存管理 Linux的内存管理是一个非常复杂的过程,主要分成两个大的部分:内核的内存管理和进程虚拟内存.内核的内存管理是Linux内存管理的核心,所以我们先对内核的内存管理进行简介. 一. ...

  3. Linux堆内存管理深入分析(上)

    Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全   0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏 ...

  4. 转:浅谈Linux的内存管理机制

    一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概 ...

  5. 浅谈Linux的内存管理机制

    一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概 ...

  6. Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园

    Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园 Linux系统内存管理之伙伴系统分析 今天去面试,一位面试官提到了内存管理的伙伴系统,当时就懵了,因为根本就没有听说过.晚上回来在实验 ...

  7. Linux堆内存管理深入分析

    0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢 ...

  8. linux按进程分配物理内存,linux下内存管理学习心得(一)

    最近在学习内存管理的时候,发现对linux下的所谓内存如何管理如何分配都不熟悉,通过最近的查阅资料可总结如下,如有不妥之处欢迎大家批评与指正. 总的的来说linux的内存管理其实主要难理解的是以下几个 ...

  9. Linux glibc内存管理:用户态内存分配器——ptmalloc实现原理

    文章目录 ptmalloc 设计假设 Arena Chunk Bins 内存分配.释放流程 总结 C++ STL : SGI-STL空间配置器源码剖析 Linux 内存管理 | 物理内存管理:物理内存 ...

最新文章

  1. 谈谈机器学习的基本问题,不谈数学!
  2. Myeclipse优化设置,加速你的开发武器
  3. 2012_02_07
  4. python中的赋值、浅拷贝和深拷贝
  5. 中级前端开发推荐书籍
  6. 带你入门SpringCloud 之 服务网关 Zuul
  7. react-native props和state传值
  8. Python: subprocess.Popen()不支持unicode问题解决
  9. 用命令行发邮件——让你更加了解smtp
  10. 【CTR】ESMM:多任务联合学习
  11. 又出现*_limited.sof的问题了,还有另一个奇怪的现象!
  12. Gradle下载 Jar 包
  13. 微信打开网址后自动调用手机自带默认浏览器或提示选择浏览器打开如何实现
  14. Moodle 安装的时候提示 original IP
  15. Zint生成多种条码及二维码
  16. IP协议号与传输层端口
  17. 注册表编辑已经被您的系统管理员停用
  18. 小德张-清朝最后一位首领太监
  19. 由旋转矩阵到Rodrigues
  20. 计算机二级c编程题特殊技巧,计算机国家二级C机试编程题技巧

热门文章

  1. 让状态栏上有显示电池电量百分比
  2. onnxruntime gpu 推理
  3. 应用迁移之Jexus安装
  4. 谁的青春不苦逼,谁的未来是确定?
  5. python-pip 安装
  6. <力扣刷题>442. 数组中重复的数据
  7. 用gcc生成静态库和动态库.pdf以及opencv的使用
  8. Java程序员需要掌握
  9. STM32固件库编程-----点亮led小灯
  10. php 真实姓名,原来王一博是他的艺名,得知真实名字后,网友:得亏改了