计算机组成 -- 虚拟机
解释型虚拟机
- 要模拟一个计算机系统,最简单的办法,就是兼容这个计算机系统的指令集
- 开发一个应用程序,运行在操作系统上,该应用程序可以识别想要模拟的计算机系统的程序格式和指令,然后一条条去解释执行
- 原先的操作系统称为宿主机(Host),有能力模拟指令执行的软件称为模拟器(Emulator)
- 实际运行在模拟器上被虚拟出来的系统,称为客户机(Guest VM)
- 这种方式和运行Java程序的JVM比较类似,只不过JVM运行的是Java中间代码(字节码),而不是一个特定的计算机系统的指令
- 真实的应用案例:Android模拟器、游戏模拟器
- 优势
- 模拟的系统可以跨硬件
- Android用的是ARM CPU,开发机用的是Intel X86 CPU,两边的CPU指令集是不一样的,但一样可以正常运行
- 劣势
- 无法做到精确模拟
- 很多老旧的硬件的程序运行,需要依赖特定的电路乃至电路特有的时钟频率,很难通过软件做到100%模拟
- 性能很差
- 并不是直接把指令交给CPU去执行,而是要经过各种解释和翻译的工作
- 编译优化:Java的JIT
- 把本来解释执行的指令,编译成Host可以直接运行的指令
- 无法做到精确模拟
全虚拟化
- 全虚拟化:在现有的物理服务器的硬件和操作系统上,运行一个完整的,不需要做任何修改的客户机操作系统(Guest OS)
- 虚拟机监视器(Virtual Machine Manager,Hypervisor)是一个中间层
- 运行的虚拟机直接和虚拟机监视器打交道,把整个硬件特性(CPU指令集、IO操作、中断等)都映射到虚拟机环境中
- 根据实际的指令如何落到硬件去实际执行的方式,可以划分为Type-1型虚拟机和Type-2型虚拟机
Type-2 – 个人电脑
- 在Type-2型虚拟机里,虚拟机监视器好像一个运行在操作系统上的软件
- 客户机的操作系统,把最终到硬件的所有指令,都发送给虚拟机监视器
- 而虚拟机监视器,又会把这些指令交给宿主机的操作系统去执行
- Type-2型虚拟机,常用于个人电脑
Type-1 – 数据中心
- 在数据中心里面用的虚拟机,通常叫作Type-1型虚拟机
- 客户机的指令交给虚拟机监视器后,不再需要通过宿主机操作系统才能调用硬件,而是可以直接由虚拟机监视器去调用硬件
- 在数据中心里,并不需要在Intel x86上运行一个ARM程序,而是直接在x86上虚拟一个x86硬件的计算机和操作系统
- 因此并不需要做什么翻译工作,直接往下传递执行即可,指令的执行效率也会很高
- 在Type-1型虚拟机里,虚拟机监视器并不是在一个操作系统之上的应用层程序,而是嵌入到操作系统内核里面的一部分
- 无论是KVM、XEN、Hyper-V(Windows 10),都是系统级程序
- Type-1型虚拟机的虚拟机监视器需要直接和硬件打交道,因为它需要包含能够直接操作硬件的驱动程序
- 因此Type-1型的虚拟机监视器更大一些,同时兼容性也不如Type-2型
- 但由于Type-1型一般部署在数据中心,硬件完全是统一可控的
Docker
- Type-1型虚拟机相对于Type-2型虚拟机已经没有什么硬件损耗了,但依然存在资源浪费
- 在实际的物理机上,可能同时运行多个虚拟机,而每个虚拟机都运行了一个单独的操作系统
- 多运行一个操作系统,意味这要多消耗硬件资源(CPU、内存、磁盘空间等)
- 实际需要的未必是一个完整的、独立的、全虚拟化的虚拟机,例如我们可能只需要独立的计算资源
- 在服务器端开发中,应用程序一般都是运行在Linux内核上
- 通过Docker,不再需要在操作系统上再跑一个操作系统
- 而是通过容器编排工具(如Kubernetes),能够进行各个应用之间的环境和资源隔离即可
- Docker没有再单独运行一个客户机操作系统,而是直接运行在宿主机操作系统的内核之上
- 通过Docker,不再需要在操作系统上再跑一个操作系统
- Docker严格来说不能算是一种虚拟化技术,只能算是一种资源隔离的技术
参考资料
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.