Linux 内存管理(八)之 slab 分配器

Linux内核:内存管理——slab分配器 Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求,比如说几个字节或者几百个字节,如果依然分配一个页框来来满足该请求,那么这很明显就是一种浪费,即产生内部碎片(internal fragmentation)为了解决小块内存的分配,Linux内核基于Solaris 2.4中的slab分配算法实现了自己的slab分配器。除此之外,slab分配器另一个主要功能是作为一个高速缓存,它用来存储内核中那些经常分配并释放的对象。 阅读详情
AI摘要

本文详细介绍了Linux内核中的Slab算法,旨在解决内存管理中的内部碎片问题。文章探讨了Slab算法的工作机制,包括普通和专用高速缓存的区别、Slab与Buddy系统的联系,以及Slab分配器的基本概念。同时,文中还阐述了Slab算法如何通过对齐内存中的对象和使用Slab着色策略来提高内存利用率。


前言

在上一节 Linux 内存管理(七)之伙伴系统算法 中,我们学习了 Linux 内核如何使用伙伴系统算法以页为单位管理内存,进行内存分配。这一节,将要提到的 slab 算法也是一种内存分配算法。

一、为什么要引入 slab 算法

Linux 内存以页为单位进行内存管理,伙伴系统算法以 2 n 2^n 2n 次方个页面来进行内存分配管理,最小为 2 0 2^0 20,也就是一页,最大为 2 11 2^{11} 211,就是 4MB 大小的连续内存空间。但是页的粒度还是太大,Linux 下是 4KB 大小,也就是 4096 个字节,而内核本身有很多数据结构时时刻刻都需要分配或者释放,这些数据的大小又往往小于 4KB 大小,一般只有几个几十个字节这样的大小。而且大多数情况下,需要的内存大小都不是按页对齐的

比方最常用到的 task_struct(进程描述符)结构体和 mm_struct(内存描述符)结构体,其中,sizeof task_struct = 9152,sizeof mm_struct = 2064。这样一来如果所有的这些数据结构都按照页来分配存储和管理,那么内存中将会有大量的内存碎片。

一种更好的算法源自 slab 分配器模式,该模式最早用于 Sun 公司的 Solaris2.4 操作系统中。这就是 slab 算法。

由上可知,slab 分配需要解决的就是是内存的内部碎片问题。

二、slab 算法的工作机制

1、普通和专用高速缓存

高速缓存被分为两种类型:普通和专用。普通高速缓存只由 slab 分配器用于自己的目的而专用高速缓存由内核的其余部分使用。

普通高速缓存是:

  • 第一个高速缓存叫做 kmem_cache,包含由内核使用的其余高速缓存的高速缓存描述符。cache_cache 变量包含第一个高速缓存的描述符。
  • 另外一些高速缓存包含用作普通用途的内存区。内存区大小的范围一般包括 13 个几何分布的内存区。一个叫做 malloc sizes 的表(其元素类型为 cache_sizes)分别指向 26 个高速缓存描述符,与其相关的内存区大小为32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536 和 131072 字节。对于每种大小,都有两个高速缓存:一个适用于 ISA DMA 分配,另一个适用于常规分配。

2、slab 和 buddy system 的关系

slab 系统与 buddy 系统所要解决的问题是互补的,一个解决外部碎片一个解决内部碎片,但事实上,slab 在新建 cache 时同样需要用到 buddy 来为之分配页面,而在释放 cache 时也需要 buddy 来回收这此页面。也就是说,slab 是依赖于 buddy 系统的。

在某些情况下内核模块可能需要频繁的分配和释放相同的内存对象,这时候 slab 可以作为内核对象的缓存,当 slab 对象被释放时,slab 分配器并不会把对象占用的物理空间还给伙伴系统。这样的好处是当内核模块需要再次分配内存对象时,不需要那么麻烦的向伙伴系统申请,而是可以直接在 slab 链表中分配一个合适的对象。

3、slab 分配器基本概念

3.1 slab

slab 是 slab 分配器从伙伴系统申请页面的基本单位。然而 slab 的大小不是固定的,slab 从属于某个 kmem cache 实例,不同的 kmem cache 实例,其 slab 的大小是不同的。slab 的大小必须是 2 o r d e r 2^{order} 2order 个 pages,order 不能超过伙伴系统所支持的最大的 order。

