内存体系结构
1. UMA VS NUMA
有两种类型的计算机,分别以不同的方式管理物理内存:
1)UMA(uniform memory access)计算机,将内存以连续的方式组织起来。SMP系统中每个处理器都是访问同一块内存。
2)NUMA(non-uniform memory access)计算机,总是多处理器计算机,系统各个CPU有各自本地的内存访问,各个处理器之间的总线是连着的,可以访问其他CPU,但是要慢一些。
UMA总线逻辑更简单,但是访问速度要慢,带宽低;NUMA总线逻辑更复杂,但是访问更高效,带宽高,也更容易伸缩。UMA更适合分时系统,NUMA更适合实时系统,UMA并行能力特别差。下面我们讲解的主要是NUMA系统,因为弄懂了NUMA系统的内存管理,UMA就特别容易理解了。
【推荐阅读】
2. 内核空间-内存组织
- 内存划分为节点(pg_data_t),每个节点关联到系统中的一个处理器
每个节点有划分成内存域(zone),目前内存域分为四种:(三个内核内存域,一个用户内存域)ZONE_DMA/ZONE_DMA32,ZONE_NORMAL,ZONE_HIGHMEM。通过划分内存域可以更好的管理,针对不同的场景进行更好的优化。
· ZONE_DMA标记适合DMA的内存域,在IA-32计算机上,一般的现在是16MB,该区域供I/O设备直接访问,不需要通过MMU管理,连续分配,具有更高的性能。
· ZONE_DMA32,标记了使用32位地址可寻址、适合DMA的内存域,显然只有64位系统上,才会有该内存域。
· ZONE_NORMAL,可以直接映射到内核段的普通内存域,这是所有体系机构上保证都会存在的唯一内存域,在IA-32系统上,该域可访问的最大内存不超过896MiB,超过该值的内存只能能通过高端内存寻址访问ZONE_HIGHMEM中的内存。
· ZONE_HIGHMEM,超出了内核段的物理内存。只有在可用物理内存多余可映射的内核内存时,才会访问该域,显然一般只有32位系统上才会有可能有该区域。通过kmap及kunmap将该域内存映射到内核虚拟地址空间。
· ZONE_MOVEABLE,这个区域主要是给用户空间分配使用。
前三个zone主要为内核所用到,最后一个主要被用户空间用到,内核空间内存域具体划分见下图:
内核空间内存域zone划分
由于内核核心不依赖于高端内存,所以一般优先分配高端内存,高端内存分配完毕后才会分配普通内存。
内存组织结构见下图:
NUMA系统中的内存划分
数据结构如下:
enum zone_type {
#ifdef CONFIG_ZONE_DMA
ZONE_DMA,
#endif
#ifdef CONFIG_ZONE_DMA32
ZONE_DMA32,
#endif
ZONE_NORMAL,
#ifdef CONFIG_HIGHMEM
ZONE_HIGHMEM,
#endif
ZONE_MOVABLE,
#ifdef CONFIG_ZONE_DEVICE
ZONE_DEVICE,
#endif
__MAX_NR_ZONES
};
typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES]; /*内存域*/
struct zonelist node_zonelists[MAX_ZONELISTS]; /* 备域(NUMA备用节点) */
int nr_zones; /* 内存域数目 */
#ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
struct page *node_mem_map; /* 所有内存域中的页 */
#ifdef CONFIG_PAGE_EXTENSION
struct page_ext *node_page_ext; /* 内存页的更多描述信息*/
#endif
#endif
unsigned long node_start_pfn; /* 节点起始页帧编号(系统中的所有节点的页帧编号唯一) */
unsigned long node_present_pages; /* total number of physical pages */
unsigned long node_spanned_pages; /* total size of physical page
range, including hol