内存管理-14-内核文档翻译-3-concepts.rst

注: 翻译自 kernel-6.1/Documentation/admin-guide/mm/concepts.rst


=================
概念概述
==================

Linux 中的内存管理是一个复杂的系统,多年来不断发展,包含越来越多的功能,以支持从无 MMU 的微控制器到超级计算机的各种系统。没有 MMU 的系统的内存管理称为“nommu”,它绝对值得专门撰写一篇文档,希望最终能够完成。尽管有些概念相同,但这里我们假设存在 MMU,并且 CPU 可以将虚拟地址转换为物理地址。


虚拟内存入门
======================

计算机系统中的物理内存是一种有限的资源,即使对于支持内存热插拔的系统,可安装的内存量也存在硬性限制。物理内存不一定是连续的;它可能作为一组不同的地址范围进行访问。此外,不同的 CPU 架构,甚至同一架构的不同实现,对这些地址范围的定义方式也存在差异。

所有这些都使得直接处理物理内存变得非常复杂,为了避免这种复杂性,虚拟内存的概念应运而生。

虚拟内存从应用软件中抽象出物理内存的细节,允许仅将所需信息保留在物理内存中(按需分页),并提供一种机制来保护进程间的数据共享并控制其安全。

使用虚拟内存,每次内存访问都会使用一个虚拟地址。当 CPU 解码一条从系统内存读取(或写入)的指令时,它会将该指令中编码的“虚拟”地址转换为内存控制器可以理解的“物理”地址。

物理系统内存被划分为页框(或页面)。每个页面的大小与架构相关。某些架构允许从多个支持的值中选择页面大小;此选择是在内核构建时通过设置适当的内核配置选项来执行的。

每个物理内存页面可以映射为一个或多个虚拟页面。这些映射由页表描述,页表允许从程序使用的虚拟地址转换为物理内存地址。页表按层次结构组织。

层次结构最低层的表包含软件使用的实际页面的物理地址。较高层的表包含属于较低层页面的物理地址。指向顶级页表的指针驻留在寄存器中。当 CPU 执行地址转换时,它使用该寄存器访问顶级页表。虚拟地址的高位用于索引顶级页表中的条目。然后,该条目用于访问层次结构的下一级,虚拟地址的下一位作为该级页表的索引。虚拟地址的最低位定义了实际页面内的偏移量。


大页面(Huge Pages)
==========

地址转换需要多次内存访问,而内存访问速度相对于 CPU 速度而言相对较慢。为了避免将宝贵的处理器周期浪费在地址转换上,CPU 会维护一个缓存,用于缓存此类转换,称为转换后备缓冲区(TLB)。通常情况下,TLB 是一种非常稀缺的资源,如果应用程序拥有较大的内存工作集,TLB 未命中会导致性能下降。

许多现代 CPU 架构允许通过页表中的更高级别直接映射内存页面。例如,在 x86 上,可以使用第二级和第三级页表中的条目来映射 2M 甚至 1G 大小的页面。在 Linux 中,这样的页面被称为“大页面”。使用大页面可以显著减轻 TLB 的压力,提高 TLB 命中率,从而提升整体系统性能

Linux 中有两种机制可以将物理内存映射到大页面。第一种是“HugeTLB 文件系统”,简称 hugetlbfs。它是一个使用 RAM 作为后备存储的伪文件系统。对于在此文件系统中创建的文件,数据驻留在内存中,并使用大页面进行映射。hugetlbfs 的描述请参见:ref:Documentation/admin-guide/mm/hugetlbpage.rst <hugetlbpage>。

另一种较新的机制支持使用大页面,称为“透明大页面”(Transparent HugePages,THP)。与需要用户和/或系统管理员配置系统内存哪些部分应该或可以被大页面映射的 hugetlbfs 不同,THP 以对用户透明的方式管理此类映射,因此得名。有关 THP 的更多详细信息,请参阅:ref:`Documentation/admin-guide/mm/transhuge.rst <admin_guide_transhuge>`。


区域(Zone)
=====

硬件通常会对不同物理内存范围的访问方式施加限制。在某些情况下,设备无法对所有可寻址内存执行 DMA 操作。在其他情况下,物理内存的大小超过了虚拟内存的最大可寻址大小,需要执行特殊操作才能访问部分内存。Linux 根据内存页面的可能用途,将内存页面分组到“zones”中。例如,ZONE_DMA 包含设备可用于 DMA 的内存,ZONE_HIGHMEM 包含未永久映射到内核地址空间的内存,ZONE_NORMAL 包含正常寻址的页面。

内存区域的实际布局取决于硬件,因为并非所有架构都定义了所有区域,并且不同平台对 DMA 的要求也不同。


节点(Nodes)
=====

