虚拟机

2025年03月17日 | 阅读 9 分钟

虚拟机可以被定义为计算中的计算机系统的仿真。虚拟机基于计算机体系结构。它还提供了物理计算机的功能。虚拟机的实现可以考虑专用软件、硬件或两者的组合。

虚拟机历史

  • 系统虚拟机特别是在 CTSS(兼容分时系统)中实现的。分时允许多个用户同时使用计算机。所有程序都显示拥有对机器的完全访问权限,但一次只能运行一个程序。IBM 的研究系统在这方面做出了显著贡献,并将其发展为虚拟机。44X/M44 使用部分虚拟化,SIMMON 和 CP-40 使用完全虚拟化。这些是虚拟机监控程序的一些例子。
  • 第一个虚拟机架构是CMS/CP-67。在同一台主机上使用多个虚拟机进行分时,如 CP-40 和 44X/M44 中,是一个重要的区别。
  • 模拟器可以追溯到 1963 年的 360/IBM 系统,通过硬件模拟以前的系统以实现兼容性。
  • 最初,进程虚拟机被开发为任何中间语言的抽象环境,这些中间语言被编译器用作程序的中间表示。O-code 机器是 1966 年初的一个例子。O-code 机器是一个 VM,它运行由 BCPL 编译器前端扩展的对象代码(O-code)。这种抽象允许编译器轻松地移植到任何新架构。
  • Euler 语言使用了相同的模型,其中包含一个名为 portable (P) 的中间语言。它在 1970 年被 Pascal 推广,特别是在 Pascal-P 系统和 Pascal-S 编译器中。它们被称为p-code,而 p-code 机器则是由此产生的机器。
  • 它一直在产生影响,并且这种意义上的虚拟机通常被称为 p-code 机器。此外,Pascal p-code 由一个解释器直接运行,该解释器用于实现 VM。
  • 另一个例子是 SNOBOL (1967)。它在 SIL(SNOBOL 实现语言)中指定,SIL 是 VM 的汇编语言。它通过宏汇编器将其转换为本地汇编器,旨在用于物理机器。
  • 进程 VM 是实现微机软件(包括冒险游戏和 Tiny BASIC 游戏)的一种流行方法。它可以由 Pyramid 2000 等实现,用于 Infocom 的 z-machine 等通用引擎。
  • Smalltalk-80 实现(特别是 Schiffmann/Deutsch 实现)展示了重要的进步。它们通过即时编译(JIT)作为实现方法,该方法应用进程 VM。值得注意的是,后来的 Smalltalk 虚拟机包括 Strongtalk、Squeak Virtual Machine 和 VisualWorks。
  • 一种互补的语言产生了许多 VM 创新,它开创了垃圾回收和自适应优化。在商业上,这些方法在 1999 年的 HotSpot Java 虚拟机中得到了成功应用。
  • 其他创新包括基于寄存器的 VM,以匹配各种底层硬件,而不是更接近任何编程语言的基于堆栈的 VM。它由 Dis VM 在 1995 年为 Limbo 语言开创。OpenJ9 是 OpenJDK 中 HotSpot Java 虚拟机的替代品。此外,它是一个开源项目,与 HotSpot 相比,启动速度更快,资源消耗更少。

虚拟机类型

有不同类型的虚拟机,它们都具有不同的功能。

Virtual Machine
  • 系统虚拟机:这类虚拟机也称为完全虚拟化 VM。它取代了实际机器。这些 VM 提供执行整个操作系统 (OS) 所需的功能。虚拟机监控程序使用本机执行来管理和共享硬件。它允许多个彼此隔离的环境存在于同一台物理机器上。新的虚拟机监控程序主要利用来自各种主机 CPU 的特定于虚拟化的硬件和硬件辅助虚拟化。
  • 进程虚拟机:这些虚拟机是为了在平台无关的环境中执行多个计算机程序而创建的。

一些 VM 被开发用于模拟不同的体系结构,如 QEMU。它允许运行为其他体系结构或 CPU 编写的操作系统和软件应用程序。操作系统级虚拟化允许计算机资源由内核进行分类。

什么是系统虚拟机?

最初,Goldberg 和 Popek 将虚拟机描述为“实际计算机机器的一个隔离且高效的副本”。最新的用法结合了与实际硬件没有直接关系的虚拟机。通常,运行虚拟机的真实世界或物理硬件被称为“宿主”,而在机器上复制的 VM 通常被称为“客户机”。

系统虚拟机的工作原理

宿主可以模拟多个客户机,所有客户机都可以模拟不同的硬件平台和操作系统。

运行多个操作系统的愿望是虚拟机最初的目标。它允许在多个独立的任务操作系统之间进行分时。系统 VM 可以被认为是其历史早于它的虚拟内存概念的泛化。

IBM 的 CMS/CP,最早支持完全虚拟化的系统,通过为所有用户提供单个用户 OS(操作系统)来实现共享。系统 VM 允许用户在代码中编写特权指令。这种方法有一些优点,比如包括标准系统不允许的输入/输出设备。

新的内存超额分配系统可用于管理单个计算机 OS 上多个 VM 之间的内存共享。这是因为技术正在扩展 VM 以用于各种虚拟化目的。有可能将包含相同内容的内存页分发给运行在同一台物理机器上的多个 VM。因此,通过一种称为 KSM(内核相同页面合并)的方法将它们映射到相同的物理页面。

这对于只读页面尤其有用,例如包含代码段的页面。这是多个 VM 运行相同或相同的中间件组件、Web 服务器、软件库、软件等的情况。客户机操作系统不需要与任何宿主硬件兼容,因此可以在同一台计算机上运行不同的操作系统(例如先前版本的操作系统、Linux 或 Windows)以支持未来的软件。

系统虚拟机的用途

虚拟机可用于支持隔离的客户机 OS。它在嵌入式系统中很受欢迎。一个常见的用法可能是同时运行实时操作系统和首选的复杂操作系统,如 Windows 或 Linux。

其他用途可能包括未经测试的、新颖的软件,这些软件仍处于开发阶段,因此在沙箱中运行。VM 在 OS 开发方面也有其他优势。它可能包含更快的重启和更方便的调试访问。
为了实现服务器整合,通常会运行多个虚拟机及其客户机 OS。

什么是进程虚拟机?

进程虚拟机有时被称为MRE(管理运行时环境)或应用程序虚拟机。它作为宿主操作系统上的一个通用应用程序运行,并支持单个进程。这些进程在启动时创建,在退出时销毁。

进程 VM 的目的是提供一个平台无关的编程环境。它抽象了底层操作系统或硬件的所有信息。它允许程序以相同的方式在任何平台上运行。

进程虚拟机提供了高级编程语言的高级抽象。进程虚拟机可以使用解释器来实现。通过使用即时编译,可以获得与其(已编译的)编程语言相称的性能。

进程虚拟机随着Java 编程语言而流行。它可以与 Java 虚拟机一起实现。另一个例子包括 .NET FrameworkParrot 虚拟机,它们运行在称为通用语言运行时的虚拟机上。它们都可以作为计算机语言的抽象层。

进程虚拟机有一个特殊情况,适用于那些依赖于(可能是异构的)计算机集群通信机制的系统。这类虚拟机不包含任何单个进程,而是包含集群内的单个进程/物理机。

这些集群旨在通过允许程序员专注于算法而不是操作系统和互连提供的通信机制来减轻并行计算任务的难度。

它们不会隐藏通信发生的事实,并试图将集群展示为单个机器。

与往常的进程虚拟机不同,这个系统不提供特定的编程语言,尽管它们嵌入在任何现有语言中。任何此类系统通常都支持多种语言(如 FORTRAN 和 C)的绑定。

例如MPI(消息传递接口)和PVM(并行虚拟机)。它们严格来说不是虚拟机,因为运行在顶层的各种应用程序仍然可以访问所有 OS 服务。因此,它们不限于系统模型。

完全虚拟化

在完全虚拟化中,虚拟机模拟硬件,允许客户机操作系统独立运行。它是在 1966 年使用 IBM CP-67 和 CP-40 开发的,它们是 VM 系列的前身。

除了大型机领域,还有一些例子,如 Egenera vBlade 技术、Win4Lin Pro、Win4BSD、Mac-on Linux、Adeos、QEMU、VMware ESXi、VMware Server(也称为 GSX Server)、VMware Workstation、Hyper-V、Virtual Server、Virtual PC、Oracle VM、Virtual Iron、VirtualBox、Parallels Desktop for Mac 和 Parallels Workstation。

硬件辅助虚拟化

在硬件辅助虚拟化中,硬件提供架构支持。这种架构支持有助于创建虚拟机监视器,并允许多个客户机操作系统独立运行。

这种虚拟化类型最早在 1972 年的IBM System/370上定义。它被引入与 VM/370 一起使用。IBM 提供的第一款虚拟机 OS 是官方产品。

AMD 和 Intel 分别在 2006 年和 2005 年提供了额外的硬件来支持虚拟化。2005 年,Sun Microsystems(Oracle Corporation)在 UltraSPARC T 系列处理器中加入了类似的功能。适用于某些硬件的虚拟化平台示例包括 Parallels Workstation、VirtualBox、Oracle VM Server for SPARC、Parallels Desktop for Mac、Xen、Windows Virtual PC、Hyper-V、VMware Fusion、VMware Workstations 和 KVM。

2006 年检测到第一代 64 位和 32 位 x86 硬件支持,可在软件虚拟化方面带来性能优势。

操作系统级虚拟化

在操作系统级虚拟化中,物理服务器可以在操作系统级别进行虚拟化。它允许多个安全且隔离的虚拟化服务器运行在单个物理服务器上。

客户机操作系统的环境与宿主系统的运行实例共享相同的操作系统。因此,使用相同的操作系统内核来实现客户机环境。此外,在提供的客户机环境中运行的各种应用程序将其视为独立的系统。

最初的实现是 FreeBSD 监狱。其他例子包括 iCore 虚拟账户、Parallels Virtuozzo Containers、AIX Workload Partitions、LXC、Linux-Vserver、OpenVZ、Solaris Containers 和 Docker。

只有通过软件和硬件元素的正确组合才可能实现完全虚拟化。例如,IBM 的大多数 System/360 系列和 IBM 的早期 System/360 系统都无法实现完全虚拟化。

1972 年,IBM 为 System/370 系列添加了虚拟内存硬件,这与 Intel VT-x Rings 不同。它为虚拟机监控程序提供了更高级别的权限,以便正确处理虚拟机。

完全虚拟化的挑战

完全虚拟化的主要挑战是模拟和拦截各种特权操作,如 I/O 指令。在提供的 VM 中实现的所有操作的结果应保留在该 VM 内。
不允许虚拟操作更改任何其他 VM 状态、硬件和控制程序。

某些机器指令可以直接通过硬件运行,因为所有影响都完全包含在控制程序处理的组件中,如算术寄存器和内存位置。

但是,其他(可能穿透 VM 的)指令不允许直接运行。它们应该被模拟和捕获。这些类型的指令会影响或访问 VM 外部的状态数据。
完全虚拟化在以下几个方面取得了巨大成功:

  • 将用户彼此(或与控制程序)分离
  • 将单个计算机系统分配给多个用户
  • 模拟新硬件以实现更高的生产力、安全性和可靠性。

VM 的优点

  • 虚拟机为在其上运行的软件提供了软件兼容性。因此,为虚拟化宿主指定的每个软件也可以在 VM 上运行。
  • 它在不同的处理器和操作系统之间提供了隔离。因此,在一个虚拟机上运行的处理器 OS 无法更改任何其他宿主系统和虚拟机的宿主。
  • 虚拟机提供封装。VM 上的各种软件都可以被控制和修改。
  • 虚拟机提供了许多功能,例如添加新操作系统。单个操作系统中的错误不会影响主机上可用的任何其他操作系统。它允许在 VM 之间传输许多文件,并且对于多 OS 主机无需双重启动。
  • VM 可以更好地管理软件,因为 VM 可以运行完整的软件堆栈,包括运行旧版操作系统、宿主机器等。
  • 可以将硬件资源独立分配给软件堆栈。VM 可以被传输到不同的计算机以进行负载均衡。

下一主题什么是快照