slab 内存分配器从伙伴系统分配了 slab 之后,会将其挂在对应的 kmem cache 实例的 node 节点。

3.2 object

object 是 slab 分配器对外提供的申请内存的基本单位。slab 分配器从伙伴系统申请了 buddy 之后,会将其拆分成一个个的 object,并缓存在 kmem cache 实例的 cpu_cache 中,用户申请内存时,其实获取的就是一个个object。

一旦 object 缓存耗尽,就会重新从伙伴系统申请 slab,并再次将其拆分成 object,放入 kmem cache。

3.3 cache

slab 分配器中的 cache 跟硬件 cache 无关,是一个纯软件的概念。slab 内存分配器有两种 cache:一个是 slab 的 cache,一个是 object 的 cache。slab 内存分配器从伙伴系统获取页面后,会将其加入 kmem cache 的 node 节点,这个就是 slab 的 cache;将 slab 拆分成多个 object,并将 object 加入kmem cache 的 cpu_cache 内存池,这个就是 object 的 cache;可以看到这两种 cache 实际是对共同的物理页面的两种缓存形式。

4、slab 的基本思想

在内核中,经常会使用一些链表,链表中会申请许多相同结构的结构体,比如文件对象,进程对象等等,如果申请比较频繁,那么就为它们建立一个内存池,内存池中都是相同结构的结构体,当想申请这种结构体时,直接从这种内存池中取一个结构体出来。一个物理页就可以作用这种内存池的载体,进而进行充分利用,减少了内部碎片的产生。

所以 slab 的基本思想是,先利用页面分配器分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存空间分配的需要。也就是用对象的概念来管理内存。

而所谓的对象就是存放一组数据结构的内存区,为便于理解可把对象看作内核中的数据结构(例如:task_struct, file_struct 等)。

相同类型的对象归为一类,每当要申请这样一个对象时,slab 分配器就从一个 slab 列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存在该列表中,而不是直接返回给伙伴系统,从而避免内部碎片。

5、对齐内存中的对象

slab 分配器所管理的对象可以在内存中进行对齐,也就是说,存放它们的内存单元的起始物理地址是一个给定常量的倍数,通常是 2 的倍数。这个常量就叫对齐因子(alignment factor)。

slab 分配器所允许的最大对齐因子是 4096,即页框大小。这就意味着通过访问对象的物理地址或线性地址就可以对齐对象。在这两种情况下,只有最低的 12 位才可以通过对齐来改变。

6、slab 着色

同一硬件高速缓存行可以映射 RAM 中很多不同的块,相同大小的对象倾向于存放在高速缓存内相同的偏移量处。在不同的 slab 内具有相同偏移量的对象最终很可能映射在同一高速缓存行中。高速缓存的硬件可能因此而花费内存周期在同一高速缓存行与 RAM 内存单元之间来来往往传送两个对象,而其他的高速缓存行并未充分使用。slab 分配器通过一种叫做 slab 着色(slab coloring)的策略尽量降低高速缓存的这种行为:把叫做颜色(color)的不同随机数分配给 slab。

在 slab 内放置对象就有很多种可能的方式。方式的选择取决于对下列变量所做的决定:

  • num:可以在 slab 中存放的对象个数(其值在高速缓存描述符的 num 字段中)。
  • osize:对象的大小,包括对齐的字节。
  • dsize:slab 描述符的大小加上所有对象描述符的大小,就等于硬件高速缓存行大小的最小倍数。如果 slab 描述符和对象描述符都存放在 slab 的外部,那么这个值等于 0。
  • free:在 slab 内未用字节(没有分配给任一对象的字节)的个数。

一个 slab 中的总字节长度可以表示为如下表达式: s l a b 的长度 = ( n u m ∗ o s i z e ) + d s i z e + f r e e slab 的长度=(num * osize)+dsize +free slab的长度=(num∗osize)+dsize+free。

slab 分配器利用空闲未用的字节 free 来对 slab 着色。具有不同颜色的 slab 把 slab 的第一个对象存放在不同的内存单元,同时满足对齐约束。可用颜色的个数是 f r e e / a l n free/aln free/aln(这个值存放在高速缓存描述符的 colour 字段)。因此,第一个颜色表示为 0,最后一个颜色表示为 ( f r e e / a l n ) − 1 (free/aln)-1 (free/aln)−1。

