Virtualization-Cpu/Memory/IO虚拟化详解

简介:

一、定义

虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。CPU虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

二、虚拟化的类别

虚拟化的类别有很多,定义也很宽泛;无法做到全面详述。这里将简单说明:

1、模拟:emulation(底层和模拟架构不需要一致);通过软件模拟是需要模拟环Ring0/1/2/3层;但是性能差;所以使用相对较少。

硬件-->Host-->VMM(emulation)-->Virtulization host

wKioL1N_J5TR_vMDAACDYwE0MrQ142.jpg

2、完全虚拟化(full-virtualization):只虚拟出环ring0(以CPU虚拟化来说明)

  • BT:二进制翻译技术(Binary Translate);将模拟的CPU直接翻译成特权指令;限定虚拟结构平台和底层物理架构必须保持一致。基于软件的完全虚拟化。

    • 优点:不用修改GuestOS内核可以直接使用;应用广泛。

    • 缺点:在VMM捕获特权指令和翻译过程会导致性能的下降。

wKiom1N--0ijluewAAEXHEtbiKI317.jpg

  • 硬件辅助虚拟化:5个指令环;在环0的底层加了环-1;环0的特权指令给了环-1;HVM(hardware virtulization machine);属于硬件的完全虚拟化。

wKiom1N_J07iWHAwAADvRaoKB_k779.jpg

3、半虚拟化(para-virtulization):Guest明确知道自己运行在虚拟机上;;在执行特权指令时直接向hyper call调用;省去了特权指令的翻译过程。

  • 优点:相对完全虚拟化;性能高;省去了特权指令的翻译过程。

  • 缺点:需要对GuestOS内核的修改;应用有限制。

wKiom1N_KKrjTaCSAAD_2hk9qbc060.jpg

4、OS级别的虚拟化:硬件-->OS kernel-->多个用户空间

wKioL1N_KI_AHoWGAAC9M2bvM64680.jpg

5、库虚拟化:wine

6、应用程序虚拟化:jvm

虚拟化的实现方式:

两种类型:

  • Type-I:Hypervisor;在虚拟机的管理上更加的彻底和可靠。

  • Type-II:宿主机运行在硬件上;可以依赖宿主机的各种管理软件进行虚拟机管理。

wKiom1N_KNjyDJAkAADRN569B0s251.jpg

三、内存(Memory)虚拟化

内存虚拟化是虚拟机实现中的重要部分。在虚拟机中,虚拟出来的Guest OS和Host OS用的是相同的物理内存,却不能让它们相互影响到。如果OS在物理机上运行,只要OS提供页表,MMU会在访存时自动做虚拟地址(Virtual address, VA)到物理地址(Physical address, PA)的转化。而如果虚拟机上运行时,Guest OS经过地址转化到的“物理地址”并不是真实物理内存上的地址(GVA-->GPA),因此还需要使用软件将其转化为真实物理内存地址(HPA)。也就是说Guest OS要访问VA需要经过GVA-->GPA-->HPA的转化。

  • MMU Virtualization:

    Guest完成GVA-->GPA第一层转化,硬件同时完成GPA到HPA这第二层转化。第二层转化对于Guest OS来说是透明的。Guest OS访问内存时和在物理机运行时是相同的,所以可以实现全虚拟化。这种特性Intel和AMD都有支持。Intel称之为Extended Page Tables (EPT),AMD称之为Nested Page Tables (NPT)。其优点是hypervisor节省了工作,缺点是需要硬件支持。

  • TLB Virtualization:tagged TLB

    TLB:转换后援存储器;原生只存储VA-->PA的对应关系。所以在虚拟内存中的两次转换会导致TLB的命中率失效。致使性能降低。所以使用tagged TLB,它缓存了Guest对象和GVA-->HPA的对应关系。需要CPU的支持。


四、I/O虚拟化的方式

  • 模拟(完全虚拟):完全使用软件来模拟真实硬件;模拟通常硬件;例如键盘鼠标;通过焦点捕获;焦点被哪个主机捕获就被哪个主机使用。性能很差。

  • 半虚拟化:对硬件驱动由前端(IO frontend)直接转到后端(IO backend)调用;通常仅适用于硬盘和网卡。性能高。

  • IO-through:IO透传;直接分配给虚拟机物理设备;例如直接分配一个硬盘或网卡给虚拟机;需要硬件具备IO透传技术;在Xen下由Dom0分配;但是访问使用直接使用;不经过Dom0。需要硬件支持。

I/O具体工作模式:

wKioL1N_K3TCmGevAAG_7ES5ySI305.jpg

VMM:对IO的驱动有三种模式:

  • 自主VMM:由VMM自行提供驱动和控制台;

  • 混合VMM:借助于OS提供驱动;

    依赖于外部OS实现特权域

    自我提供特权域

  • 寄宿式VMM:

