解释型虚拟机

  1. 模拟一个计算机系统,最简单的办法,就是兼容这个计算机系统的指令集
  2. 开发一个应用程序,运行在操作系统上,该应用程序可以识别想要模拟的计算机系统的程序格式指令,然后一条条去解释执行
  3. 原先的操作系统称为宿主机(Host),有能力模拟指令执行的软件称为模拟器(Emulator)
    • 实际运行在模拟器上被虚拟出来的系统,称为客户机(Guest VM)
  4. 这种方式和运行Java程序的JVM比较类似,只不过JVM运行的是Java中间代码(字节码),而不是一个特定的计算机系统的指令
  5. 真实的应用案例:Android模拟器游戏模拟器
  6. 优势
    • 模拟的系统可以跨硬件
    • Android用的是ARM CPU,开发机用的是Intel X86 CPU,两边的CPU指令集不一样的,但一样可以正常运行
  7. 劣势
    • 无法做到精确模拟
      • 很多老旧的硬件的程序运行,需要依赖特定的电路乃至电路特有的时钟频率,很难通过软件做到100%模拟
    • 性能很差
      • 并不是直接把指令交给CPU去执行,而是要经过各种解释翻译的工作
      • 编译优化:Java的JIT
        • 把本来解释执行的指令,编译成Host可以直接运行的指令

全虚拟化

  1. 全虚拟化:在现有的物理服务器的硬件和操作系统上,运行一个完整的,不需要做任何修改的客户机操作系统(Guest OS)
  2. 虚拟机监视器(Virtual Machine Manager,Hypervisor)是一个中间层
    • 运行的虚拟机直接和虚拟机监视器打交道,把整个硬件特性(CPU指令集、IO操作、中断等)都映射到虚拟机环境中
  3. 根据实际的指令如何落到硬件去实际执行的方式,可以划分为Type-1型虚拟机和Type-2型虚拟机

Type-2 – 个人电脑

  1. 在Type-2型虚拟机里,虚拟机监视器好像一个运行在操作系统上的软件
    • 客户机的操作系统,把最终到硬件的所有指令,都发送给虚拟机监视器
    • 而虚拟机监视器,又会把这些指令交给宿主机的操作系统去执行
  2. Type-2型虚拟机,常用于个人电脑

Type-1 – 数据中心

  1. 数据中心里面用的虚拟机,通常叫作Type-1型虚拟机
    • 客户机的指令交给虚拟机监视器后,不再需要通过宿主机操作系统才能调用硬件,而是可以直接由虚拟机监视器去调用硬件
  2. 在数据中心里,并不需要在Intel x86上运行一个ARM程序,而是直接在x86上虚拟一个x86硬件的计算机和操作系统
    • 因此并不需要做什么翻译工作,直接往下传递执行即可,指令的执行效率也会很高
  3. 在Type-1型虚拟机里,虚拟机监视器并不是在一个操作系统之上的应用层程序,而是嵌入到操作系统内核里面的一部分
    • 无论是KVMXENHyper-V(Windows 10),都是系统级程序
  4. Type-1型虚拟机的虚拟机监视器需要直接和硬件打交道,因为它需要包含能够直接操作硬件的驱动程序
    • 因此Type-1型的虚拟机监视器更大一些,同时兼容性也不如Type-2型
    • 但由于Type-1型一般部署在数据中心,硬件完全是统一可控

Docker

  1. Type-1型虚拟机相对于Type-2型虚拟机已经没有什么硬件损耗了,但依然存在资源浪费
    • 在实际的物理机上,可能同时运行多个虚拟机,而每个虚拟机都运行了一个单独的操作系统
    • 多运行一个操作系统,意味这要多消耗硬件资源(CPU、内存、磁盘空间等)
    • 实际需要的未必是一个完整的、独立的、全虚拟化的虚拟机,例如我们可能只需要独立的计算资源
  2. 在服务器端开发中,应用程序一般都是运行在Linux内核
    • 通过Docker,不再需要在操作系统上再跑一个操作系统
      • 而是通过容器编排工具(如Kubernetes),能够进行各个应用之间的环境和资源隔离即可
    • Docker没有再单独运行一个客户机操作系统,而是直接运行在宿主机操作系统的内核之上
  3. Docker严格来说不能算是一种虚拟化技术,只能算是一种资源隔离的技术

参考资料

深入浅出计算机组成原理