• 1. 内存架构
  • 1.1. UMA (Uniform Memory Access):
  • 1.2. NUMA (Non-Uniform Memory Access)
  • 1.3. UMA与NUMA的比较
  • 2. 内存管理模型
  • 2.1. FLATMEM 模型
  • 2.2. DISCONTIGMEM 模型
  • 2.3. SPARSEMEM 模型

1. 内存架构

1.1. UMA (Uniform Memory Access):

UMA(Uniform Memory Access)称为 一致性内存访问的内存架构,每个处理器都具有相同的访问权限,并且内存访问时间对于所有处理器来说都是一致的。

UMA架构特点:

  1. 内存共享:由于所有处理器都可以访问相同的内存,UMA架构非常适合需要大量内存共享的应用场景。
  2. 内存一致性:所有处理器以相同的延迟访问内存,没有本地和远程内存之分。
  3. 简化的内存管理:UMA架构简化了内存管理,因为操作系统不需要跟踪哪个处理器访问哪个内存区域。这有助于提高系统的整体性能。
  4. 缓存一致性:在UMA系统中,缓存一致性是一个关键问题。每个处理器可能有自己的缓存,因此需要确保所有处理器看到的内存状态是一致的。这通常通过缓存一致性协议(如MESI协议)来实现。
  5. 适用场景:UMA架构适用于那些处理器数量相对较少,且处理器之间的通信延迟不是主要瓶颈的系统。它通常用于桌面计算机、小型服务器和一些嵌入式系统。
  6. 性能平衡:UMA架构通过平衡内存访问时间,有助于提高系统的整体性能。然而,它可能不如NUMA架构在处理内存密集型任务时高效,因为NUMA可以减少跨节点的内存访问延迟。

1.2. NUMA (Non-Uniform Memory Access)

NUMA(Non-Uniform Memory Access)称为 非一致性内存访问 的内存架构,其中每个处理器拥有自己的本地内存,并且访问本地内存比访问远程内存更快。NUMA系统需要更复杂的内存管理策略来优化性能。

NUMA架构特点:

  1. 内存分区:在NUMA系统中,内存被划分为多个分区或节点,每个节点由一个或多个处理器管理。
  2. 内存访问延迟:NUMA架构中,处理器访问其本地节点的内存(本地内存)的延迟要低于访问其他节点的内存(远程内存)。
  3. 复杂的内存管理:需要更复杂的内存管理策略来优化性能,减少远程内存访问。
  4. 缓存一致性:NUMA系统中的处理器通常有自己的缓存,因此需要复杂的缓存一致性协议来保证数据的一致性。
  5. 适用场景:NUMA架构适用于那些需要处理大量数据和高吞吐量的系统,如数据库服务器、高性能计算(HPC)和大型数据中心。
  6. 性能优化:在NUMA系统中,优化性能通常涉及到将数据和计算任务放置在相同的节点上,以减少节点间通信的需求。
  7. 现代实现:现代的NUMA系统可能包含多个层次的内存,如L1、L2和L3缓存,以及主内存。每个处理器节点都有自己的L1和L2缓存,而L3缓存和主内存可能是共享的。
  8. 节点间通信:NUMA架构需要高效的节点间通信机制,以支持处理器访问远程内存。

1.3. UMA与NUMA的比较

  • 内存访问:UMA提供了一致的内存访问时间,而NUMA则根据内存的本地和远程属性有不同的访问延迟。
  • 内存管理:UMA的内存管理相对简单,而NUMA需要更复杂的策略来优化内存访问。
  • 可扩展性:NUMA在可扩展性方面优于UMA,适合构建大型系统。
  • 适用场景:UMA适合小型到中型系统,NUMA适合大型和高性能计算系统。
  • 性能:在处理器数量较少时,UMA可能提供更好的性能;而在处理器数量较多时,NUMA通过减少远程内存访问来优化性能。

总的来说,UMA和NUMA各有优势,选择哪种架构取决于系统的具体需求、处理器的数量以及对性能和可扩展性的要求。

2. 内存管理模型

Linux 内存管理模型主要包括三种类型:FLATMEM、DISCONTIGMEM 和 SPARSEMEM。以下是这三种模型的详细介绍:

2.1. FLATMEM 模型

  • FLATMEM(平坦内存模型)是 Linux 最早使用的内存模型,适用于物理内存连续的情况。
  • 在 FLATMEM 模型中,整个物理内存被视为一个连续的内存空间,通过一个全局数组 mem_map 来管理所有的物理页(page)。
  • 每个物理页通过 struct page 结构体进行描述,mem_map 数组中的每个元素都对应一个 struct page
  • 这种模型简单高效,但在处理不连续的物理内存或者支持热插拔内存时存在限制。

2.2. DISCONTIGMEM 模型

  • DISCONTIGMEM(非连续内存模型)是为了解决 FLATMEM 模型的局限性而引入的。
  • 在 DISCONTIGMEM 模型中,物理内存被划分为多个节点(node),每个节点管理一段连续的物理内存。
  • 这种模型允许系统处理不连续的物理内存,每个节点内部仍然采用类似 FLATMEM 的管理方式。
  • DISCONTIGMEM 模型通过 struct pglist_data 结构体来表示每个节点,节点内部仍然使用 mem_map 数组。
  • 这种模型适用于多节点系统,可以更有效地管理分散的内存资源。

2.3. SPARSEMEM 模型

  • SPARSEMEM(稀疏内存模型)是为了进一步提高内存管理的灵活性和效率而设计的。
  • SPARSEMEM 模型使用了一个 struct mem_section 数组,每个 mem_section 代表一小段连续的物理内存。
  • 这种模型允许对内存进行更细粒度的管理,特别适合于支持内存热插拔和大范围的内存地址空间。
  • SPARSEMEM 模型通过减少 struct page 结构体的数量来节省内存,只有在物理内存实际存在的地方才会创建 struct page
  • 这种模型还支持 NUMA 架构,可以有效地管理分布在不同 NUMA 节点上的内存。

SPARSEMEM 模型有两个重要的增强特性:

  • SPARSEMEM_EXTREME:针对极度稀疏的物理内存,减少 mem_section 数组的大小,只对实际存在的物理页进行初始化和管理。
  • SPARSEMEM_VMEMMAP:引入了虚拟内存映射支持,通过在虚拟地址空间中划分一个连续区域来简化 pfn_to_page() 和 page_to_pfn() 操作。

随着 Linux 内核的发展,SPARSEMEM 模型由于其灵活性和高效性,已经成为现代 Linux 系统中广泛使用的内存管理模型。