五、虚拟化网络

bridge:把原宿主机上的网卡当交换机;然后虚拟出一个桥来接收发往宿主机的数据包。

wKiom1N_LSzCDWemAACuqbbH7aA345.jpg

isolation mode:仅guest之间通信;不与外部网络和宿主机通信。

wKioL1N_LRrC1KNHAACza0CcBBQ242.jpg

routed mode:与外部主机通信;依赖于静态路由指定到各Guest需经过pnet0。

    host-only:不与外部主机通信。

wKiom1N_LYOTSt9bAADynOCm8dM545.jpg

nat:地址转换;在虚拟网卡和物理网卡之间建立一个nat转发服务器;对数据包进行源地址转换。

wKioL1N_LZ7x6XYKAADRs68eZZQ940.jpg

到此基本虚拟化基础以详解完成。



本文转自Mr_陈 51CTO博客,原文链接:http://blog.51cto.com/chenpipi/1416422,如需转载请自行联系原作者

相关文章
|
9月前
|
SQL 缓存 人工智能
CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点
CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程; 如果是IO密集型任务,使用多线程,线程越多越好; 如果是CPU密集型任务,使用多进程,线程数量与CPU核心数匹配。
|
监控 Linux
jmeter-性能监控CPU、内存、IO等-监控插件详解(1)
jmeter-性能监控CPU、内存、IO等-监控插件详解(1)
jmeter-性能监控CPU、内存、IO等-监控插件详解(1)
|
大数据 Java C语言
什么是CPU密集型、IO密集型?
CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
3932 0
|
6月前
|
安全 虚拟化
VMWare 虚拟机 CPU 设置里针对 CPU 的虚拟化 IOMMU(IO 内存管理单元) 选项功能介绍
VMWare 虚拟机 CPU 设置里针对 CPU 的虚拟化 IOMMU(IO 内存管理单元) 选项功能介绍
367 0
|
2月前
|
网络协议 Linux
【系统DFX】如何诊断占用过多 CPU、内存、IO 等的神秘进程?
【系统DFX】如何诊断占用过多 CPU、内存、IO 等的神秘进程?
106 0
|
缓存 Linux Shell
Docker资源(CPU/内存/磁盘IO/GPU)限制与分配指南
什么是cgroup? cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组(如CPU、内存、磁盘输入输出等)。 什么是Docker资源限制?
|
Java 数据库 芯片
物无定味适口者珍,Python3并发场景(CPU密集/IO密集)任务的并发方式的场景抉择(多线程threading/多进程multiprocessing/协程asyncio)
一般情况下,大家对Python原生的并发/并行工作方式:进程、线程和协程的关系与区别都能讲清楚。甚至具体的对象名称、内置方法都可以如数家珍,这显然是极好的,但我们其实都忽略了一个问题,就是具体应用场景,三者的使用目的是一样的,换句话说,使用结果是一样的,都可以提高程序运行的效率,但到底那种场景用那种方式更好一点?
物无定味适口者珍,Python3并发场景(CPU密集/IO密集)任务的并发方式的场景抉择(多线程threading/多进程multiprocessing/协程asyncio)
|
机器学习/深度学习 数据库 C语言
一分钟明白IO密集型与CPU密集型的区别
CPU密集型 CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作CPU读写IO(硬盘/内存)时,IO可以在很短的时间内完成,而CPU还有许多运算要处理,因此,CPU负载很高。
|
Arthas Java 测试技术
ES7.5升级7.17后在写多读少场景下CPU、IO飙升
ES PAAS管理的集群升级了100+,从7.5升级到7.17 (保证每个大版本最终仅维护一个小版本集群),由于业务使用差异大,也出了不少问题,前面的文章也有提到过Integer类型字段使用terms查询效率低的情况...
240 0
ES7.5升级7.17后在写多读少场景下CPU、IO飙升
|
Java 数据库 芯片
物无定味适口者珍,Python3并发场景(CPU密集/IO密集)任务的并发方式的场景抉择(多线程threading/多进程multiprocessing/协程asyncio)
一般情况下,大家对Python原生的并发/并行工作方式:进程、线程和协程的关系与区别都能讲清楚。甚至具体的对象名称、内置方法都可以如数家珍,这显然是极好的,但我们其实都忽略了一个问题,就是具体应用场景,三者的使用目的是一样的,话句话说,使用结果是一样的,都可以提高程序运行的效率,但到底那种场景用那种方式更好一点? 这就好比,目前主流的汽车发动机变速箱无外乎三种:双离合、CVT以及传统AT。主机厂把它们搭载到不同的发动机和车型上,它们都是变速箱,都可以将发动机产生的动力作用到车轮上,但不同使用场景下到底该选择那种变速箱?这显然也是一个问题。