如果用颜色 col 对一个 slab 着色,那么,第一个对象的偏移量(相对于 slab 的起始地址)就等于 c o l ∗ a l n + d s i z e col*aln+dsize col∗aln+dsize 字节。下图显示了 slab 内对象的布局对 slab 颜色的依赖情况。着色本质上导致把 slab 中的一些空闲区域从末尾移到开始。

slab 着色

只有当 free 足够大时,着色才起作用。显然,如果对象没有请求对齐,或者如果 slab 内的未用字节数小于所请求的对齐( f r e e ≤ a l n free \leq aln free≤aln),那么,唯一可能着色的 slab 就是具有颜色 0 的 slab,也就是说,把这个 slab 的第一个对象的偏移量赋为 0。

三、slab 的数据结构

1、slab 的结构图

slab
每个 kmem_cache 都是链接在一起形成一个全局的双向链表,由 cache 指向该链表,系统可以从 Cache_chain 开始扫描每个 kmem_cache,来找到一个大小最合适的 kmem_cache,然后从该 kmem_cache 中分配一个对象。

2、slab 结构解释

2.1 cache_chain

最高层是 cache_chain,这是一个 slab 缓存的链接列表。可以用来查找最适合所需要的分配大小的缓存(遍历列表)。cache_chain 的每个元素都是一个 kmem_cache 结构的引用(称为一个 cache)。它定义了一个要管理的给定大小的对象池。

2.2 kmem_cache

结构体定义如下:

/*
 * Slab cache management.
 */
struct kmem_cache {
    // slab cache 的管理标志位,用于设置 slab 的一些特性
    // 比如:slab 中的对象按照什么方式对齐,对象是否需要 POISON  毒化,是否插入 red zone 在对象内存周围,是否追踪对象的分配和释放信息 等等
    slab_flags_t flags;
    // slab 对象在内存中的真实占用,包括为了内存对齐填充的字节数,red zone 等等
    unsigned int size;  /* The size of an object including metadata */
    // slab 中对象的实际大小,不包含填充的字节数
    unsigned int object_size;/* The size of an object without metadata */
    // slab 对象池中的对象在没有被分配之前,我们是不关心对象里边存储的内容的。
    // 内核巧妙的利用对象占用的内存空间存储下一个空闲对象的地址。
    // offset 表示用于存储下一个空闲对象指针的位置距离对象首地址的偏移
    unsigned int offset;    /* Free pointer offset */
    // 表示 cache 中的 slab 大小,包括 slab 所需要申请的页面个数,以及所包含的对象个数
    // 其中低 16 位表示一个 slab 中所包含的对象总数,高 16 位表示一个 slab 所占有的内存页个数。
    struct kmem_cache_order_objects oo;
    // slab 中所能包含对象以及内存页个数的最大值
    struct kmem_cache_order_objects max;
    // 当按照 oo 的尺寸为 slab 申请内存时,如果内存紧张,会采用 min 的尺寸为 slab 申请内存,可以容纳一个对象即可。
    struct kmem_cache_order_objects min;
    // 向伙伴系统申请内存时使用的内存分配标识
    gfp_t allocflags; 
    // slab cache 的引用计数,为 0 时就可以销毁并释放内存回伙伴系统重
    int refcount;   
    // 池化对象的构造函数,用于创建 slab 对象池中的对象
    void (*ctor)(void *);
    // 对象的 object_size 按照 word 字长对齐之后的大小
    unsigned int inuse;  
    // 对象按照指定的 align 进行对齐
    unsigned int align; 
    // slab cache 的名称, 也就是在 slabinfo 命令中 name 那一列
    const char *name;  
};

2.3 slabs_full、slabs_partial、slabs_empty

每个缓存都包含了一个 slabs 列表,这是一段连续的内存块(通常都是页面)。其中每个 kmem_cache 有三条链表:

  • slabs_full 表示该链表中每个 slab 的 object 对象都已经分配完了
  • slabs_partial 表示该链表中的 slab 的 object 对象部分分配完了
  • slabs_empty 表示该链表中的 object 对象全部没有分配出去(空 slab,未分配)

对象的分配和释放都是在 slab 中进行的,所以 slab 可以在三条链表中移动,如果 slab 中的 object 都分配完了,则会移到 full 链表中;如果分配了一部分 object,则会移到 partial 链表中;如果所有 object 都释放了,则会移动到 empty 链表中;其中当系统内存紧张的时候,slabs_empty 链表中的 slab 可能会被返回给系统。

