虚拟机
1.1.3 讲过操作系统的”虚拟”特征——把一个物理实体变为若干逻辑上的对应物。本章前面见到的虚拟都发生在操作系统内部:虚拟处理器、虚拟存储器。
这一节把”虚拟”这个动作用到了操作系统自己身上:把一台物理机器虚拟成多台,让每一台上面都能跑一个完整的操作系统。
机制
虚拟机的基本概念
虚拟机使用虚拟化技术,将一台物理机器虚拟化为多台虚拟机器(VM),每个虚拟机器都可以独立运行一个操作系统。
实现这件事的软件称为虚拟机管理程序(VMM,也称 Hypervisor),它负责把物理的 CPU、内存、I/O 设备分配并映射给各台虚拟机,同时保证各台虚拟机之间互相隔离。
关键难点在于特权指令:虚拟机里运行的操作系统自认为自己在内核态,会去执行关中断、改页表这类特权指令。但它实际上并不能真的执行——若真让它关了物理机的中断,其余虚拟机就全完了。VMM 必须把这些指令截获下来,用软件模拟出”好像执行成功了”的效果。
两类虚拟机管理程序
划分依据是:VMM 直接运行在硬件上,还是运行在一个宿主操作系统之上。
第一类 VMM——直接运行在硬件上,它自己就承担着物理资源管理的职责,相当于一个专门为虚拟化定制的操作系统。
第二类 VMM——运行在宿主操作系统之上,它对物理资源的访问必须通过宿主操作系统的服务来完成。
两类的全部差异都可以从这一条推出来:
对物理资源的控制权:第一类直接控制;第二类需要通过宿主操作系统获得。
资源分配方式:第一类下虚拟机可以独占物理资源;第二类下必须与宿主操作系统共享。
性能:第一类高(少了一层转发);第二类低(每次都要过宿主操作系统)。
可支持的虚拟机数量:第一类多;第二类少(宿主操作系统自己也要占资源)。
可迁移性:第一类低;第二类高——第二类的虚拟机就是宿主系统上的一组文件,复制走就能在另一台机器上跑。
运行模式(教材的简化模型):第一类 VMM 掌握最高控制权限,客户操作系统受到 VMM 的控制;第二类 VMM 部分运行在用户态、部分运行在内核态(它通常需要装一个内核模块来获得必要的特权)。现代硬件虚拟化不能简单套成“VMM 在 Ring 0、客户 OS 一律降到 Ring 3”;408 区分两类时,优先看是否建立在宿主操作系统之上。
拓展:常见产品与普通 OS 的区别
这部分用来帮助理解,做题仍以“直接建立在硬件上 / 建立在宿主 OS 上”为首要判据。 分类的是 VMM,不是把“虚拟机”本身分成两种。
| 产品 | 通常归类 | 记忆理由 |
|---|---|---|
| VMware ESXi | 第一类 VMM | 直接安装在裸机硬件上 |
| VMware Workstation / Fusion | 第二类 VMM | 运行在 Windows、Linux 或 macOS 等宿主 OS 之上 |
| VirtualBox | 第二类 VMM | 依赖宿主 OS;有内核驱动,不等于纯用户态程序 |
| KVM | 通常归为第一类 VMM | 让 Linux 内核本身承担 Hypervisor 的功能,不能只因“有 Linux”就判为第二类 |
“VMware”是产品家族名称,不能不看具体产品就一概分类。 KVM 常与 QEMU 配合使用,知道“内核中的 KVM 负责核心虚拟化、用户态 QEMU 提供设备模拟等功能”即可,不必展开实现细节。产品分类参考:VMware:Hypervisor 分类、Red Hat:KVM。
第一类 VMM 与普通操作系统都能直接管理硬件,但主要服务对象不同:
- 普通 OS:硬件 → OS → 应用程序,主要为进程/应用提供运行环境。
- 第一类 VMM:硬件 → VMM → 多个客户 OS → 各自的应用,主要为虚拟机提供虚拟硬件并实现隔离。
408 记住边界即可:运行位置决定分类,不是“用户态还是内核态”决定分类。 “第一类掌握最高控制权限”是教材层面的概括;第二类也可以含内核态组件。硬件虚拟化的具体执行模式不在这里展开。
边界
系统虚拟机与进程虚拟机
除了按 VMM 位置分类,还可以按”虚拟出来的是什么”来分:
系统虚拟机虚拟出一台完整的计算机硬件环境,上面可以运行一个完整的客户操作系统。VMware、VirtualBox、KVM 属于这一类。
进程虚拟机只为单个程序提供运行环境,它虚拟的不是硬件,而是一套指令集与运行时。JVM 是最典型的例子——Java 程序运行在 JVM 之上,而 JVM 本身只是宿主操作系统上的一个普通进程。
判据:上面能不能跑一个完整的操作系统。
虚拟机不等于仿真器
两者都能让”本来跑不了的东西跑起来”,但代价和原理不同。
虚拟化的前提是客户机与宿主机的指令集相同——绝大多数指令由物理 CPU 直接执行,只有少数特权指令需要 VMM 截获处理。因此性能损失有限,且通常依赖硬件的虚拟化支持。
仿真(emulation)则是逐条翻译不同体系结构的指令——在 x86 机器上模拟 ARM,每一条 ARM 指令都要用若干条 x86 指令去模拟。它能跨体系结构,但开销大得多。
判据:指令是”直接执行”还是”被翻译”。
虚拟化与操作系统的”虚拟”是同一个思想的两个层次
这一条能把本章前后串起来:
操作系统的虚拟是”把一台机器虚拟给多个进程”——每个进程都以为自己独占了 CPU(虚拟处理器)和一大片内存(虚拟存储器)。
虚拟机的虚拟是”把一台机器虚拟给多个操作系统”——每个操作系统都以为自己独占了整台物理机。
两者的手段也是同构的:操作系统靠特权级拦住用户程序的越权操作;VMM 靠更高一级的特权拦住客户操作系统的越权操作。 本质上是同一招用了两次。
虚拟机的代价
隔离和复用不是免费的:需要虚拟化 CPU、内存和 I/O 资源,其中 I/O 虚拟化是最常见的性能瓶颈——每一次 I/O 都要经过 VMM 的转发。
因此实际系统中常用”设备直通”把某个物理设备整个交给一台虚拟机,绕开转发。这实际上是放弃了这台设备的复用,换取性能——又一次是”共享与效率”的权衡。
对照速查
| 第一类 VMM | 第二类 VMM | |
|---|---|---|
| 位置 | 直接运行在硬件上 | 运行在宿主操作系统之上 |
| 对物理资源的控制权 | 直接控制 | 通过宿主操作系统获得 |
| 资源分配 | 虚拟机可独占物理资源 | 与宿主操作系统共享 |
| 性能 | 高 | 低 |
| 可支持的虚拟机数量 | 多 | 少 |
| 可迁移性 | 低 | 高 |
| 运行模式(教材概括) | 掌握最高控制权限,控制客户 OS | 部分用户态、部分内核态 |
| 系统虚拟机 | 进程虚拟机 | |
|---|---|---|
| 虚拟出什么 | 完整的硬件环境 | 单个程序的运行环境 |
| 能否跑完整 OS | 能 | 不能 |
| 例子 | VMware、VirtualBox、KVM | JVM |
| 虚拟化 | 仿真 | |
|---|---|---|
| 指令 | 绝大多数由物理 CPU 直接执行 | 逐条翻译 |
| 能否跨体系结构 | 不能 | 能 |
| 开销 | 小 | 大 |
考点
- 第一类 VMM 直接运行在硬件上,第二类运行在宿主操作系统之上——所有差异由此推出
- 六项对比中最易错的是可迁移性:第一类低、第二类高(与性能恰好相反)
- 系统虚拟机 vs 进程虚拟机:判据是能否运行完整的客户操作系统;JVM 是进程虚拟机
- 虚拟化 ≠ 仿真:判据是指令直接执行还是被翻译
- VMM 必须截获客户操作系统的特权指令,这是虚拟化的核心难点
- I/O 虚拟化是常见的性能瓶颈,设备直通以放弃复用换性能
链接
- 🏠 返回总览:操作系统第 1 章:计算机系统概述总览
- ⬅️ 上一节:1.5 操作系统引导
- 🔗 “虚拟”这一特征的原始定义,见 1.1.3 操作系统的特征
- 🔗 特权级机制,见 1.3.1 处理器运行模式
- 📖 名词库:第 1 章名词库