虚拟机是什么?关于虚拟机的详细介绍

创闻科学2020-11-16 15:28:06

虚拟机,在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于虚拟机这个软件所创建的环境来操作其它软件。虚拟机(VM)是计算机系统的仿真器,通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,能提供物理计算机的功能。它们的实现可能涉及专门的硬件、软件或它们的组合。

虚拟机有不同的种类,每种具有不同的功能:

  • 系统虚拟机(也称为完全虚拟化虚拟机)是真实机器的替代品。它们提供执行整个操作系统所需的功能。虚拟机管理程序使用本机执行来共享和管理硬件,允许多个彼此隔离的环境存在于同一台物理机器上。现代虚拟机管理程序使用硬件辅助虚拟化,虚拟化专用硬件,主要来自主机处理器。
  • 程序虚拟机被设计成在独立于平台的环境中执行计算机程序。

一些虚拟机(如QEMU)也设计成模拟不同的体系结构,并允许执行为另一个CPU或体系结构编写的软件应用程序和操作系统。操作系统级虚拟化允许通过内核对计算机资源进行分区。这些术语并不是通用的。

定义

“虚拟机”最初被Popek和Goldberg定义为“真实计算机的高效、独立的副本” 当前的使用包括与任何真实硬件没有直接对应的虚拟机。

运行虚拟机的物理“真实世界”硬件通常称为“宿主机”,在该机器上仿真的虚拟机通常称为“客户机”。一台主机可以模拟多个客户机,每个客户机都可以模拟不同的操作系统和硬件平台。

系统虚拟机

运行多个操作系统是虚拟机的最初目标,以便在多个单任务操作系统之间分时操作。在某些方面,系统虚拟机可以被认为是历史上先于它的虚拟内存概念的概括。第一个允许完全虚拟化的系统——国际商用机器公司的商用机器系统,通过为每个用户提供一个单用户操作系统——会话监控系统,实现了分时操作。与虚拟内存不同,系统虚拟机授权用户在其代码中写入特权指令。这种方法具有某些优势,例如添加标准系统不允许的输入/输出设备。

随着技术为了虚拟化的目的而产生虚拟存储器,新的存储器过量分配系统可以被应用于管理在一个计算机操作系统上的多个虚拟机之间的存储器共享。在运行于同一物理机器上的多个虚拟机之间共享具有相同内容的内存页是可能的,这可能导致通过称为内核同页合并(KSM)的技术将它们映射到同一物理页面。这对于只读页面尤其有用,例如那些保存代码段的页面,对于运行相同或相似软件的多个虚拟机、软件库、网络服务器、中间件组件等都是如此。客户操作系统不需要与主机硬件兼容,因此可以在同一台计算机上运行不同的操作系统(例如,Windows、Linux或操作系统的早期版本)来支持未来的软件。

在嵌入式系统中,使用虚拟机来支持独立的客户操作系统非常流行。一个典型的用途是与首选的复杂操作系统(如Linux或Windows)同时运行实时操作系统。另一个用途是用于仍处于开发阶段的新型且未经验证的软件,因此它运行在沙箱中。虚拟机在操作系统开发方面还有其他优势,包括改进调试访问和更快的重启。

运行自己的客户操作系统的多个虚拟机经常参与服务器整合。

处理虚拟机

程序虚拟机,有时也称为应用虚拟机或托管运行环境(MRE),在主机操作系统中作为普通应用运行,支持单个进程。该进程启动时创建,退出时销毁。它的目的是提供一个独立于平台的编程环境,抽象出底层硬件或操作系统的细节,并允许程序在任何平台上以相同的方式执行。

程序虚拟机提供高级抽象——高级编程语言的抽象(与系统虚拟机的低级ISA抽象相比)。程序虚拟机使用解释器实现;通过准时制编译,可以获得与编译型编程语言相当的性能。

这种类型的虚拟机已经在使用Java虚拟机实现的Java编程语言中流行起来。其他例子包括Parrot虚拟机和.NET框架,它运行在一个名为公共语言运行库的虚拟机上。所有这些都可以作为任何计算机语言的抽象层。

程序虚拟机的一个特殊情况是对(潜在异构的)计算机集群的通信机制进行抽象的系统。这种虚拟机不包括单个进程,而是集群中每个物理机一个进程。它们旨在通过让程序员专注于算法而不是互连和操作系统提供的通信机制来简化并发应用程序的编程任务。它们并没有隐藏通信发生的事实,因此也没有试图将集群呈现为单个机器。

与其他进程虚拟机不同,这些系统不提供特定的编程语言,而是嵌入在现有的语言中;一般来讲,这样的系统为几种语言(例如,C语言和Fortran语言)提供绑定。例子有并行虚拟机(PVM)和消息传递接口(MPI)。它们不是严格意义上的虚拟机,因为运行在顶层的应用程序仍然可以访问所有操作系统服务,因此不局限于系统模型。

历史

系统虚拟机和程序虚拟机都可以追溯到20世纪60年代,并且仍然是积极发展的领域。

系统虚拟机起源于分时系统,特别是在兼容分时系统中实现的。分时系统允许多个用户同时使用一台计算机:每个程序看起来都可以完全访问机器,但是一次只执行一个程序,系统在时间片上的程序之间切换,每次都保存和恢复状态。这演变成虚拟机,特别是由IBM的研究系统:使用部分虚拟化的M44/44X系统;和使用完全虚拟化的CP-40和SIMMON系统,是虚拟机管理程序的早期例子。第一个广泛使用的虚拟机体系结构是CP-67/CMS。一个重要的区别是在一个主机系统上使用多个虚拟机进行分时(如M44/44X和CP-40),以及在一个主机系统上使用一个虚拟机进行原型制作(如SIMMON)。为了兼容性而对早期系统进行硬件仿真的仿真器可以追溯到1963年的IBM System/360,而软件仿真(当时称为“仿真”)在此之前就已出现。

程序虚拟机最初是作为中间语言的抽象平台出现的,中间语言被编译器用作程序的中间表示;早期的例子可以追溯到1966年左右。1966年初的一个例子是O-code machine,一个执行由BCPL编译器前端发出的O-code(目标代码)的虚拟机。这种抽象允许编译器通过实现一个新的后端来轻松移植到一个新的体系结构中,该后端采用现有的目标代码并将其编译成底层物理机器的机器代码。欧拉语言使用了类似的设计,中间语言命名为P(可移植)。 帕斯卡在1970年左右推广了这一技术,特别是在Pascal-P系统(1973年)和Pascal-S编译器(1975年)中,在这两个系统中,Pascal-P被称为P-code,由此产生的机器称为P-code机器。这很有影响,从这个意义上来说,虚拟机通常被称为p-code机。Pascal p-code除了是一种中间语言外,还由实现虚拟机的解释器直接执行,特别是在UCSD Pascal(1978)中;这影响了后来的解释器,尤其是Java虚拟机。另一个早期的例子是SNOBOL 4(1967),它是用SNBOL实现语言(SIL)编写的,SIL是一种虚拟机的汇编语言,然后通过宏汇编程序将其传送给它们的本地汇编程序,从而将目标指向物理机。 然而,宏从此不再受欢迎,所以这种方法的影响力就变小了。进程虚拟机是实现早期微型计算机软件(包括Tiny BASIC和冒险游戏)的一种流行方法,从Pyramid 2000这样的一次性实现到Infocom z-machine这样的通用引擎,格雷厄姆·纳尔逊(Graham Nelson)认为这是“有史以来最便携的虚拟机”。

Smaltalk-80的实现取得了重大进展,特别是Deutsch/Schiffmann实现它将准实时编译作为一种使用程序虚拟机的实现方法向前推进。后来引人注目的Smalltalk虚拟机有VisualWorks、Squeak虚拟机,和 Strongtalk。一个产生了大量虚拟机创新的相关语言是自我编程语言,它开创了自适应优化和分代垃圾收集。1999年,这些技术在HotSpot Java虚拟机中被证明是商业上的成功。其他创新包括基于寄存器的虚拟机,相比于更适合编程语言的基于堆栈的虚拟机能够更好地匹配底层硬件;1995年,基于寄存器的虚拟机由Dis虚拟机为Limbo语言开创。OpenJ9是OpenJDK中HotSpot JVM的替代方案,是一个开源eclipse项目,与HotSpot相比,它具有更好的启动性能和更少的资源消耗。

完全虚拟化

完全虚拟化的逻辑图

在完全虚拟化中,虚拟机模拟足够的硬件,以允许未修改的“来宾”操作系统(为同一指令集设计的操作系统)独立运行。这种方法是在1966年由虚拟机家族的前身IBM CP-40和CP-67首创的。

大型机领域之外的例子有Parallels Workstation、Parallels台式机for Mac、VirtualBox、Virtual Iron、Oracle虚拟机、虚拟电脑、虚拟服务器、Hyper-V、VMware工作站、VMware服务器(已停产,以前称为GSX服务器)、VMware ESXi、QEMU、Adeos、嵌入式操作系统、Win4BSD、Win4Lin Pro和Egenera vBlade技术。

硬件辅助虚拟化

在硬件辅助虚拟化中,硬件提供架构支持便于构建虚拟机监视器,并允许客户机操作系统独立运行。 硬件辅助虚拟化于1972年首次引入IBM System/370,与VM/370一起使用,VM/370是IBM作为官方产品提供的第一个虚拟机操作系统。

在2005年和2006年,英特尔和AMD提供了额外的硬件来支持虚拟化。太阳微系统公司(现为甲骨文公司)在2005年的UltraSPARC T系列处理器中增加了类似的功能。适用于此类硬件的虚拟化平台的例子有KVM、VMware Workstation、VMware Fusion、Hyper-V、Windows Virtual PC、Xen、适用于Mac的Parallels Desktop、适用于SPARC的甲骨文虚拟机服务器、VirtualBox和ParallelsWorkstation。

2006年,发现第一代32位和64位x86硬件支持很少比软件虚拟化更具性能优势。

操作系统级虚拟化

在操作系统级虚拟化中,物理服务器在操作系统级虚拟化,使得多个隔离且安全的虚拟化服务器能够在单个物理服务器上运行。“客户机”操作系统环境与宿主机系统共享相同的操作系统运行实例。因此,相同的操作系统内核也用于实现“客户机”环境,在给定“客户机”环境中运行的应用程序将其视为独立系统。最早的实现是FreeBSD jail;其他例子包括Docker、Solaris Containers、OpenVZ、Linux-VServer、LXC、AIX Workload Partitions、Parallels Virtuozzo Containers和iCore Virtual Accounts。