许多多处理器机器都是 NUMA(非统一内存访问)系统。在此类系统中,内存被组织成多个内存块,这些内存块根据与处理器的“距离”具有不同的访问延迟。每个内存块被称为一个“节点(node)”,Linux 为每个节点(node)构建一个独立的内存管理子系统。每个节点(node)都有自己的一组区域(zone)、空闲和已用页面列表以及各种统计计数器,即统计数据也相互独立。您可以在 :ref:`Documentation/mm/numa.rst <numa>` 和 :ref:`Documentation/admin-guide/mm/numa_memory_policy.rst <numa_memory_policy>` 中找到更多关于 NUMA 的详细信息。


页面缓存(Page cache)
==========

物理内存是易失性的,将数据放入内存的常见情况是从文件中读取数据。每当读取文件时,数据都会被放入“页面缓存(page cache)”,以避免后续读取时昂贵的磁盘访问。同样,当写入文件时,数据也会被放入页面缓存中,最终进入后端存储设备。写入的页面会被标记为“脏(dirty)”,当 Linux 决定将它们重新用于其他用途时,它会确保将设备上的文件内容与更新后的数据同步。


匿名内存(Anonymous Memory)
================

“匿名内存”或“匿名映射”表示不受文件系统支持的内存(不基于文件系统)。此类映射由程序的栈和堆隐式创建,或通过显式调用 mmap(2) 系统调用创建。通常,匿名映射仅定义允许程序访问的虚拟内存区域。读取访问将导致创建一个页表项该项引用一个填充为零的特殊物理页面当程序执行写入操作时,将分配一个常规物理页面来保存写入的数据。该页面将被标记为脏页,如果内核决定重新利用该页面,则该脏页将被换出。


回收(Reclaim)
=======

在系统的整个生命周期中,物理页面可用于存储不同类型的数据。它可以是内核内部数据结构、设备驱动程序使用的 DMA 缓冲区、从文件系统读取的数据、用户空间进程分配的内存等等。

根据页面的使用情况,Linux 内存管理会对其进行不同的处理。那些可以随时释放的页面,要么是因为它们将可用的数据缓存在其他地方(例如硬盘),要么是因为它们可以再次交换到硬盘,这些页面被称为“可回收(reclaimable)”页面。可回收页面中最值得注意的类别是页面缓存和匿名内存。

在大多数情况下,保存内核数据并用作 DMA 缓冲区的页面无法重新利用,它们会一直处于锁定状态,直到用户释放。此类页面被称为“unreclaimable”。然而,在某些情况下,即使是被内核数据结构占用的页面也可以被回收。例如,文件系统元数据的内存缓存可以从存储设备重新读取,因此当系统内存压力较大时,可以从主内存中丢弃它们。

释放可回收的物理内存页面并重新利用它们的过程被称为(惊喜!)“回收(reclaim)”。Linux 可以根据系统状态以异步或同步的方式回收页面。当系统负载较低时,大部分内存处于空闲状态,分配请求将立即通过空闲页面获得满足。随着负载的增加,空闲页面的数量会下降,当达到某个阈值(low watermark)时,分配请求将唤醒“kswapd”守护进程。它将异步扫描内存页面,如果其中包含的数据在其他地方可用,则直接释放它们,否则将其移出到后备存储设备(还记得那些脏页吗?)。当内存使用量进一步增加并达到另一个阈值(min watermark)时,分配将触发“直接回收(direct reclaim)”。在这种情况下,分配将暂停,直到回收到足够的内存页面来满足请求为止。

TODO: 这里的暂停是D状态吗?


压缩(Compaction)
==========

在系统运行过程中,各种任务会分配和释放内存,导致内存碎片化。虽然虚拟内存可以将分散的物理页面呈现为虚拟连续的区域,但有时需要分配大片物理连续的内存区域。例如,当设备驱动程序需要用于 DMA 的大型缓冲区,或者 THP 分配大页面时,就可能需要分配大片物理连续的内存区域。内存“压缩”解决了碎片问题。此机制将已占用的页面从内存区域的下半部分移动到区域上半部分的空闲页面。压缩扫描完成后,空闲页面会在区域的起始处聚集在一起,从而可以分配大片物理连续的区域。

与回收类似,压缩可以在“kcompactd”守护进程中异步执行,也可以在收到内存分配请求后同步执行


OOM killer
==========

在负载较高的机器上,内存可能会耗尽,内核无法回收足够的内存来继续运行。为了挽救系统的其余部分,它会调用“OOM killer”。

“OOM killer”会选择一个任务,为了整个系统的健康而牺牲掉它。选定的任务被终止,是希望它退出后能够释放足够的内存来继续正常运行。

 

posted on 2025-04-24 15:08  Hello-World3  阅读(54)  评论(0)    收藏  举报

导航