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 分配空间。

原文地址:https://www.cnblogs.com/guoxianqi2020/p/13952804.html