Can you summarize the following document?
        
  虚拟机最初由波佩克与戈德堡定义为"有效的、独立的真实机器的副本"。当前包括跟任何真实机器无关的虚拟机。  例子: 用Java编写的程序可以通过对Java运行环境(JRE)软件发命令获得服务,取得期望的结果。透过提供这种服务,JRE起到了虚拟机的作用。程序不必为特定的操作系统或硬件编写。  虚拟机根据它们的运用和与直接机器的相关性分为两大类。「系统虚拟机」提供一个可以运行完整操作系统的完整系统平台。「程序虚拟机」则为运行单个计算机程序设计,这意味它支持单个进程。虚拟机的一个本质特点是运行在虚拟机上的软件被局限在虚拟机提供的资源里,也就是说它不能超出虚拟世界。「操作系统层虚拟化」不提供完整操作系统环境,将母机内核分给多个独立空间的应用程序,不同于系统虚拟机需要运行完整操作系统,也不像程序虚拟机运行特定程序语言。

  例如:VirtualBox、VMware

  例如:Java虚拟机(JVM)

  例如:Docker

  基于这种虚拟机,用户可以运行任何操作系统,比如可以在他们“个人的”虚拟电脑上运行两个不同的操作系统,这也被称为“访客”(guests)。这样的话,新版的实验性操作系统就可以与旧版的较稳定版本一同在单独的虚拟机上运行。这个过程甚至可以重复(recursive);IBM就在运行于旧版的虚拟机上的虚拟机上调试它新版的虚拟机操作系统——VM。  这个概念的一个早期使用者就是IBM大型计算机上的「VM/CMS time-sharing」产品,该产品使用的交互式计算单用户操作系统——CMS(Conversational Monitor System),相对来说比较简单,运行于VM上。通过这种方式,CMS编写起来就比较简单,就好像只有它一个在运行一样,VM操作系统就在幕后提供多任务以及资源管理服务。  当然,不是每个VM用户都必须运行CMS;有些用户选择在一个或者多个虚拟机上运行某种「OS/360」(或者「MVS」),来提供传统上的批处理任务。今天,IBM大型机还在使用VM,许多虚拟机上运行的是Linux操作系统。  「VMware」、「TwoOStwo」、「SVISTA」软件包在现代电脑上都在处理类似截获硬件访问,模拟除了处理器以外的任何主板上的器件的事情。  「plex86」属于另外一种情况,它使用特定的打过补丁的内核,只能运行于「Linux」下,而且只能在其之上运行它。因此,它不是仿真处理器,它利用「bochs」来仿真主板设备。  现代电脑使用的「x86处理器架构」其实并不能满足Popek和Goldberg虚拟化要求。很明显,这种架构缺少所有特权机器指令都会产生异常的模式,而这种模式可以做到单指令的虚拟化。这导致「VMware」或类似的「x86虚拟软件」必须动态地重新编译特权模式代码。这种虚拟技术和运行于如「IBM System/370」、「Motorola MC68020」的原生态可虚拟架构上的「VM」相比,就会多出一些性能上的开销。Intel及AMD已经为自己的处理器/芯片组产品加入硬件虚拟化功能,Intel有Intel VT-x(CPU虚拟化)及Intel VT-d(IO虚拟化),AMD有AMD SVM(CPU虚拟化)及IOMMU(IO虚拟化)。

  

  下列的软件产品可以用来虚拟硬件,故可用于各种操作系统之上。

  下面的表格比较了一些虚拟机软件的基本信息。请注意,这里说的是系统虚拟机。Java虚拟机之类的程序虚拟机不算在内。
虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间建立一种环境,而终端用户则是基于虚拟机这个软件所建立的环境来操作其它软件。虚拟机(VM)是计算机系统的仿真器,通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,能提供物理计算机的功能。