虚拟内存的基本概念

3.1 讲的所有方案都有一个共同前提:作业必须全部装入内存才能运行。

这个前提带来两个绕不过去的限制:大作业根本装不下;内存里同时能放的作业数有限,多道程序度上不去。

虚拟内存的思路是取消这个前提——只装一部分,用到别的再说。

机制

传统存储管理的两个特征,恰恰是问题所在

一次性:作业必须一次性全部装入内存才能运行。

驻留性:作业装入后就一直驻留内存,直到运行结束,期间不会被换出(哪怕它有大段代码这辈子都不会执行)。

这两条造成的浪费是巨大的:一个程序里往往有大量很少甚至从不执行的代码——错误处理分支、罕用功能、只在特定条件下走的路径。它们和核心逻辑一起挤占着内存。

局部性原理:为什么”只装一部分”是可行的

虚拟内存能成立,靠的是程序访问行为的一条统计规律:

时间局部性:某条指令或某个数据一旦被访问,不久之后很可能再次被访问。原因是程序中大量存在循环。

空间局部性:一旦某个存储单元被访问,其附近的单元也很可能马上被访问。原因是指令通常顺序执行,数据常以数组等连续结构存放。

由此得出一个关键推论:程序在任一小段时间内,实际访问的地址范围是很窄的。既然如此,内存里只需保留这一小块”当前活跃”的部分,其余留在外存,需要时再调进来即可。

局部性原理同时也是快表 TLB和 Cache 能够有效的共同基础——它们都在赌”刚用过的东西马上还会用”。

虚拟存储器的三个特征

多次性:作业分成多次调入内存,不必一次装完。这是虚拟存储最重要的特征,直接否定了传统方式的”一次性”。

对换性:作业运行过程中,页面可以换进换出,不必全程驻留。对应地否定了”驻留性”。

虚拟性:从逻辑上扩充了内存容量,使用户看到的内存远大于实际内存。

三者的关系是有层次的:多次性和对换性是手段,虚拟性是结果。 而多次性和对换性又都以离散分配为前提——若要求连续,就没法只装一部分。

虚拟内存的实现方式

三种,都是在 3.1 对应方案上加”请求调入”和”置换”功能:

  • 请求分页存储管理(最常用)
  • 请求分段存储管理
  • 请求段页式存储管理

无论哪种,都需要两方面支持:

硬件支持:页表/段表机制、缺页中断机构、地址变换机构。

软件支持:请求调页/调段的软件、页面置换算法等。

边界

哪些管理方式能提供虚拟存储

疑问点:能够提供虚拟存储技术的存储管理方法

提供虚拟存储技术的存储管理方法有哪些?

只有非连续分配方式才能实现虚拟存储:请求分页、请求分段、请求段页式。

连续分配方式(单一连续、固定分区、动态分区)一律不能。

理由要落到”只装一部分”这个动作上:虚拟存储的本质是把作业拆开,一部分在内存、一部分在外存,并且随时可以互换。

而连续分配要求作业在内存中占据一整块连续空间。如果只装入其中一部分,那么:

  • 装哪一部分?装完之后剩下的部分将来放哪儿?
  • 后面调入的部分必须紧挨着前面的,可这块空间早被别人占了

“必须连续”和”只装一部分、随时换进换出”在逻辑上是冲突的。 只有把作业切成互不相干的页(或段),让它们能独立地放在任意位置、独立地换进换出,虚拟存储才有可能。

这条判据的另一种表述:虚拟存储只能基于非连续分配技术——这正是 2012 统考真题的正确选项。

虚拟存储器的容量受什么限制

疑问点:虚拟存储器容量的限制因素

44.【2012 统考真题】下列关于虚拟存储器的叙述中,正确的是( )。 A. 虚拟存储只能基于连续分配技术 B. 虚拟存储只能基于非连续分配技术 C. 虚拟存储容量只受外存容量的限制 D. 虚拟存储容量只受内存容量的限制

虚拟存储容量究竟受什么限制?

答案 B。 C 和 D 都错在那个”只”字上。

虚拟存储器的容量同时受两个因素限制,取其中较小者:

① CPU 的寻址范围(地址结构决定)

这是上限。32 位地址最多只能表示 = 4GB 的地址空间——即使你有 1TB 的硬盘,程序也用不了超过 4GB 的虚拟地址,因为地址根本编不出来。

② 内存与外存容量之和

这是实际可用量。虚拟内存的内容总要真实地存在某个地方——不在内存就在外存。两者加起来才是能装下的总量。

所以准确表述是:

虚拟存储容量地址位数内存容量外存容量

逐项排除:

  • C 只受外存限制 ❌ —— 忽略了寻址范围。外存再大,32 位系统也超不过 4GB。
  • D 只受内存限制 ❌ —— 这句话把虚拟存储的意义完全否定了。虚拟存储存在的全部理由就是让容量突破内存的限制;若只受内存限制,它就毫无价值了。
  • A 只能基于连续分配 ❌ —— 恰好说反,见上一条。

虚拟内存 vs 对换(Swapping)

两者都涉及内存与外存之间搬东西,但粒度和时机完全不同:

对换(中级调度)虚拟内存
粒度整个进程单个页面
谁触发内存紧张时,由中级调度决定缺页中断,被动触发
进程状态进入挂起态仍是就绪/运行态
目的提高多道程序度突破内存容量限制

关键差别:对换换出的进程整个不在内存了,它跑不了;而虚拟内存下的进程始终”在运行”,只是某些页恰好不在内存,用到时再调进来。

虚拟性是结果,不是手段

考题常问”虚拟存储器最重要的特征是什么”,答案是多次性,不是虚拟性。

因为虚拟性是多次性和对换性带来的效果,属于结论层面。而多次性才是那个从根本上区别于传统方式的做法。

对照速查

传统存储管理虚拟存储器
一次性(必须全部装入)多次性(分多次调入)← 最重要
驻留性(装入后不换出)对换性(可换进换出)
—虚拟性(逻辑上扩充容量)← 结果
局部性含义来源
时间局部性刚访问过的,不久还会访问循环
空间局部性访问了某处,附近也快被访问顺序执行、数组
能否实现虚拟存储
单一连续、固定分区、动态分区不能(连续要求与”只装一部分”冲突)
请求分页 / 请求分段 / 请求段页式能
虚拟存储容量受两者中的较小值限制
①CPU 寻址范围(地址位数)
②内存容量 + 外存容量

考点

  • 传统方式的两个特征(一次性、驻留性)正是问题所在
  • 局部性原理是虚拟存储可行的理论基础,也是 TLB 与 Cache 的共同基础
  • 虚拟存储三特征,最重要的是多次性;虚拟性是结果
  • 虚拟存储只能基于非连续分配(高频真题)
  • 容量受”寻址范围”与”内外存之和”两者较小值限制,不是”只受”某一个
  • 虚拟内存与对换的区别:页粒度 vs 进程粒度

链接