• Linux内存-SLAB


    一、内部碎片
    当我们申请几十个字节的时候,内核也是给我们分配一个页,一个页大小在Linux中默认是4K,这样在每个页中就形成了很大的浪费,称之为内部碎片。
     
    二、什么是slab?
    在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。那么该如何分配呢?slab分配器就应运而生了,专为小内存分配而生。slab分配器分配内存以Byte为单位。但是slab分配器并没有脱离伙伴系统,而是基于伙伴系统分配的大内存进一步细分成小内存分配。
     
    slab分配器是基于对象进行管理的,相同类型的对象归为一类(如进程描述符是一类),每次当要申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存到该列表中,而不是直接返回给伙伴系统,从而避免这些内存碎片。

    四、slab的作用
    1、节省空间,减少内存碎片化:Slab对小对象进行分配,不用为每个小对象分配一个页
    2、提高系统效率:当对象拥有者释放一个对象后,SLAB的处理是仅仅标记对象为空闲,并不做多少处理,而又有申请者申请相应大小的对象时,SLAB会优先分配最近释放的对象
     
    五、kmem_cache
    kmem_cache是用于描述SLAB的一种结构,并且管理着这种SLAB中所有的对象。
    cache中的内存块来自一到多个slab
    一个slab来自物理内存管理器的一到多个物理页
    一个slab被分成一组固定大小的块,被称为slab对象(object)
    六、slab的状态
    slabs_full:slab 中的所有对象被标记为使用。
    slabs_free:slab 中的所有对象被标记为空闲。
    slabs_partial:slab 中的对象有的被标记为使用,有的被标记为空闲。
    slab 分配器首先从部分空闲的slab 进行分配。如没有,则从空的slab 进行分配。如没有,则从物理连续页上分配新的slab,并把它赋给一个cache ,然后再从新slab 分配空间。

  • 相关阅读:
    【QTP】自动化测试:
    sql基本语句
    【转】ASP.NET网站怎么发布web项目程序和怎么部署
    NHibernate的简单例子
    解决ehcache的UpdateChecker问题
    正则表达式的贪婪与懒惰
    Linux查找文件夹名
    centos安装lxml和pyspider
    如何通过写一个chrome扩展启动本地程序
    网页图片滚动效果
  • 原文地址:https://www.cnblogs.com/guoxianqi2020/p/13952804.html
Copyright © 2020-2023  润新知