2.4 cache_cache

所有的 kmem_cache 结构都是从 cache_cache 分配的:

static kmem_cache_t cache_cache = {
     slabs_full:     LIST_HEAD_INIT(cache_cache.slabs_full),
     slabs_partial:  LIST_HEAD_INIT(cache_cache.slabs_partial),
     slabs_free:     LIST_HEAD_INIT(cache_cache.slabs_free),
     objsize:        sizeof(kmem_cache_t),
     flags:          SLAB_NO_REAP,
     spinlock:       SPIN_LOCK_UNLOCKED,
     colour_off:     L1_CACHE_BYTES,
     name:           "kmem_cache",
};


struct cache_size{
	size_t cs_size;
	struct kmem_cache *cs_cachep;
}

struct cache_size malloc_sizes[] = { 
	{.cs_size = 32},
	{.cs_size = 64},
	{.cs_size = 128},
	{.cs_size = 256},
	................
	{.cs_size = ~0UL},
};

在系统初始化时,内核会调用 kmem_cache_init 函数对 malloc_size 数组进行遍历,对数组中的每个元素都调用 kmem_cache_create() 函数在 cache_cache 中分配一个 struct kmem_cache 实例,并且把 kmem_cache 所在的地址赋值给 cache_size 中的 cs_cachep 指针。

深入linux内核架构--slab分配器(建议收藏) 但是仔细想一想kmem_cache_node中的slab页帧结构你会发现,如果没有着色偏移的话,那么每次对应的缓存行一般都是从一个固定值开始的,假如我们忽略slab head的大小,每次slab对象都从页的起始位置开始分配,由于slab对象与cache line 一般来说是不等的,那么每次映射的缓存行一般是0 ~ 61或者0 ~ 62这种,所以62,63这种缓存行就会有较低访问概率,所以就需要这个着色偏移,还有一个__per_cpu array_cache用于表示该缓存在各个CPU中的slab对象; 阅读详情

相关推荐

【Linux 内核源码分析】内存管理——Slab 分配器

Slab 分配器 在Linux内核中,伙伴分配器是一种内存管理方式,以页为单位进行内存的管理和分配。但是在内核中,经常会面临结构体内存分配问题,而这些结构体的大小通常是小于一页的。如果使用伙伴分配器来分配这些小内存,将造成很大的内存浪费。因此,为了解决这个问题,Sun公司的Jeff Bonwick在Solaris 2.4中设计并实现了一种新的内存分配器——slab分配器。 与伙伴分配器不同的是,slab 分配器以字节为单位来分配内存,并基于伙伴分配器的大内存进一步细分成小内存进行分配。也就是说,slab 分

C/C++Linux、音视频、DPDK 1812

linux内核内存管理slab

linux内存管理核心是伙伴系统,slab,slub,slob是基于伙伴系统之上提供api,用于内核内存分配释放管理,适用于小内存(小于1页)分配与释放,当然大于1页,也是可以的.小于一页的,我们也可以直接用伙伴系统api申请内存和释放,但伙伴系统最小单位是页,如果我们只需要100byte,伙伴系统申请内存最小1页(一般情况1页是4k, 具体看系统PAGE_SHIFT定义),显然就很浪费。

子木 1865

Linux内存管理(3) - slab分配器和kmalloc

本文目的在于分析Linux内存管理机制的slab分配器。内核版本为2.6.31。 1.    SLAB分配器 内核需要经常分配内存,我们在内核中最常用的分配内存的方式就是kmalloc了。前面讲过的伙伴系统只支持按页分配内存,但这个单位太大了,有时候我们并不需要这么大的内存,比如我想申请128字节的空间,如果直接使用伙伴系统则需分配4KB的一整页,这显然是浪费。 slab分配器将页拆分为更小

落尘纷扰的专栏 5243

Linux内核中的内存管理——slab

在学习c语言时,我们常常会使用到malloc()去申请一块内存空间,用于存放我们的数据。刚开始我们只要知道申请内存时使用用malloc去申请一块就可以,而其中的原理我们并不关心。但是随着我们对运行环境的要求越来越多样化,复杂化,以及对稳定性以及性能问题的要求逐渐变得越来越重要时,我们往往需要关注到性能问题。而研究性能问问,如果只停留在知道使用malloc()可以去申请一块内存空间是远远不够的,此时我们就需要去研究相关的原理和代码。

