zoukankan      html  css  js  c++  java
  • 关于linux kernel slab内存管理的一点思考


    linux kernel 内存管理是个很大的话题,这里记录一点个人关于slab模块的一点思考总结。

    有些书把slab介绍成高速缓存,这会让人和cache,特别是cpu cache混淆,造成误解。slab最开始的目的是解决频繁内存分配的效率问题,所以把频繁分配回收的对象,预先分配并初始化好,后面的对象分配回收主要就是对象管理数据的维护工作。
    linux kernel 通过把整个物理内存划分成以一个个page进行管理,管理器就是伙伴系统,它的最小分配单元就是page。但是对于小于page的内存分配,如果直接分配一个page,是一个很大的浪费。linux kernel 通过slab来实现对小于page大小的内存分配。slab把page按2的m次幂进行划分一个个字节块,当kmalloc申请内存时,通过slab管理器返回需要满足申请大小的最小空闲内存块。
    slub主要是针对slab的对象管理数据的优化版本,相比于slab,slub提供更小的管理成本开销。而且slub对多核系统的支持也更加友好。细节这里就不展开讲。
    所以kernel的内存管理是个2层分层系统,从下往上依次为:

    1. 第一层为全部物理内存:其管理器为伙伴系统,最小管理单位为page;
    2. 第二层为slab page:其管理器为slab/slub,最小管理单位为2的m次幂的字节块;


    另外为了解决多核和NUMA架构下效率问题,slab管理器kmem_cache又把slab page对象分为2层结构,从下往上依次为:

    1. 第一层为NUMA node下cpu共享page:管理器为kmem_cache_node,管理node下的slab对象,解决NUMA架构的内存访问效率问题。当本层的空闲page不足时,从伙伴系统申请空闲page;
    2. 第二层为per-cpu专属page:管理器为kmem_cache_cpu,管理cpu专属的slab对象,解决多核竞争问题。当本层的空闲page不足时,从第一层申请空闲page;

    可以看出,kernel内存管理大量使用了分层抽象的思想,这也是软件设计中控制复杂度最常见的手段。

    --EOF--

  • 相关阅读:
    数字随机码
    MYSQL数据导出乱码 MYSQL数据导入乱码
    提交表单弹出新窗口
    腾讯捐款居然用Q币,无耻!
    PowerShell如何依靠全局错误处理并执行脚本
    Windows PowerShell 2.0语言之函数和过滤器
    Windows PowerShell 2.0创建调用脚本文件
    Windows PowerShell 2.0 开发之命令别名
    Windows PowerShell 2.0之函数和脚本块共存
    Windows PowerShell 2.0命令别名技巧与内置别名
  • 原文地址:https://www.cnblogs.com/wahaha02/p/6616957.html
Copyright © 2011-2022 走看看