1. 虚拟内存与物理内存的基本概念
第一次听说虚拟内存这个概念时,我正被一个奇怪的问题困扰着:为什么我的4GB内存电脑能同时运行十几个程序,而每个程序都显示自己拥有4GB内存空间?这显然不符合常理。后来我才明白,这就是虚拟内存的魔法。
物理内存就是我们常说的内存条,它是实实在在的硬件组件。当你购买一台8GB内存的电脑,这8GB就是物理内存的大小。而虚拟内存则是一个抽象概念,它让每个程序都"以为"自己独占了完整的地址空间。在32位系统中,这个空间大小是4GB(2^32),64位系统则大得多(2^64)。
虚拟内存的出现解决了早期计算机面临的几个关键问题:
- 内存隔离:没有虚拟内存时,程序可以直接访问物理内存,一个程序出错可能影响整个系统
- 内存利用率:物理内存有限,虚拟内存通过分页机制让多个程序高效共享物理内存
- 连续地址空间:程序可以使用连续的虚拟地址,而实际物理内存可能是碎片化的
我曾在调试一个内存泄漏问题时,发现程序占用的虚拟内存高达几十GB,但实际物理内存使用只有几百MB。这正是虚拟内存的精妙之处——它允许程序使用比实际物理内存大得多的地址空间。
2. 地址映射与页表机制
理解地址映射最好的方式是通过一个实际例子。假设你正在开发一个图像处理程序,需要处理一张大图。在程序中,你看到的图像数据地址是连续的(比如0x1000到0x2000),但实际上,这些数据可能分散在物理内存的不同位置,甚至部分数据暂时存储在磁盘上。
操作系统通过页表(Page Table)来实现这种映射。页表就像一本地址翻译字典:
- 每个进程有自己的页表
- 页表项记录虚拟页到物理页的映射关系
- 额外标志位记录页面的权限和状态
在Linux中,可以通过/proc/[pid]/maps查看进程的虚拟内存布局。我曾用这个命令排查过一个内存越界问题,发现某个库被映射到了意外的地址区域。

1679

被折叠的 条评论
为什么被折叠?