tombaby_come的博客 2972

Linux内存管理-slab分配器

slab分配器

Cool_summer_wind的博客 1251

Linux内存管理—Slab分配器

Slab分配器的引入 内部碎片 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间 内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。 举例:某进程向系统申请了3K内存空间,系统通过伙伴系统算法可能分配给进程4K(一个标准页面)内存空间,导...

qq_43313035 1120

Linux内存管理(八): slub分配器和kmalloc

slab分配器

Hober 2999

linux内存管理 -- Slab

碎片即一个完整的东西被打碎,零散的分布着。这就像内存,如果不加以管理,就会有很多未被使用的碎片,造成内存的浪费。 在linux中,内存是以页(page)来管理的,一page一般为4KB,而外部/内部碎片就是以page为界线划分的。内部碎片就是指被内核分配出去但是不能被利用的内存,而外部碎片是指由于频繁地申请和释放页框而导致的某些小的连续页框,比方只有一个页框,无法分配给需要大的连续页框的进程而导致的内存碎片。如一个page的前后都被分配了出去,没有其他page与之相连,这个page就成了外部碎片。这时候bu

badbayyj的博客 3296

Linux内存管理之SLAB分配器

注:本文讲述的SLAB相关代码是基于Linux内核v4.7,代码网址。 1、SLAB分配器的由来 在讲SLAB分配器之前先说两个概念: 内部碎片和外部碎片。 外部碎片指的是还没有被分配出去(不属于任何进程)但由于太小而无法分配给申请内存空间的新进程的内存空闲区域。外部碎片是除了任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因...

ibless的博客 9244

嵌入式开发实战:如何用cJSON库在STM32上实现轻量级JSON通信(附完整代码)

本文详细介绍了如何在STM32嵌入式系统中使用cJSON库实现高效的JSON通信方案。针对嵌入式环境的内存限制,提供了内存优化策略、cJSON库的深度定制方法以及完整的通信流程实现代码,帮助开发者解决JSON解析效率低下和跨平台兼容性等核心挑战。

star5的专栏 471

ANSYS Workbench接触分析实战:从算法选择到收敛难题破解

本文深入解析ANSYS Workbench接触分析的核心技术与实战技巧,涵盖四大接触算法选择、收敛难题破解秘籍及典型场景参数设置。通过实际案例演示如何优化接触刚度、pinball区域和非对称行为等关键参数,帮助工程师有效解决结构非线性问题,提升仿真效率和精度。

weixin_28705087的博客 358

Linux 内存管理 SLUB 分配器

来自文章https://lwn.net/Articles/229984/的翻译

小立仔 1747

11. TI MSPM0G3507 DMA传输实战:ADC数据自动搬运与电压采集

本文以TI MSPM0G3507为例,详细讲解了如何利用DMA(直接存储器访问)实现ADC数据的自动搬运与电压采集。通过实战演示,解放CPU资源,提升系统实时性与效率,适用于电赛备赛及嵌入式开发中的数据采集场景。

weixin_42465140的博客 130

Linux slab 分配器源码解析

基于Linux内核2.6.32 slab 分配器源码解析

小立仔 2470

MIKE水动力笔记7_实测数据与模型输出结果的拟合对比

上一博文【MIKE水动力笔记6】主要讲解如何自己制作实测数据的时间序列文件dfs0,而本博文讲解如何进行实测数据与模型输出结果的拟合对比。

晏长街的博客 1万+

27、物联网中的量子密钥分发:安全通信新范式

本文探讨了物联网(IoT)快速发展所带来的安全挑战,并提出量子密钥分发(QKD)作为应对新兴威胁的新范式。文章详细介绍了QKD的基础原理、BB84协议的实现流程以及其在物联网中的应用前景,同时强调了安全专业人员提升技能、制定标准化指南以及跨学科合作的重要性。通过利用量子力学特性,QKD能够提供更高的通信安全性,抵御量子计算等未来威胁,为物联网的安全发展提供保障。

tequila的博客 155

SLAB 分配器详解

