虚拟内存
虚拟内存(Virtual Memory)
普通的内存管理策略都需要在进程执行之前将整个进程放在内存中,虚拟内存技术允许执行进程不必完全在内存中。这种方案的一个显著优点就是用户会感觉到系统的内存空间比实际内存大,这种技术允许程序员不受物理内存容量的直接限制,虚拟内存也允许进程共享文件和部分地址空间。但是虚拟内存仍受地址空间和后备存储等限制,实现并不容易,如果使用不当可能会极大降低性能。
不必把整个程序一次装入内存
一个程序的代码和数据不一定会同时使用。例如,一个图片编辑程序打开后,用户可能只在裁剪图片,还没有用到滤镜或导出功能。暂时不用的部分可以不驻留在物理内存中,需要时再装入。
只看这个程序,假设它可以使用4MB物理内存,而它的代码和数据共有8MB。如果当前只需要其中2MB,就可以先让这2MB驻留,其他部分暂时保存在后备存储中。程序的总大小超过可用物理内存,并不一定意味着它无法运行;关键是运行时需要使用哪些内容。
| 程序的内容 | 大小 | 当前的位置 |
|---|---|---|
| 正在使用的部分 | 2MB | 物理内存 |
| 暂时不用的部分 | 6MB | 后备存储,如磁盘 |
程序使用虚拟地址,内存使用物理地址
操作系统为每个进程分配一套独立的虚拟地址空间,普通用户进程通过虚拟地址访问内存。操作系统建立不同进程的虚拟地址到物理地址的映射。程序访问时,CPU芯片中的内存管理单元MMU进行转换。不同进程的私有映射指向不同物理内存,避免相互干扰;共享映射则可以指向相同物理内存。
一次访问可以简单地分为三个步骤:
- 程序发出一个虚拟地址,例如100。
- MMU使用当前进程的映射,将它转换为物理地址。
- 如果对应内容已经在内存且访问被允许,就从该物理位置读取或写入。
如果需要的内容还不在物理内存中,不能直接从磁盘读取来完成这次普通内存访问。操作系统需要先把它装入物理内存、更新映射,再让程序继续。后面的分页章节会介绍这种按需装入的过程。
两个进程为什么可以使用相同的地址?
下面用一个简化映射说明:P1和P2都使用虚拟地址100,但P1的映射把它指向物理地址1100,P2的映射把它指向2100。两个进程使用相同的地址数值,却访问不同的内存位置。
这不是说所有虚拟地址都按一个固定数相加,实际映射由所采用的内存管理方式决定。这里先理解“地址数值相同,不代表物理位置相同”即可。若操作系统有意建立共享映射,两个进程也可以访问同一块物理内存。
虚拟地址与物理地址映射
解锁完整互动实验、进阶解析与精选参考答案。
虚拟内存不是额外的高速内存
虚拟内存不会凭空增加物理内存,也不会让磁盘变得和内存一样快。它让程序可以使用独立的地址空间,并在需要时调入内容。如果运行时需要的内容很多、可用内存又很少,系统就可能反复在内存和磁盘之间搬运数据,程序也会变慢。