首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内存管理 - slab分配器

Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续个内存页的问题。...但有时候我们只需要申请一个很小的内存区(如32字节),这时候使用伙伴分配算法就显得浪费了。为了解决小内存分配问题,Linux使用了slab分配算法。...因为本身kmem_cache_t结构体也是小内存对象,所以也应该有slab分配器来分配的,但这样就出现“鸡蛋和鸡谁先出现”的问题。...在系统初始化的时候,slab分配器还没有初始化,所以并不能使用slab分配器来分配一个kmem_cache_t对象,这时候只能通过定义一个kmem_cache_t类型的静态变量来来管理slab分配器了,

2.3K51
您找到你想要的搜索结果了吗?
是的
没有找到

linux内存源码分析 - SLAB分配器概述

之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB...大小的内存,页框分配器也不得不分配一个4KB的页框给申请者,这样就会有3KB被白白浪费掉了。...为了应对这种情况,在页框分配器上一层又做了一层SLAB层,SLAB分配器的作用就是从页框分配器中拿出一些页框,专门把这些页框拆分成一小块一小块的小内存,当申请者申请的是小内存时,系统就会从SLAB中获取一小块分配给申请者...可以看出,SLAB分配器和页框分配器并没有什么直接的联系,对于页框分配器来说,SLAB分配器也只是一个从它那里申请页框的申请者而已。...如果看了我linux内存源码分析 - 页框分配器的朋友,或许可以联系起来了。SLAB就是一组连续的页框,它的描述符结合在页描述符中,也就是页描述符描述SLAB的时候,就是SLAB描述符。

1.9K40

Linux 内核 内存管理】引导内存分配器 bootmem ① ( 引导内存分配器 bootmem 工作机制 | 引导内存分配器 bootmem 的描述 bootmem_data 结构体 )

文章目录 一、引导内存分配器 bootmem 简介 1、引导内存分配器 bootmem 引入 2、引导内存分配器 bootmem 工作机制 二、引导内存分配器 bootmem 描述 bootmem_data...结构体 一、引导内存分配器 bootmem 简介 ---- 1、引导内存分配器 bootmem 引入 Linux 内核 初始化 时 , 需要进行内存分配 , 启动阶段的 内存分配 与 运行时的 内存分配...机制不同 ; 此时 Linux 内核 提供了一个 临时的 " 引导内存分配器 bootmem " , 该 内存分配器 只在启动过程中使用 , 启动完成后 , 就会被丢弃 ; 2、引导内存分配器 bootmem...工作机制 " 引导内存分配器 bootmem " 工作机制如下 : Linux 内核初始化过程中 , 临时提供一个 " 引导内存分配器 bootmem " , 引导内存分配器 bootmem 的主要作用是...bootmem 描述 bootmem_data 结构体 ---- 在 Linux 内核中 , 使用 struct bootmem_data 结构体 , 描述 " 引导内存分配器 bootmem " ;

54030

引导内存分配器

linux内存三大分配器:引导内存分配器,伙伴分配器,slab分配器 一、引导内存分配器 1.引导内存分配器的作用因为内核里面有很多内存结构体,不可能在静态编译阶段就静态初始化所有的这些内存结构体。...另外,在系统启动过程中,系统启动后的物理内存分配器本身也需要初始化,如伙伴分配器,那么伙伴分配器如何获取内存来初始化自己呢 ?...2.引导内存分配器的原理在Linux内核中使用struct bootmem_data来描述一个引导内存分配,其节点结构下的一个成员,也就是说每一个节点都有一个引导内存分配。...3引导内存分配器的缺点尽管引导内存分配器不会造成严重的内存碎片,但是每次分配过程需要线性扫描搜索内存来满足当前的分配。...linux内核可以通过宏定义选择nobootmem 或者bootmem 来在伙伴起来之前管理内存

79110

TLSF内存分配器记录

论文:《TLSF: a New Dynamic Memory Allocator for Real-Time Systems》 这也是Unity底层使用的内存分配器。...first level存的是每个内存分配大小,从2的四次方到2的31次方。 而对应每个大小,又指向一个二级列表,里面被分成4级,每一级的范围认为是同一类。...这里的时候,这个block依然是free的,所以可以设置link_next 这样就成功从1M空间分配了72字节的内存。...因为我们的内存是连续的,对于上一块,他是被使用的,那么他会通过字节偏移访问下一块,但这样就会出错。因为中间多了8个字节。所以思路是,多申请一部分内存,把8字节扩展到足够放入一个空闲块。...然后从后面的块去重新申请对齐情况下的内存即可。 但代码写的比较费解。 我们从后面反推,首先我们知道需要申请一块更大的内存,但要大多少我们后面算。

92110

Linux 内核 内存管理】memblock 分配器 ① ( memblock 分配器简介 | memblock 结构体成员分析 | 物理内存类型 与 内存类型 )

