虚拟内存的基本概念
3.1 讲的所有方案都有一个共同前提:作业必须全部装入内存才能运行。
这个前提带来两个绕不过去的限制:大作业根本装不下;内存里同时能放的作业数有限,多道程序度上不去。
虚拟内存的思路是取消这个前提——只装一部分,用到别的再说。
机制
传统存储管理的两个特征,恰恰是问题所在
一次性:作业必须一次性全部装入内存才能运行。
驻留性:作业装入后就一直驻留内存,直到运行结束,期间不会被换出(哪怕它有大段代码这辈子都不会执行)。
这两条造成的浪费是巨大的:一个程序里往往有大量很少甚至从不执行的代码——错误处理分支、罕用功能、只在特定条件下走的路径。它们和核心逻辑一起挤占着内存。
局部性原理:为什么”只装一部分”是可行的
虚拟内存能成立,靠的是程序访问行为的一条统计规律:
时间局部性:某条指令或某个数据一旦被访问,不久之后很可能再次被访问。原因是程序中大量存在循环。
空间局部性:一旦某个存储单元被访问,其附近的单元也很可能马上被访问。原因是指令通常顺序执行,数据常以数组等连续结构存放。
由此得出一个关键推论:程序在任一小段时间内,实际访问的地址范围是很窄的。既然如此,内存里只需保留这一小块”当前活跃”的部分,其余留在外存,需要时再调进来即可。
局部性原理同时也是快表 TLB和 Cache 能够有效的共同基础——它们都在赌”刚用过的东西马上还会用”。
虚拟存储器的三个特征
多次性:作业分成多次调入内存,不必一次装完。这是虚拟存储最重要的特征,直接否定了传统方式的”一次性”。
对换性:作业运行过程中,页面可以换进换出,不必全程驻留。对应地否定了”驻留性”。
虚拟性:从逻辑上扩充了内存容量,使用户看到的内存远大于实际内存。
三者的关系是有层次的:多次性和对换性是手段,虚拟性是结果。 而多次性和对换性又都以离散分配为前提——若要求连续,就没法只装一部分。
虚拟内存的实现方式
三种,都是在 3.1 对应方案上加”请求调入”和”置换”功能:
- 请求分页存储管理(最常用)
- 请求分段存储管理
- 请求段页式存储管理
无论哪种,都需要两方面支持:
硬件支持:页表/段表机制、缺页中断机构、地址变换机构。
软件支持:请求调页/调段的软件、页面置换算法等。
边界
哪些管理方式能提供虚拟存储
疑问点:能够提供虚拟存储技术的存储管理方法
提供虚拟存储技术的存储管理方法有哪些?
只有非连续分配方式才能实现虚拟存储:请求分页、请求分段、请求段页式。
连续分配方式(单一连续、固定分区、动态分区)一律不能。
理由要落到”只装一部分”这个动作上:虚拟存储的本质是把作业拆开,一部分在内存、一部分在外存,并且随时可以互换。
而连续分配要求作业在内存中占据一整块连续空间。如果只装入其中一部分,那么:
- 装哪一部分?装完之后剩下的部分将来放哪儿?
- 后面调入的部分必须紧挨着前面的,可这块空间早被别人占了
“必须连续”和”只装一部分、随时换进换出”在逻辑上是冲突的。 只有把作业切成互不相干的页(或段),让它们能独立地放在任意位置、独立地换进换出,虚拟存储才有可能。
这条判据的另一种表述:虚拟存储只能基于非连续分配技术——这正是 2012 统考真题的正确选项。
虚拟存储器的容量受什么限制
疑问点:虚拟存储器容量的限制因素
44.【2012 统考真题】下列关于虚拟存储器的叙述中,正确的是( )。 A. 虚拟存储只能基于连续分配技术 B. 虚拟存储只能基于非连续分配技术 C. 虚拟存储容量只受外存容量的限制 D. 虚拟存储容量只受内存容量的限制
虚拟存储容量究竟受什么限制?
答案 B。 C 和 D 都错在那个”只”字上。
虚拟存储器的容量同时受两个因素限制,取其中较小者:
① CPU 的寻址范围(地址结构决定)
这是上限。32 位地址最多只能表示
② 内存与外存容量之和
这是实际可用量。虚拟内存的内容总要真实地存在某个地方——不在内存就在外存。两者加起来才是能装下的总量。
所以准确表述是:
逐项排除:
- C 只受外存限制 ❌ —— 忽略了寻址范围。外存再大,32 位系统也超不过 4GB。
- D 只受内存限制 ❌ —— 这句话把虚拟存储的意义完全否定了。虚拟存储存在的全部理由就是让容量突破内存的限制;若只受内存限制,它就毫无价值了。
- A 只能基于连续分配 ❌ —— 恰好说反,见上一条。
虚拟内存 vs 对换(Swapping)
两者都涉及内存与外存之间搬东西,但粒度和时机完全不同:
| 对换(中级调度) | 虚拟内存 | |
|---|---|---|
| 粒度 | 整个进程 | 单个页面 |
| 谁触发 | 内存紧张时,由中级调度决定 | 缺页中断,被动触发 |
| 进程状态 | 进入挂起态 | 仍是就绪/运行态 |
| 目的 | 提高多道程序度 | 突破内存容量限制 |
关键差别:对换换出的进程整个不在内存了,它跑不了;而虚拟内存下的进程始终”在运行”,只是某些页恰好不在内存,用到时再调进来。
虚拟性是结果,不是手段
考题常问”虚拟存储器最重要的特征是什么”,答案是多次性,不是虚拟性。
因为虚拟性是多次性和对换性带来的效果,属于结论层面。而多次性才是那个从根本上区别于传统方式的做法。
对照速查
| 传统存储管理 | 虚拟存储器 |
|---|---|
| 一次性(必须全部装入) | 多次性(分多次调入)← 最重要 |
| 驻留性(装入后不换出) | 对换性(可换进换出) |
| — | 虚拟性(逻辑上扩充容量)← 结果 |
| 局部性 | 含义 | 来源 |
|---|---|---|
| 时间局部性 | 刚访问过的,不久还会访问 | 循环 |
| 空间局部性 | 访问了某处,附近也快被访问 | 顺序执行、数组 |
| 能否实现虚拟存储 | |
|---|---|
| 单一连续、固定分区、动态分区 | 不能(连续要求与”只装一部分”冲突) |
| 请求分页 / 请求分段 / 请求段页式 | 能 |
| 虚拟存储容量 | 受两者中的较小值限制 |
|---|---|
| ① | CPU 寻址范围(地址位数) |
| ② | 内存容量 + 外存容量 |
考点
- 传统方式的两个特征(一次性、驻留性)正是问题所在
- 局部性原理是虚拟存储可行的理论基础,也是 TLB 与 Cache 的共同基础
- 虚拟存储三特征,最重要的是多次性;虚拟性是结果
- 虚拟存储只能基于非连续分配(高频真题)
- 容量受”寻址范围”与”内外存之和”两者较小值限制,不是”只受”某一个
- 虚拟内存与对换的区别:页粒度 vs 进程粒度
链接
- 🏠 返回总览:操作系统第 3 章:内存管理总览
- ⬅️ 上一节:3.1.5 段页式存储管理
- ➡️ 下一节:3.2.2 请求分页管理方式
- 📖 名词库:第 3 章名词库