Linux中的内存管理(新手必看)
虚拟内存使你的系统看起来好像它有比物理内存更多的内存。事实上,每个进程都有很多(虚拟)内存。它是这样工作的:物理内存和虚拟内存都被划分为固定长度的块,我们称为页面。
下图显示了两个进程的虚拟地址空间,每个进程都有自己的页表。这些页表将进程的虚拟页映射到主内存(又名 RAM)中的物理页面。

图 1 虚拟内存管理概览
多个虚拟页可以通过各自的进程级页表指向同一个物理页。在某种意义上,这就是内存管理的核心:有效地为每个进程提供其页面实际存在于 RAM 中的假象,同时优化地使用现有空间。
每次 CPU 访问进程的虚拟页面时,原则上 CPU 必须将进程使用的虚拟地址转换为相应的物理地址。为了加快这一过程(可能是多层的,因此很慢),现代 CPU 架构支持一种称为转换后援缓冲器(TLB)的片上查找。
TLB 实际上是一个小缓存,在发生错误时,它会导致 CPU 通过进程页表计算页面的物理地址并更新 TLB。
传统上,Linux 的默认页面大小为 4KB,但从内核 v2.6.3 开始,它支持大页面,以更好地支持现代架构和工作负载。例如,64 位 Linux 允许每个进程使用最多 128TB 的虚拟地址空间(虚拟是理论上可寻址的内存地址数量),总共大约 64TB 的物理内存(物理是你机器中的 RAM 数量)。
好的,这是很多理论信息。让我们从更实际的角度来看一下。一个非常有用的工具是 /proc/meminfo 接口,它可以计算出内存相关的信息,比如有多少内存可用:
下图显示了两个进程的虚拟地址空间,每个进程都有自己的页表。这些页表将进程的虚拟页映射到主内存(又名 RAM)中的物理页面。

图 1 虚拟内存管理概览
多个虚拟页可以通过各自的进程级页表指向同一个物理页。在某种意义上,这就是内存管理的核心:有效地为每个进程提供其页面实际存在于 RAM 中的假象,同时优化地使用现有空间。
每次 CPU 访问进程的虚拟页面时,原则上 CPU 必须将进程使用的虚拟地址转换为相应的物理地址。为了加快这一过程(可能是多层的,因此很慢),现代 CPU 架构支持一种称为转换后援缓冲器(TLB)的片上查找。
TLB 实际上是一个小缓存,在发生错误时,它会导致 CPU 通过进程页表计算页面的物理地址并更新 TLB。
传统上,Linux 的默认页面大小为 4KB,但从内核 v2.6.3 开始,它支持大页面,以更好地支持现代架构和工作负载。例如,64 位 Linux 允许每个进程使用最多 128TB 的虚拟地址空间(虚拟是理论上可寻址的内存地址数量),总共大约 64TB 的物理内存(物理是你机器中的 RAM 数量)。
好的,这是很多理论信息。让我们从更实际的角度来看一下。一个非常有用的工具是 /proc/meminfo 接口,它可以计算出内存相关的信息,比如有多少内存可用:
$ grep MemTotal /proc/meminfo ① MemTotal: 4014636 kB $ grep VmallocTotal /proc/meminfo ② VmallocTotal: 34359738367 kB $ grep Huge /proc/meminfo ③ AnonHugePages: 0 kB ShmemHugePages: 0 kB FileHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB
- ❶ 列出物理内存(RAM)的详细信息,这里是 4GB;
- ❷ 列出虚拟内存的详细信息,这比 34TB 多一点;
- ❸ 列出大页面信息,显然这里的页面大小是 2MB。