基于2.4.22
目录
1 共享模型
1.1 内存在计算机的地位
如下是一张非常简单的系统关系图,描述的是处理器(CPU)、内存(DDR)以及磁盘(Disk)三者之间的关系,可以看到DDR是作为一个CPU与Disk沟通的桥梁。
CPU作为计算机指令的执行中心,其运算速度非常快,但是其却不能存储数据,一旦断电,数据就会消失;
Disk则作为数据的存储中心,具有即使断电数据能够保存的特点。
然而CPU与Disk的读写速度相差非常大,甚至高达1000多倍,由于木桶效应,当出现IO读写需求时,Disk的将极大的降低系统性能,所以引入中间件DDR。
DDR与CPU类似,同样会断电丢失数据,其读写速度与CPU仅有10倍左右的差距,将数据缓存到DDR可以有效改善Disk速度差的问题。
然而,DDR由于价格的原因,其存储容量相比Disk有较大的差异,主流的DDR仅有8G左右的容量,而Disk高达1T,甚至更高,同时,CPU具有访问整个Disk的需求,
在较少容量的DDR如何更加有效的访问Disk就是整个内存管理要处理的问题。
1.2 内存共享模型
由于CPU架构的不断发展,现如今已经发展出来了多核心以及多内存条集成到一个计算机系统的组成架构;那就会衍生出一个问题,每个核心使用同一个主存的优先级以及速度是否相同,为此出现了两种内存共享模型
UMA(Uniform Memory Access)均匀存储器存取模型(手机、PC):不同核心访问主存之间优先级以及速度无差异
NUMA(NonUniform Memory Access)非均匀存储器存取模型(服务器):不同核心访问主存之间优先级以及速度有差异
uniform 英[ˈjuːnɪfɔːm] 美[ˈjuːnɪfɔːrm]
n. 制服; 校服;
adj. 一致的; 统一的; 一律的;
v. 使均一;使穿制服;
UMA:
NUMA:
2. Linux物理内存的层次
为了更好地描述物理内存,Linux把物理内存划分为三个层次来管理 :
2.1 节点
对大型机器而言,内存会分成许多簇(bank),每个簇被认为是一个节点,在linux 中的 struct pg_data_t 体现了这一概念,系统中的每个节点链接到以NULL结尾的 pgdat_list链表中,而其中的每个节点利用 pg_data_t node_next 字段链接到下一个节点.
而在UMA架构中,只有一个静态contig_page_data变量。
2.2 管理区
在内存中,每个节点被分成很多成为管理区(zone)的块,用于表示内存中的某个范围。一个管理区又一个 struct zone_struct描述,定义为zone_t.
3.3 页帧
整个系统内存被划分成固定大小的物理页帧, 每个物理页面帧由一个struct page描述
所有的结构都存储在一个全局mem_map数组中,该数组通常存放在ZONE_NORMAL的首部,或者就在小内存系统中为装入内存映像而预留的区域之后
这些结构的基本关系如下图: