首页 > 编程笔记 > Linux笔记 阅读:16

Linux中的内存管理(新手必看)

虚拟内存使你的系统看起来好像它有比物理内存更多的内存。事实上,每个进程都有很多(虚拟)内存。它是这样工作的:物理内存和虚拟内存都被划分为固定长度的块,我们称为页面。

下图显示了两个进程的虚拟地址空间,每个进程都有自己的页表。这些页表将进程的虚拟页映射到主内存(又名 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

相关文章