文章目录 一、memblock 分配器 二、memblock 结构体分析 1、bottom_up 成员 2、current_limit 成员 3、memory 成员 4、reserved 成员 5、physmem...成员 三、物理内存类型 与 内存类型 ARM64 架构体系中 , 不能使用 bootmem 引导内存分配器 , 使用的是 memblock 分配器 ; 一、memblock 分配器 ---- memblock...分配器 定义在 Linux 内核源码的 linux-4.12\include\linux\memblock.h#48 位置 ; struct memblock { bool bottom_up;...memblock_type reserved; #ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP struct memblock_type physmem; #endif }; 源码路径 : linux...-4.12\include\linux\memblock.h#48 二、memblock 结构体分析 ---- 1、bottom_up 成员 bottom_up 成员表示 内存分配方式 , TRUE

77130

Linux页框分配器内存碎片化整理

页框分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下: static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned...什么是内存碎片化 Linux物理内存碎片化包括两种:内部碎片化和外部碎片化。 内部碎片化: 指分配给用户的内存空间中未被使用的部分。...例如进程需要使用3K bytes物理内存,于是向系统申请了大小等于3Kbytes的内存,但是由于Linux内核伙伴系统算法最小颗粒是4K bytes,所以分配的是4Kbytes内存,那么其中1K bytes...碎片化整理算法 Linux内存对碎片化的整理算法主要应用了内核的页面迁移机制,是一种将可移动页面进行迁移后腾出连续物理内存的方法。 假设存在一个非常小的内存域如下: ?...在linux内核里一共有3种方式可以碎片化整理,我们总结如下: ?

2.6K20

Linux内核最新的连续内存分配器(CMA)——避免预留大块内存【转】

