浅学物理内存模型

83 阅读3分钟

CPU和物理内存之间架构说明

(1)UMA架构(Uniform Memory Access) 一致内存访问方式,多个CPU公用一条总线

特点:将多个主存(物理内存),看成一个主存来访问,每个CPU访问主存是同样快的

当一个CPU需要从内存中读取数据时,首先会检查总线是否忙碌中

  1. 如果总线空闲,那么CPU将数据的内存地址放到总线,然后等待主存将所需的数据放在总线上
  2. 如果总线忙,那么CPU只能等待,直到总线空闲

缺点:这种系统设计完全受到总线带宽的限制,多数CPU在大部分时间里它时空闲的

解决方案:为每个CPU都增加高速缓存

image.png

(2)NUMA架构(Non-uniform memory access) 非一致内存访问

image.png

对称多处理技术(Symmetrical Multi-Processing)——SMP

SMP 的全称是 Symmetric Multi-Processing,中文为“对称多处理器”。它是一种多处理器(多CPU)计算机体系结构的设计理念,其最核心的特征是:

在操作系统中,所有处理器(CPU核心)都是对等的、对称的。 它们共享相同的硬件资源(特别是内存和I/O),并且在功能上可以完全互换。

UMA 和 NUMA 都属于 SMP 的具体实现,linux操作系统内核这两种架构都是支持的。

image.png

image.png

image.png

Linux操作系统中的物理内存模型

(1)平坦内存模型

Linux最初提供的内存模型(自0.11版本就存在),通过简单的线性映射将物理内存与数组mem_map对应起来

image.png

(2)不连续内存模型

为NUMA这种架构设计的一种物理内存模型,也就说“不连续内存模型” 只能用在NUMA架构上,深度捆绑了。

image.png

(3)稀疏内存模型

image.png

特性平坦内存模型 (Flat Memory Model)不连续内存模型 (Discontiguous Memory Model)稀疏内存模型 (Sparse Memory Model)
定义将整个系统的物理内存视为一个连续的、线性的地址空间。内核使用一个简单的mem_map数组来管理所有物理页帧(page frame),数组下标直接对应物理页帧号(PFN)。物理内存被划分为多个连续的内存块(每个块内部连续,块与块之间不连续)。每个内存块由一个pg_data_t(一个节点) 结构管理。在UMA系统中,只有一个节点;在NUMA系统中,通常每个物理内存节点对应一个pg_data_t。为了克服不连续内存模型在具有大量内存空洞的系统上的扩展性问题而引入。它不再假设物理地址空间是近乎连续的,而是使用内存段(mem_section)的动态映射来管理页帧,能够高效地处理任意大小的物理内存空洞。
Linux内核版本最早版本(Linux 1.0) 即使用此模型。在 2.3.51版本中引入CONFIG_DISCONTIGMEM配置选项,以更好地支持早期的NUMA架构(如Intel IA64的SGI IA-64平台)。其雏形在2.6.25版本中成为默认模型(用于x86-32),并逐步取代了不连续内存模型。它现在是支持CONFIG_SPARSEMEM 选项的现代内核的标准和默认选择。
适合的架构UMA (Uniform Memory Access)主要是NUMA (Non-Uniform Memory Access),但也用于具有巨大物理地址空洞的复杂UMA架构。同时支持 UMA 和 NUMA,特别是具有巨大物理地址空间和大量内存空洞的现代架构(无论是UMA还是NUMA)。

现状:

-   平坦和不连续内存模型在现代内核中已被弃用或基本淘汰。
-   稀疏内存模型(CONFIG_SPARSEMEM) 是当前所有主流架构(x86, ARM64, RISC-V等)的默认和推荐选择。它提供了最好的灵活性、性能和对内存热插拔的原生支持。

因此,在今天的Linux系统中,当你讨论内存模型时,绝大多数情况下都是在讨论稀疏内存模型(Sparse Memory Model)。

image.png