Linux 内存管理
文章平均质量分 96
本专栏用以整理内存开发、维护过程中的知识点和开发经验。
本专栏内容基于Linux5.4、Linux5.10、Linux6.6 源码,剖析整个内存管理的原理,剖析整个代码流程,并通过详细的框架图、时序图、流程图,帮助各个模块知识点理解。
此专栏会长期、持续的整理内存相关知识点,值得你的关注!
优惠券已抵扣
余额抵扣
还需支付
¥179.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
私房菜
独乐乐不如众乐乐!!!!
展开
-
Linux 内存管理总续
还是习惯性的以前言开篇,“深入骨髓”的程序猿思想,干啥事都想从main 开始~~在Android 项目中接触内存管理相关的有一段时间了,中间看了很多代码,看了忘,忘了看,反反复复,索性就抽点时间整理出来~~该专栏通过剖析 Linux 5.4 版本的源码,尽可能清晰、完整地总结内存管理相关的知识点,进而展示Linux 内存管理的所有模块的原理。该专栏中的原理会在持续、长期、反复地的剖析中进行补充说明。原创 2022-06-21 11:01:49 · 1061 阅读 · 14 评论 -
Linux内存管理(八十二):内存检测工具 kfence(2)
kfence虽然代码不多,但设计的内容、逻辑比较多。第一篇重在kfence 基础数据结构、kfence初始化、kfence内存分配和释放;第二篇重在kfence 缺页异常剖析、kfence report剖析、测试框架剖析、具体案例分析;原创 2023-10-26 11:03:23 · 406 阅读 · 0 评论 -
Linux内存管理(八十一):内存检测工具 kfence(1)
本文 kfence 之外的代码版本是基于 Linux5.10,最近需要将 kfence 移植到 Linux5.10 中,本文借此机会将 kfence 机制详细地记录一下。kfence,全称为,是 Linux5.12 版本新引入的内存使用错误检测机制。kfence 基本原理非常简单,它创建了自己的专有检测内存池 kfence_pool。然后在 data page 的两边加上 fence page 电子栅栏,利用 MMU 的特性把 fence page 设置为不可访问。原创 2023-10-24 16:34:28 · 593 阅读 · 0 评论 -
Linux内存管理(八十):内存管理可能出现的bug和panic
源码基于:Linux 5.4 在之前的博文《Linux内核oops panic简析》中简单分析Linux 内核异常处理的流程。本文在此基础上总结下内存管理系统中(针对arm64架构)可能出现的BUG 或 oops 或panic,并对这些情况进行剖析。因为涉及到的BUG 场景不一定相同,本篇博文应该是一个长期整理的过程。这个是编译时候就需要检验的,如果condition 为 false,会停掉编译,并发出error msg 打印。BUG_ON() 同BUG(),只不过是有condition 检查,原创 2023-05-23 15:26:31 · 809 阅读 · 0 评论 -
Linux内存管理(七十五):memcg v1 简介
全局 LRU 会swap out 任意的页数,swap out 意味着内存搬移到swap,对于memory +swap 是没有变化的。也就是说,当我们想限制swap 使用而没有影响全局 LRU,-站在操作系统的角度,限制 memory+swap 要比限制swap 好。原创 2024-06-28 10:13:08 · 488 阅读 · 0 评论 -
Linux内存管理(七十四):memcg v2 简介
memory.swap.high与max 略微不同,当cgroup 的swap使用量达到该 limit,将对cgroup 的分配进行节流,以允许用户空间实现自定义内存不足的过程。如果cgroup的内存使用量在该值下限内,则该cgroup 的内存将不会被回收,除非不受保护的cgroup中没有可用的可回收内存。如果在该 cgroup 中调用OOM killer,则无论其祖先 cgroup的 memory.oom.group为何值,都不会kill 该cgroup 以外的任何tasks。原创 2024-06-27 15:48:05 · 518 阅读 · 0 评论 -
Linux内存管理(七十三):cgroup v2 简介
术语:cgroup:control group 的缩写,永不大写(never capitalized);单数形式的 cgroup 用于指定整个特性,也用作等术语中的修饰符;复数形式的 cgroups 显式指多个独立的;cgroup 是一种机制,它将系统进程按照分层组织,并沿着这种分层以一个可控、可配置的方式来分配系统资源。原创 2024-06-27 10:17:23 · 181 阅读 · 0 评论 -
Linux内存管理(七十二):Linux PSI 原理更新(v5.15)
本文是在之前《PSI 详解 v5.4》一文基础上,整理一下PSI 原理中的细节,包含 cgroup v2 关于PSI 的原理和使用。PSI 详解 v5.4PSI 指标PSI 功能依赖CONFIG_PSI,当该 config 没有使能,psi.c是不会被编译到 image的。原创 2024-05-29 19:00:15 · 960 阅读 · 0 评论 -
Linux内存管理(七十一):Linux PSI 详解
PSI,是Pressure StallInformation 简称,是识别并量化 CPU、IO、memory 等资源紧张造成的中断,及其它对复杂工作负载甚至整个系统的时间影响。目录/proc/pressure/ 下面有三个资源指标:cpu、io、memory,可以通过cat /proc/pressure/* 方式查看压力统计信息。本篇重点围绕 PSI 原理和 PSI 在memory 上的监听和应用。原创 2022-10-24 20:43:56 · 2647 阅读 · 4 评论 -
Linux内存管理(六十六):直接内存规整详解
在前一篇博文手动规整;kcompactd 内核线程规整;直接内存规整;前两种方式已经与Linux 内核参数:compaction一文和kcompactd详解一文剖析过,本文将继续剖析第三种规整方式——直接内存规整,以及规整处理的核心函数。原创 2022-09-21 14:37:50 · 1000 阅读 · 0 评论 -
Linux内存管理(六十五):kcompactd详解
伙伴系统以页面为单位来管理内存,内存碎片也是基于页面的,即由大量离散且不连续的页面组成的。从内核角度来看,出现内存碎片不是好事情,有些情况下物理设备需要大段的连续的物理内存,如果内核无法满足,则会发生内核错误。内存规整就是为了解决内核碎片化而出现的一个功能。内核中去碎片化的基本原理是按照页面的可移动性将页面分组。迁移内核本身使用的物理内存的实现难度和复杂度都很大,因此目前的内存不迁移内核本身使用的物理页面。原创 2022-09-20 17:18:59 · 1572 阅读 · 0 评论 -
Linux内存管理(六十四):内存规整简介
伙伴系统以页面为单位来管理内存,内存碎片也是基于页面的,即由大量离散且不连续的页面组成的。从内核角度来看,出现内存碎片不是好事情,有些情况下物理设备需要大段的连续的物理内存,如果内核无法满足,则会发生内核错误。内存规整就是为了解决内核碎片化而出现的一个功能。内核中去碎片化的基本原理是按照页面的可移动性将页面分组。迁移内核本身使用的物理内存的实现难度和复杂度都很大,因此目前的内存不迁移内核本身使用的物理页面。原创 2023-02-13 11:06:33 · 747 阅读 · 0 评论 -
Linux内存管理(六十一):页面回收总结
在页面回收简介和 kswapd详解(1)一文中简单列举了Linux 内核中触发页面回收的机制,详细剖析了 kswapd 内核线程的初始化和唤醒过程,了解了唤醒 kswapd 内核线程的 3 种方式。图1是直接内存回收唤醒 kswapd 的大致流程。在kswapd详解(2)一文中详细地剖析了唤醒 kswapd 内核线程后,线程核心处理函数 kswapd() 的执行过程和注意点。图2是唤醒kswapd 和 kswapd() 处理的大致流程。在shrink_node 详解。原创 2022-09-14 15:22:23 · 1090 阅读 · 0 评论 -
Linux内存管理(六十):内核OOM机制详解
在 buddy系统慢速分配 一文中,我们分析了从快速分配流程无法分配到内存之后,会进入慢速分配流程。通过降低水位等方式修改 alloc_flags,尝试唤醒kswapd,并尝试再次分配;修改ac 的nodemask,并再次尝试分配;直接内存回收之后的尝试分配;直接内存规整之后的尝试分配;reclaim retry、compact retry 之后的尝试分配;如果经过这些努力之后还是无法分配到内存时,内核采取最后的极端分配:OOM。原创 2022-10-19 15:06:34 · 1350 阅读 · 0 评论 -
Linux内存管理(五十九):直接内存回收详解
在页面回收简介直接页面回收机制周期性回收内存机制(kswpad)slab 收割机在kswapd 详解一文第2.2此方式来自快速分配时发现当前 migrate type 中没有页面,但是能从其他 migrate type 中 steal 页面出来时,认为系统存在碎片,需要唤醒 kswapd 进行回收;此方式来自慢速分配,当通过快速分配方式之后,无法分配出pages,分配器进行慢速申请。原创 2022-09-30 17:08:44 · 1299 阅读 · 0 评论 -
Linux内存管理(五十八):PageAnon 与 PageSwapBacked
从其他一些博文中,总是说 PageAnon 表示匿名页,PageSwapBacked 也表示匿名页,但其实这两个函数还是有明显的概念区别的。本文将结合代码,详细分析这两个函数的使用场景。!原创 2022-09-16 11:30:19 · 1024 阅读 · 0 评论 -
Linux内存管理(五十七):shrink_list 详解(2)
在上一篇博文中详细分析了部分中的和详细流程见代码注释,这里有几个重点下面单独拉出来剖析。原创 2022-09-07 17:55:48 · 706 阅读 · 0 评论 -
Linux内存管理(五十六):shrink_list 详解(1)
在在一文主要分析了 shrink_lruvec,并知道在get_scan_count() 中根据扫描平衡条件,确定了anon/file LRU 扫描页数,并最终会 shrink_list() 进行深入的回收处理。本文将继续分析页面回收 shrink_lruvec() 部分的和流程。原创 2022-09-06 21:50:47 · 822 阅读 · 0 评论 -
Linux内存管理(五十五):shrink_node 详解
在页面回收简介和 kswpd(1)直接页面回收机制:在内核态里调用页面分配接口函数 alloc_pages() 分配物理页面时,由于系统内存短缺,不能满足分配请求,因此内核会直接进入页面回收机制,尝试回收内存来解决当前的燃眉之急,这就是直接页面回收机制。周期性回收内存机制:这是 kswapd 内核线程的工作职责。当内核路径调用 alloc_pages() 分配物理页面时,由于系统内存短缺,没法在低水位情况下分配出内存,因此会唤醒 kswapd 内核线程来异步回收内存。原创 2022-09-05 20:04:32 · 1154 阅读 · 0 评论 -
Linux内存管理(五十四):kswapd详解(2)
在上一篇博文出现内存碎片时的临时唤醒;内存严重短缺时的唤醒;直接页面回收中的唤醒;kswapd 内部启动的schedule;在上一篇博文中,同样也对 kswapd 所涉及的数据结构、初始化过程进行详细的剖析,本文将继续上一篇博文,详细剖析 kswapd 执行函数到页面回收的整个流程。..................原创 2022-08-30 21:56:03 · 994 阅读 · 0 评论 -
Linux内存管理(五十三):页面回收简介和 kswapd详解(1)
在LRU简介一文和LRU 第二次机会法一文中,提到当内存出现紧张的时候,会将 inactive list 尾部的 page 进行换出,从而将page 释放回buddy free list中(如果有引用则会给第二次机会)。换出(swap-out),把进程暂时不用的内存数据(anon page)存储到磁盘中,并释放这些数据占用的内存。换入(swap-in),进程再次访问这些内存时,将数据从磁盘中读到内存中直接页面回收机制周期性回收内存机制slab 收割机。............................原创 2022-08-30 15:17:20 · 1383 阅读 · 3 评论 -
Linux内存管理(五十二):LRU 第二次机会法
在经典 LRU 链表算法中,新产生的页面被添加到 LRU 链表的开头,将 LRU 链表中存在的页面向后移动一个位置。当系统内存短缺时,LRU 链表尾部的页面将会离开并被换出。当系统再需要这些页面时,这些页面会被重新置于 LRU 链表的开头。显然这个设计不是很巧妙,在换出页面时,没有考虑页面是否频繁使用。也就是说,频繁使用的页面依然会因为在 LRU 链表末尾而被换出。...........................原创 2022-08-26 18:20:09 · 940 阅读 · 0 评论 -
Linux内存管理(五十一):LRU简介
在Linux 操作系统中,当内存充足时,内核会尽量多地使用内存作为文件缓存(page cache),从而提高系统的性能。文件缓存页面会添加到文件类型的 LRU 链表中。当内存紧张时,文件缓存页面会被丢弃,或者把修改的文件缓存页面回写到存储设备中,与块设备同步之后便可释放出物理内存。现在的应用程序转向内存密集型,无论系统中有多少物理内存都是不够用的,因此Linux 系统会使用存储设备作为交换分区,内核将很少使用的内存换出到交换分区,以便释放出物理内存,这个机制称为页交换(swapping)..........原创 2022-08-25 22:41:50 · 1259 阅读 · 2 评论 -
Linux内存管理(四十六):ION 内存管理器——system heap
ION是 Google 在 Android 4.0 中引入,目的主要是通过在硬件设备和用户空间之间分配和共享内存,实现设备之间零拷贝共享内存,多用于多媒体,比如 camera、display、graphic等。ION是一个内存管理器,管理不同type的内存堆(heap),而不同的type的内存又通过不同的内存分配器来分配,比如cma、kmalloc、vmalloc等。通过《ION 总篇》原创 2023-11-28 21:50:29 · 1416 阅读 · 0 评论 -
Linux内存管理(四十五):ION 内存管理器——cma heap
ION是 Google 在 Android 4.0 中引入,目的主要是通过在硬件设备和用户空间之间分配和共享内存,实现设备之间零拷贝共享内存,多用于多媒体,比如 camera、display、graphic等。ION是一个内存管理器,管理不同type的内存堆(heap),而不同的type的内存又通过不同的内存分配器来分配,比如cma、kmalloc、vmalloc等。通过《ION 总篇》原创 2023-11-28 21:45:44 · 1225 阅读 · 0 评论 -
Linux内存管理(四十四):ION 内存管理器——总篇
ION是 Google 在 Android 4.0 中引入,目的主要是通过在硬件设备和用户空间之间分配和共享内存,实现设备之间零拷贝共享内存,多用于多媒体,比如 camera、display、graphic等。ION是一个内存管理器,管理不同type的内存堆(heap),而不同的type的内存又通过不同的内存分配器来分配,比如cma、kmalloc、vmalloc等。原创 2023-04-28 23:13:50 · 1582 阅读 · 0 评论 -
Linux内存管理(四十三):vmalloc 详解
kmalloc()、vmalloc()、malloc() 这三个函数是常用的内存分配函数,但有着本质的区别。kmalloc()基于slab 分配器,是建立在一个物理地址连续的大内存块上,所以 kmalloc() 分配的内存物理是上连续的,而且 kmalloc() 映射的虚拟内存在线性区域,也是连续的。详细可以查看《slub 分配器之kmem_cache_alloc》一文第5.1.2节。相比于 kmalloc(),vmalloc()实现是为了虚拟内存连续,而物理内存可以不用连续。原创 2023-04-17 20:55:14 · 1126 阅读 · 12 评论 -
Linux内存管理(四十二):CMA 分配器——分配原理
上一篇博文是延续《memblock初始化》一文,对 dts 中 reserved-memory 节点进行详细剖析,阐述 CMA 分配器中核心数组 cma_areas 的创建过程。本文将重点剖析 CMA 分配器的分配、释放流程,对应接口是 cma_alloc() 函数、cma_release() 函数。将 cma 分配过程通过 5 张图阐述总结,核心逻辑都在图1,此时 CMA 的内存正在被非 cma 驱动使用,其中绿色表示普通页面,紫色表示干净的文件页,此时内存还是 MIGRATE_CMA 类型;图2,原创 2024-01-08 16:42:14 · 1083 阅读 · 0 评论 -
Linux内存管理(四十一):CMA 分配器——区域创建
在一文,我们得知某些特定的设备在使用时需要大量的连续物理内存,系统为了这个目的特定提供了机制,这样为某些特定的设备提供了预留内存。但是,这样有个明显的确定:因为这些预留内存不能被系统管理使用,在设备不启动的时候,这部分内存无法被利用,这样就造成了内存利用率的降低。此时诞生了 CMA 机制,当设备在不启动时,可以将这部分内存交给系统正常分配,而在设备需要使用时,则将这部分内存交给绑定的设备使用。这样大大地提高了内存的利用率。CMA(,称为连续内存分配器,用于分配连续的大块内存。原创 2023-04-25 22:06:11 · 1167 阅读 · 0 评论 -
Linux内存管理(三十八):slub 分配器之kmalloc详解
在之前的 slub 系列博文中,详细地分析了slub 分配的初始化、创建、对象分配、对象释放的原理, linux 系统为内核一些连续内存申请提供了 kmalloc 接口,为此专门创建了不同大小的kmalloc caches,详细可以查看《slub 分配器初始化》第5节。本文在此基础上详细分析 kmalloc 相关接口。原创 2022-12-01 19:37:58 · 832 阅读 · 0 评论 -
Linux内存管理(三十七):slub 分配器之kmem_cache_destroy
在博文《slub分配器之kmem_cache_create》中详细分析了使用对外接口申请slab cache 的过程,在博文《slub分配器之kmem_cache_alloc》中详细分析了通过slab cache 分配object 的分配过程,了解了slub 分配器分配内存的快速分配和慢速分配两种方式。在博文《slub 分配器之kmem_cache_free》中详细分析了slab cache分配出去的对象的释放过程,剖析了slub 分配器内存释放的快速、慢速过程。原创 2022-11-30 15:37:27 · 755 阅读 · 0 评论 -
Linux内存管理(三十六):slub 分配器之kmem_cache_free
在博文《slub分配器之kmem_cache_create》中详细分析了使用对外接口申请slab cache 的过程,在博文《slub分配器之kmem_cache_alloc》中详细分析了通过slab cache 分配object 的分配过程,了解了slub 分配器分配内存的快速分配和慢速分配两种方式。本文将重点分析slub 分配对外的第三个接口 kmem_cache_free(),该接口用以释放slub 缓存对象。原创 2022-11-24 10:28:43 · 764 阅读 · 0 评论 -
Linux内存管理(三十五):slub 分配器之kmem_cache_create
slub 分配器初始化》一文中我们详细分析了slub 分配的初始化流程,最开始slub 系统没创建好,系统利用了局部变量和,临时创建了两个slab,创建完成后使用将全局变量和管理结构迁入,摆脱静态局部变量管理,至此slub 系统初步形成。紧接着通过创建kmalloc 需要的 slab caches(大概14组),此时通过更新为UP,标记slub 系统正式创建完成。原创 2022-11-23 12:25:23 · 630 阅读 · 0 评论 -
Linux内存管理(三十四):slub 分配器之kmem_cache_alloc
如《slub 分配器初始化》一文第3.1节 bootstrap()函数中调用 kmem_cache_zalloc() 从kmem_cache中获取object。又如《slub 分配器初始化》一文第 5 节create_kmalloc_caches() 函数中通过 kmem_cache_zalloc() 创建kmalloc cache 的object。又如一文中第6节通过 kmem_cache_alloc_node() 创建 kmem_cache_node 的object,最终调用到的都是。原创 2022-11-17 16:31:28 · 1472 阅读 · 0 评论 -
Linux内存管理(三十三):slub 分配器之__kmem_cache_create
是数据结构 kmem_cache 创建的核心函数,无论是在slab 初始化期间,还是在用户层调用 kmem_cache_create() 创建slab 描述符时,都离不开这个核心函数。为了减少slab 初始化和 kmem_cache_create() 博文的繁琐,我们将该函数单独提出来剖析。本文重点分析slub 分配器中 __kmem_cache_create() 的实现过程。原创 2022-11-16 11:20:45 · 1014 阅读 · 0 评论 -
Linux内存管理(三十二):slub 分配器初始化
在zone初始化一文中简单剖析了 zone 的初始化流程,也是继memblock初始化和SPARSEMEM初始化之后有一个内存管理层,而zone 这一层管理层中,所有的物理内存都会被添加到zone 中的成员变量free_area 数组管理,而它就是buddy 系统管理的核心数据结构。memblock初始化、SPARSEMEM初始化、zone 初始化进行了内存管理的初始化流程,而经过bootmem管理、的内核内存映射、sparse 模型创建、zone 数据结构和buddy 数据结构初始化完成后,需要通过。原创 2022-11-10 17:39:07 · 795 阅读 · 0 评论 -
Linux内存管理(三十一):slab 分配器概述
buddy 系统中分配内存时是以page为单位,在实际运用中很多内存需求是以字节为单位的,若分配一个页面,则会浪费很多的内存空间。早期 Linux 内核实现了以字节为大小的内存块分配机制,这个机制非常类似于 buddy 系统,这个简单的机制虽然减少了内存浪费,但是并不高效。slab 最早实现在操作系统中,以 Sun 公司研究员 Jeff Bonwick 发表的论文为雏形发展而来,现在已经在 Unix 和 类Unix 系统中广泛使用。内存利用率低。原创 2022-11-09 17:26:51 · 875 阅读 · 0 评论 -
Linux内存管理(二十九):内存 watermark 详解
通过描述,该属性用以强制Linux VM 保留最小的free KB数,VM 通过该属性计算系统中每一个zone 的水位watermark[WMARK_MIN] 的值。一些小内存需要满足PF_MEMALLOC 分配,如果设置该属性低于1024KB,系统可能会出现敏感地崩溃,在高负载下容易死锁。......原创 2022-01-11 20:10:09 · 3342 阅读 · 0 评论 -
Linux内存管理(二十八):buddy 分配器之页面释放
buddy 系统简介和初始化buddy 系统分配器前篇buddy 系统分配器之快速分配(1)buddy 系统分配器之快速分配(2)buddy 系统分配器之快速分配(3)页面回收简介和 kswpd(1)kswapd(2)shrink_list 详解(1)shrink_list 详解(2)在shrink_list 详解(1)和shrink_list 详解(2)最后都会将回收回来的页面通过函数free_unref_page_list() 进行回收。本文会详细分析释放页面的相关流程。原创 2022-09-09 16:58:27 · 586 阅读 · 0 评论 -
Linux内存管理(二十七):buddy 分配器之慢速分配
在buddy 系统简介一文中,详细的对 buddy 系统的分配原理进行简单地说明,并详细的剖析了 mem_init() 开始 buddy 系统的初始化过程。在buddy 分配器前篇一文中,详细的说明了分配掩码的含义、分配物理内存的入口函数,并最终得知核心的处理函数是。本函数中,会根据分配掩码和分配order 进行快速分配,若快速分配过程并不能分配到内存时,会进入慢速分配内存的过程。快速分配(1)、快速分配(2)、快速分配(3),而本文将继续分配分配器的另外一个过程——慢速分配。原创 2022-09-25 16:19:37 · 753 阅读 · 0 评论