虽然对象分配和释放的操作只针对处理器本地的活动 slab,但是在某些特殊的情况下会为当前处理器创建新的活动 slab 并把原先未用完的活动 slab 加到 NUMA 节点 的Partial 队列中(例如,在处理器 A 上运行的某内核执行绪申请对象,但是 A 的活动 slab 中已经没有空闲对象,因此必须创建新的 slab。SLAB 分配器多年以来一直位于 Linux 内核的内存管理部分的核心地带,内核黑客们一般不愿意主动去更改它的代码,因为它实在是非常复杂,而且在大多数情况下,它的工作完成的相当不错。

m0_74282605的博客 1525

最新Python爬虫实战(入门爬虫篇)——案例8:图书网畅销榜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过 Python 爬虫技术,成功实现了对图书网畅销榜多页数据的批量爬取与 Excel 保存。代码采用模块化设计,包含分页参数构造、API 接口请求、JSON 数据解析、Excel 数据持久化等完整流程;通过配置模拟浏览器的请求头,有效规避基础反爬策略,保证请求的稳定性。整个爬虫逻辑遵循 “分页遍历 → 接口请求 → JSON 解析 → 提取图书信息 → 保存到 Excel” 的标准流程,与电商类接口爬取范式高度一致。

努力让自己发光,对的人才能迎着光而来 29万+

Linux 内存管理(1):伙伴分配器与 SLAB 分配器深度解析

1. 地址计算规则伙伴块地址计算公式:伙伴地址 = 块地址 ^ (1 << (order + PAGE_SHIFT))示例:Order 1 块(2 页)在 0x1000:0x1000 ^ (1 << (1+12)) = 0x1000 ^ 0x2000 = 0x30002. 内部碎片问题请求大小实际分配碎片率1 页1 页0%3 页4 页25%5 页8 页37.5%7 页8 页12.5%

小嵌同学的博客 1544

【QGIS入门实战精品教程】1.2:QGIS与ArcGIS的区别和联系

以下是GISGeography官方给出的两者之间的27点比较(译): 官方网址:https://gisgeography.com/qgis-arcgis-differences/ 1.QGIS容纳更多的数据格式 ArcGIS没有支持所有的数据格式,毫无疑问,QGIS在处理各种类型的数据时非常顺手,QGIS在数据格式方面是个多面手,在使用数据方面是它的长处。 QGIS使用GDAL/OGR库来读取和写入地理信息数据格式,支持超过70种矢量格式。QGIS一开始就是为了与PostGIS协作而诞生的,而支持的名单.

智慧空间实验室 2039

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

linux 内存管理-slab分配器

伙伴系统用于分配以page为单位的内存,在实际中很多内存需求是以Byte为单位的,如果需要分配以Byte为单位的小内存块时,该如何分配呢? slab分配器就是用来解决小内存块分配问题,也是内存分配中非常重要的角色之一。 slab分配器最终还是由伙伴系统分配出实际的物理内存,只不过slab分配器在这些连续的物理页面上实现了自己的算法,以此来对小内存块进行管理。 slab分配器把对象分组放进高速缓存,每个高速缓存都是同种类型对象的一种"储备"。 包含高速缓存的主内存被划分为多个slab,每个slab由一

Amelio Ming 1365

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

内存管理机制SLAB

详解Linu内核中的内存管理机制SLAB

qq_51148151的博客 1420

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux下Slab分配器

通过预分配和复用相同大小的内存块来优化频繁分配/释放的场景(如。,是 Linux 内核高效内存管理的基础设施之一。Slab 分配器是 Linux 内核中的一种。,减少内存碎片并提升性能。Slab 的核心价值在于。

weixin_45837496的博客 864

Linux slab分配器

本文深入分析了Linux内核中的SLUB分配器原理与实现。SLUB是Linux内核默认使用的三种slab分配器之一,专门针对大型服务器系统设计。文章从SLUB的整体架构入手,详细阐述了其数据结构、内存分配与释放流程、缓存管理机制等核心内容。 首先介绍了SLUB的三级缓存结构:CPU本地缓存(kmem_cache_cpu)、NUMA节点缓存(kmem_cache_node)和伙伴系统后备缓存。重点分析了kmem_cache、kmem_cache_cpu和kmem_cache_node等关键数据结构的设计与作用

tang_vincent的博客 1120

Linux内核的SLAB内存管理机制

Linux内核的SLAB内存管理机制

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1920
上一篇: Linux 内存管理(七)之伙伴系统算法
下一篇: Linux 进程调度(一)之初识进程
Projectsauron
博客等级 码龄4年 2587粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值