在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着。...通过这套机制,我们可以做到不预留内存,这些内存平时是可用的,只有当需要的时候才被分配给Camera,HDMI等设备。下面分析它的基本代码流程。 1....申请连续内存 申请连续内存仍然使用标准的arch/arm/mm/dma-mapping.c中定义的dma_alloc_coherent()和dma_alloc_writecombine(),这二者会间接调用...接下来要回收page,回收page的作用是,不至于因为拿了连续的内存后,系统变得内存饥饿: -> /* * Reclaim enough pages to make sure that.../module.h> #include #include #include #include <linux

3.5K20

内存分配器性能测试

在C/C++里,自己动手实现内存分配器是很常见的事情,写过几年C/C++程序的人可能都做过这样的事情。这其中很重要的一个原因是C/C++不支持垃圾回收。...但是既然go语言已经支持垃圾回收,还有必要自己去写一个内存分配器吗?我们做一个简单的测试看看结果怎么样。...ben2 测试结果: 次数 ben1(s) ben2(s) 1 0.308 2.057 2 0.304 2.048 3 0.308 2.093 平均 0.307 2.066 结论: 可以看到,自己实现的内存分配器的执行时间大约是系统内存分配器的十分之一...因此对于一些特定应用场景,比如网络库等,使用自定义内存分配器还是很有必要的。由于go语言提供了垃圾收集功能,所以实现自定义内存分配器相比较在C/C++里简单很多。...但是对于自定义内存分配器,还需要注意多goroutine下的同步问题。

1.2K60

Linux 内核 内存管理】memblock 分配器 ⑤ ( Linux 内核中定义 memblock 分配器的位置 | ARM64体系架构下 Linux内核初始化 memblock 分配器流程 )

文章目录 一、Linux 内核中定义 memblock 分配器的位置 二、ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 三、arm64_memblock_init 函数完整源码...一、Linux 内核中定义 memblock 分配器的位置 ---- Linux 内核 定义 memblock 分配器 位置 : Linux 内核源码 linux-4.12\mm\memblock.c...; ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 : ① 解析 " 设备树二进制文件 " /memory 节点 , 将 " 所有物理内存 " 纳入到 memblock...分配器 管理之下 ; 该步骤对应的 Linux 源代码是在 linux-4.12\arch\arm64\mm\init.c#367 位置 ; /* Handle linux,usable-memory-range...memblock 分配器 中 , 删除该大小之外超出的部分物理内存 ; /* * Apply the memory limit if it was set.

85610

Linux 内核 内存管理】引导内存分配器 bootmem ③ ( bootmem 引导内存分配器算法 | 低端内存映射 | 内存记录位图 | 最先适配算法 | 内存分配记录 | 内存操作函数 )

文章目录 一、bootmem 引导内存分配器算法 1、低端内存映射 2、内存记录位图 3、最先适配算法 4、内存分配记录 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem...| free_bootmem ) 一、bootmem 引导内存分配器算法 ---- bootmem 引导内存分配器算法 ; 1、低端内存映射 低端内存映射 : 内核启动过程中 , 将 " 低端内存 "...交给 " 引导内存分配器 " 管理 , 低端内存 可以 直接映射到 内核虚拟地址空间 对应的 物理内存 ; 2、内存记录位图 内存记录位图 : 引导内存分配器 中 , 使用 " 位图 " 记录 物理页..." 位图 " , 找到 满足 内存需求大小 的 第一块 空闲的内存块 ; 4、内存分配记录 内存分配记录 : 为了有效利用内存 , " 引导内存分配器 " 支持小于 1 页的内存块分配 , bootmem_data...直接在该 物理页 上分配内存 ; 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem | free_bootmem ) ---- " bootmem 引导内存分配器 "

3.2K10

Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 页错误异常处理 ② 页表管理 ③ 引导内存分配器...: 页分配器 , 块分配器 , 不连续页分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 页分配器 " 负责分配 内存物理页 , 使用的是 " 伙伴分配器 " ; " 不连续页分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理页 “ 可以 映射到 ” 连续的虚拟页 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...: 控制管理 被 进程 占用的 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理页 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理页 ; 内存回收 : 内存不足时 ,...回收内存 ; ⑦ 页回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元

1.4K40

Linux分区页框分配器

我们现在知道物理内存是以页框为最小单位存在的,那么内核中分配页框的方法是什么呢?...分区页框分配器 页框分配在内核里的机制我们叫做分区页框分配器(zoned page frame allocator),在linux系统中,分区页框分配器管理着所有物理内存,无论你是内核还是进程,都需要请求分区页框分配器...,这时才会分配给你应该获得的物理内存页框。...当你所拥有的页框不再使用时,你必须释放这些页框,让这些页框回到管理区页框分配器当中。...__GFP_FS:请求在分配期间进行文件系统调用; __GFP_ZERO:请求将分配的区域初始化为 0; __GFP_NOFAIL:不允许请求失败,会无限重试; __GFP_NORETRY:请求不重试内存分配请求

1.4K30

Golang语言--内存分配器的实现

前几天断断续续的写了3篇关于Go语言内存分配器的文章,分别是Go语言内存分配器设计、Go语言内存分配器-FixAlloc、Go语言内存分配器-MSpan,这3篇主要是本文的前戏,其实所有的内容本可以在一篇里写完的...本文将把整个内存分配器的架构以及核心组件给详细的介绍一下,当然亲自对照着翻看一下代码才是王道。 内存布局结构图 ?...我把整个核心代码的逻辑给抽象绘制出了这个内存布局图,它基本展示了Go语言内存分配器的整体结构以及部分细节(这结构图应该同样适用于tcmalloc)。...在分析内存分配器这部分源码的时候,首先需要明确的是所有内存分配的入口,有了入口就可以从这里作为起点一条线的看下去,不会有太大的障碍。...入口函数过后,就会真正的进入到具体的内存分配过程中去了。 在真正进入内存分配过程之前,还需要了解一下整个内存分配器是如何创建的以及初始化成什么样子。

75530

Go语言内存分配器的实现

前面断断续续的写了3篇关于Go语言内存分配器的文章,分别是Go语言内存分配器设计、Go语言内存分配器-FixAlloc、Go语言内存分配器-MSpan,这3篇主要是本文的前戏,其实所有的内容本可以在一篇里写完的...本文将把整个内存分配器的架构以及核心组件给详细的介绍一下,当然亲自对照着翻看一下代码才是王道。 内存布局结构图 ?...我把整个核心代码的逻辑给抽象绘制出了这个内存布局图,它基本展示了Go语言内存分配器的整体结构以及部分细节(这结构图应该同样适用于tcmalloc)。...在分析内存分配器这部分源码的时候,首先需要明确的是所有内存分配的入口,有了入口就可以从这里作为起点一条线的看下去,不会有太大的障碍。...入口函数过后,就会真正的进入到具体的内存分配过程中去了。 在真正进入内存分配过程之前,还需要了解一下整个内存分配器是如何创建的以及初始化成什么样子。

96560

Linux 内核 内存管理】memblock 分配器 ③ ( memblock_region 内存块区域 | memblock_region 结构体成员分析 | memblock 分配器标志位 )

分配器标志枚举 1、MEMBLOCK_NONE 2、MEMBLOCK_HOTPLUG 3、MEMBLOCK_MIRROR 4、MEMBLOCK_NOMAP 一、memblock_region 内存块区域...---- memblock 分配器 中 , 内存块区域 使用 struct memblock_region 结构体进行描述 , 该结构体定义在 Linux 内核源码的 linux-4.12\include...-4.12\include\linux\memblock.h#31 二、memblock_region 结构体成员分析 ---- 1、base 成员 base 成员 表示 " 内存块区域 " 的起始地址..." 的节点编号 ; #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP int nid; #endif 三、memblock 分配器标志枚举 ---- memblock 分配器标志是一个枚举类型..., 该 枚举 定义在 Linux 内核源码的 linux-4.12\include\linux\memblock.h#23 位置 ; /* Definition of memblock flags.

30520
领券