虚拟化的层次与机制

     最近几年随着并行计算、集群等技术的火热,虚拟机领域焕发了第二春。虚拟化就是指多台虚拟机共享一台物理机硬件的计算机体系结构技术。虚拟化的基本思想是分割软硬件以产生更好的系统性能(实际上,软硬件资源并没有增加,只是利用率提高了)。一个例子就是常见的“虚拟内存”,通过将一部分不用的磁盘写为页面文件,可以获得更大的内存地址空间,我们就可以跑更大的程序了。
1.  层次      我们都知道,传统方式是应用程序跑在操作系统上,而操作系统需要适应主机的特定体系结构,比如x86的机器上就只能跑win,linux,MaxOS等几种,AIX就没法跑了。      有了虚拟化之后,用于的应用程序由相应的客户操作系统管理,且1-n个客户操作系统可以独立于主机的操作系统,运行在同一个硬件上,且不需要适配硬件的特定体系结构。这通常通过增加一个虚拟化层来实现,该虚拟化层称为hypervisor或VMM(Virtual Machine Monitor)。      虚拟化层将主机的物理硬件资源虚拟为可被各虚拟机互斥使用的虚拟硬件资源,这可以在不同的层面实现,如下图:

层次 例子
应用程序级 JVM/.Net CLR
库支持(用户级API)级 WINE
操作系统级 Docker
硬件抽象级 VMware/Xen/KVM
指令集体系结构级 Bochs

     我们从下往上看。
     指令集体系结构级:      也称为ISA(Instruction Set Architecture)级,通过使用物理主机的ISA模拟一个给定的ISA来实现。基本的模拟方式是“代码解释”,一个软件翻译层的程序将源指令逐条翻译为目标指令,一条源指令可能会对应上百条目标指令来实现相同的功能。为改进性能,出现了动态二进制翻译技术,将动态源指令的基本块转换为目标指令,基本块可以转化为超级块来进一步提升转换的效率。尽管如此,这种方式还是五种层次中效率最低的。      一个典型的代表是Bochs,可以在各种Unix like系统中模拟x86平台,包括指令集、I/O、内存、BIOS等都可以模拟。一些爱折腾的大仙在Android上装windows就是用了这种方式(一个例子见  http://bbs.hiapk.com/thread-4750312-1-1.html ),当然速度惨不忍睹就是了。
     硬件抽象级:      该类虚拟化直接在原始硬件上进行。该方法虚拟CPU、内存和I/O设备,目的是通过多个并行用户来改进硬件资源的利用率。该类的典型代表是常用的VMware和Xen。这个层级的虚拟化有全虚拟化、半虚拟化等方式,参见第2部分介绍。      硬件级别的第一个问题是CPU虚拟化。如果当VMM/hypervisor运行在管理模式时,CPU支持在用户模式运行虚拟机的特权指令和非特权指令,则该CPU体系结构是可虚拟化的。RISC的所有控制敏感指令和行为敏感指令都是特权指令,因此RISC CPU是天然可虚拟化的(指这些指令都会自动陷入hypervisor)。而x86体系结构并不是为虚拟化设计,如果套用全虚拟化、半虚拟化等方式,则效率较低。为此提出了一种“硬件辅助的CPU虚拟化”特殊处理,引入一种特殊的运行模式和指令,使得VMM和操作系统可以运行在不同模式中。在Intel和AMD的x86处理器中,这种模式称为特权模式(位于环1),于是操作系统仍运行在环0(x86中操作系统只能跑在环0,见 http://baike.baidu.com/linkrl=sxY1XeWXddheQHsPnAOLIUpnHF6VWLCrw1IYv67T3BPaLAcnb5-j0NQpdY_B0D8iIFmUIh6OnENGyBAjsEgR1q),hypervisor运行在环1,所有特权指令和敏感指令都会自动陷入到hypervisor中。      通常来讲硬件辅助虚拟化应具有更高的效率,然而,由于从hypervisor到客户操作系统需要在处理器模式之间切换(用户模式和特权模式),会引起较高的开销,有时并不会优于二进制翻译。因此,如VMware等现在使用混合的方法,一部分任务交给硬件,其余则仍由软件处理。      内存虚拟化则类似于现代操作系统的虚拟内存。不同的是虚拟内存只有一级映射,而内存的虚拟化需要客户操作系统和VMM分别维护“虚拟内存——物理内存”和“物理内存——机器内存”的映射,共两级映射。VMware使用影子页表进行虚拟内存到机器内存的地址转换。但该技术效率太低(是早期VMware巨慢的原因之一),Intel开发了基于硬件的EPT(扩展页表)技术来加以改进,下图为该技术的示意图(盗的台巴子的,原文找不到了)。(AMD也有类似的技术称为NPT)

虚拟化的层次与机制
     基于主机的虚拟化:      这种机制是,宿主机的操作系统仍旧负责管理硬件,在宿主机操作系统上安装一个虚拟化层,客户操作系统安装并运行在虚拟化层之上。可见这种机制下不论何种指令,都需要经虚拟化层转发后由宿主机操作系统执行,并且当客户操作系统的ISA与底层硬件的ISA不同时,还需要在虚拟化层做二进制翻译,因此效率是很低的。也可见这种方式和全虚拟化是有区别的,所以必须分开讲。
     半虚拟化:      半虚拟化技术是后来才出现的技术,也叫做 准虚拟化技术,现在比较热门,它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要VMM/Hypervisor耗费一定的资源进行翻译操作,因此Hypervisor的工作负担变得非常的小,整体性能也有很大的提高。不过缺点就是,要修改包含该API的操作系统,但是对于某些不含该API的操作系统(主要是windows)来说,就不能用这种方法。半虚拟化技术见下图。 虚拟化的层次与机制
     如果硬要比较的话,在编译器支持虚拟化(半虚拟化)时XEN优于KVM,在硬件虚拟化时KVM优于XEN。
(本文参考《云计算与分布式系统》,但是原书的相关章节有些混乱,也有一些跟不上形势的地方,一并修改了)

文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8727 人正在系统学习中

来源:damipingzi

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年4月1日
下一篇 2016年4月1日

相关推荐