要理解虚拟化的不同内涵,需要从首先回顾计算机的层次结构。几乎所有的计算机遵守着相同的层级结构。分别是:
应用程序层
函数库层
API抽象层
操作系统层
硬件抽象层
硬件层
自底向上,形成依赖关系,这种分层的做法带来如下好处:
1)每一层都向上提供了接口,降低系统的复杂性和软件的可移植性。
2)每一层只需要知道下一层的抽象接口即可,不需要知道其内部运作机制
3)降低系统设计的复杂性
4)提高软件可移植性
虚拟化就是在上下两层之间,通过向上层的提供与下层一致的接口方法,抽象出一个新的软件或硬件接口,使得上层软件可以直接运行在新的虚拟环境上。
虚拟机:存在于硬件层和操作系统层间的虚拟化技术。
虚拟机通过“伪造”一个硬件抽象接口,将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样的功能。
容器:存在于操作系统层和函数库层之间的虚拟化技术。
容器通过“伪造”操作系统的接口,将API抽象层,函数库层以上的功能置于操作系统上,以Docker为例,就是基于Linux操作系统的Namespace和CGroup功能实现的隔离容器,模拟操作系统的功能,因为它比虚拟机高了一层,也就需要少一层东西,所以容器占用资源少。
JVM:存在于函数库层和应用程序之间的虚拟化技术。
Java虚拟机具有跨平台特性,所谓跨平台特性实际上就是虚拟化的功劳,我们Java语言是调用操作系统函数库的,然而不同操作系统的函数库互不相同,JVM就是建立一个虚拟化层,对下通过不同的版本适应不同的操作系统,对上提供统一的运行环境交给程序和开发者。通过虚拟化实现了如今蔚为壮观的Java生态圈以及建立在JVM基础上的其他语言,如Scala,Clojure,Kotlin等。
所谓虚拟机,就是一台虚拟的计算机,他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的visual box、vmware就属于系统虚拟机,他们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机的代表就是java虚拟机,他专门为执行单个计算机程序而设计,在java虚拟机中执行的指令我们称为java字节码指令。