首先需要对虚拟机进行了解:
Any problem in computer science can be solved by another layer of indirection.
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
比如MMU(Memory Management Unit)内存管理单元,就是负责虚拟地址到实际物理地址的转换,可以看成是CPU和物理内存之间的中间层,方便物理内存的更高效使用。还有TCP/IP协议,每一个都是层。
虚拟机不是个新事物,早在几十年前的六七十年代已经出现。最古老的计算机是穿孔计算的,主要用来数学计算,比如微积分。后来高级一点就有了指令,计算机执行指令,也就有了编写复杂逻辑程序的功能。于是有人就脑洞大开,这在当时其实很了不起的想法,就是同一段指令程序,可以不可以用软件模拟指令执行,然后算出结果,而不是直接把指令放到硬件上运算,毕竟硬件上运算指令的基本逻辑不复杂,主要是寄存器之间的操作。但是在当时看来,这类的模拟程序实际上并没实际多大用处,本身计算机的处理速度就不快,再加入一层软件模拟层,速度就降了很多。
我们读大学时候都知道汇编语言,学习汇编语言一般会用叫汇编模拟器之类的软件。严格意义上说,汇编模拟器就是一类虚拟机,其可以控制运算一般是英特尔8086CPU的基本指令。Java虚拟机JVM也是虚拟机,但是它的指令并没有真正的物理CPU支持,也就是它的指令是完全用软件创造的。JVM的好处就是在不同平台上都有JVM,然后JVM的指令不变,这也保证了JAVA语言的字节码在哪都可以运行,纵然JVM实际运行的平台的指令集不同,如ARM与Intel的不同指令集。
随着计算机CPU的运算能力变得越来越强,内存越来越大。完全模拟执行现实中的CPU也变得现实了起来。一般有两种类型的模拟方式,一种是完全百分百用软件模拟指令执行,也就是有个软件的CPU,这种方式的优点是可以创造现实中不存在的指令或执行与宿主机不同指令集的指令,但是速度一般较慢。另一种是指令直接放到物理CPU中执行,这样的优点是速度会快很多,但是受限于虚拟机安装平台的指令集。