当前课程知识点:大数据系统基础 > 2.云计算 > 授课视频 > 2.9计算虚拟化
中心虚拟化 三个方面的
第一个方面是计算虚拟化
计算虚拟化实际上是一个
用得很早的技术
所以它的种类也非常的多
但是大体上
计算虚拟化几个重要的概念
第一个叫做主的操作系统
主操作系统
是直接跟硬件打交道的
操作系统
它管理着硬件
然后虚拟化环境之后
一个硬件可以虚拟化成
好多个虚拟机
每一个虚拟机里
可以跑自己的操作系统
这些操作系统
我们就叫做客户操作系统
然后各个客户操作系统之间的
管理和调度
是由一个主件
叫做Hypervisor来实现的
这个Hypervisor
或者这个Hypervisor
它为什么叫Hypervisor
过去的话
我们管它叫虚拟机管理器
叫做Virtual Machine
Manager VMM
但是后来现在比较流行的词
是Hypervisor
因为Supervisor这个词
是操作系统里头
管集成调度的
但是听起来
比Super更加厉害的
那就是Hyper
所以Hypervisor
是管操作系统的
所以它是管着一堆Supervisor
所以管它叫做Hypervisor
所以Hypervisor
是管理各个客户操作系统的
这样一个虚拟化的
主要的组件
Hypervisor的实现
有好几种形式
一类大家可能常见的
一种实现的形式是
就是这种形式
是叫做类型2的实现形式
那么它是跑在主操作系统内的
同学们可能用过
比如说在MAC上跑一个
vm ware work station
或者跑一个
vm ware the fustion
就是这一系列的Hypervisor
它是把在一个操作系统里边
虚拟出另外一个操作系统
比如说你想在windows8里头
跑一个windowsXP
可能玩一些老的游戏
或者跑一个windows3.1
跑个DOS 在这种情况下
它就是类型2的Hypervisor
它是跑在
一个主操作系统之上的
主操系统控制着硬件
Hypervisor不控制硬件
另一种类型
是服务器虚拟化常用的
比如说是现在新的一些
vm ware 的服务器虚拟化的
解决方案都是跑的一种类型1
就是Hypervisor
直接控制硬件
它没有主操作系统
Hypervisor是非常简单的一层
它直接跟硬件打交道
它上面就可以跑若干个
客户操作系统
在这种情况下
你可以免除了这种
维护这主操作系统的一些麻烦
还有一种类型叫类型0
类型0是结合了两者
Hypervisor既直接跟硬件打交道
它也跟主操作系统打交道
readings的TPM
是这样的一类Hypervisor
但是无论Hypervisor的类型
是什么
它们提供的接口都是一样的
它们提供了一个虚拟的
一个硬件的接口层面
客户操作系统可以自己理解
它自己占有了这么一个硬件
实际上这个硬件
是一个虚拟的硬件
服务器虚拟化这件事情
它实际上是一个很麻烦的技术
它跟操作系统的底层
联系得非常紧
这里头的核心的问题
或者核心的难点主要有三个
第一个就是指令集的翻译
如果你提供的虚拟机
和你的真实的物理机器
它指令集不一样
比如说我想在X86上
提供一层
比如说PowerPC的虚拟机
这样的话
可以跑一些老的
苹果的应用程序
或者说我可以在X86上
提供一个java的运行环境
可以直接跑java
java它的二进制码
是一种byte-code
是这种自解码的这种形式
可以直接跑这个java
那么我们实际上是对
这些东西
它是有一层指令集
翻译的过程在里头的
指令集翻译
它是基于一种二进制的翻译
一个机器码可以翻译成
另一个机器码
当然这种翻译会比较慢
但是这种东西比较慢怎么办呢
这又是计算机系统的人
解决问题的一把重要的武器
那就是缓存
因为我翻译了一段
我先把这段记住
下次再用到这段的时候
我知道我刚才翻译过
我就不用再翻译了
我就可以来回用
这是它解决了一个
缓存解决了一个翻译效率的问题
但是里头
还有一个更复杂的问题
就在于有一些个指令
是只有在一些高权限的状态
才能执行的
比如说
直接操作这个内存页表
比如说
直接访问一些个I/0的设备
这些东西需要内核的权限
需要操作系统的权限
才能运行
那么客户机它是一个操作系统了
它里头有一个操作系统
它以为我独占了这台机器
我也希望运行这种
高权限的命令
但是事实上它运行不了
因为它实际上
真正的权限在Hypervisor那里
它只是一个应用程序
它运行这种高等级命令的时候
它就会失败
所以这个情况下
如何来让虚拟机里的
客户操作系统
能够执行这种高权限的命令
所以这种东西
不能够直接翻译
它需要一些特殊的处理
跟这相关的
就是一个I/0设备的仿真
比如说我的机器上
有一个特殊的显示器
或者有一个特殊的存储设备
那么我的虚拟机上
是不是能看到这些设备
那万一我的虚拟机上
跑了一个操作系统
不支持这些设备的驱动
那怎么办
所以I/O设备是怎么仿真的
也是一个需要考虑的问题
第三个需要考虑的问题就是
如果保障这个处理器的
数据结构不被破坏掉
因为处理器
它里头都是一些寄存器
比如说我的堆栈指针
在什么地方
我的数据指针在什么地方
这些都是一些一系列的寄存器
这些寄存器
在处理器里头只有一个
那么操作系统
它认为我是独占这个处理器的
我想怎么改它就怎么改它
实际上这就是操作系统
怎么工作的
但是客户操作系统
它是好几个客户操作系统
每个人都想改
这个处理器的这些状态
你改了之后
它还能不能互相不影响
你把人家的处理器改掉了
人家那个数据就找不到了
所以在这种情况下
多个客户操作系统都想改
这个处理器里的数据结构
这时候怎么做
我们肯定不能把真实的处理器
提供给客户的操作系统
所以我们在虚拟机里头
这个东西叫做影子处理器
就是实际上
你做了一个处理器的影子
客户操作系统改的
都是那个处理器的影子
每一个人各自有一个影子
但是真实的处理器
只有那个Hypervisor来控制的
这是我们虚拟化
主要考虑的三个问题
鉴于这门课的目的
和时间的关系
我们只举一个具体的例子
大家可以看到
虚拟机是如何来处理
这一系列的问题的
这一个例子
就是一个内存的保护和管理
这么一个问题
大家如果回想一下
操作系统课我们学的是进程
一个进程
它是有它自己的一系列的堆栈
它有一个运行的顺序
它还有自己的地址空间
每一个进程都
认为它自己有一个
一模一样的 独占的 整个的
内存空间
比如说它有这么一段
它这一段永远是
从最低的地址
一直到最高的地址
比如说32位的机器
它从0到4GB的地址
它是这么一个地址空间
它觉得它是独占的
它可以把地址分成代码段
数据段 它可以分成
各种不同的地方
那么程序1它访问内存的时候
它用的是它虚拟地址
它自己的内存地址
它访问哪里
然后实际上
我们有一个叫翻译映射的东西
它是一个硬件
实现的一个机制
它能够把虚拟的地址
翻译成物理的地址
实际上每一段虚拟的地址
在内存里 实际上
在物理内存里
实际上对应着另外一个空间的
当然程序2也是如此
它也看到的
也是自己一串虚拟的地址
但是它的虚拟地址
可能映射到物理内存的
另外区域
这个映射
是由一个东西叫做MMU
(07:04)
内存管理单元
这个东西是CPU里头
集成的一个部件
是由它来完成的
所以这个地址的转换
是一个硬件的转换
因为只有当硬件实现
你才能够
因为寻址是非常普遍的
你只有硬件转换
它才能保证这个寻址的高效率
这MMU传统来说
是由操作系统控制的
操作系统决定了哪个进程
它的地址映射到什么地方
所以这个映射叫做页表
页表这个东西
是操作系统管理的
但是就像我们刚才说的
如果它有很多的客户操作系统
那么哪个客户系统
来管理这个页表
所以这个是一个问题
这件事情现在是怎么解决的
不同的虚拟机的Hypervisor
有不同的实现方法
头两种是比较传统的解决方法
第一种方法叫做半虚拟化
所谓半虚拟化的意思就是说
如果客户操作系统你能改
比如说它是个开源头的
它是个Linux或者是什么
那么我稍微改一改
那么它想访问页表
或者想访问这种
你不应该没有权限访问的
操作的时候
那我就不让你访问
咱们把代码改了
我改成我想访问这个
我跟Hypervisor说一声
我说我想访问这个
那个Hypervisor就知道了
它自己可以调度这件事
这叫做半虚拟化
半虚拟化的特点就是说
我需要改动
这个客户端操作系统
而有些操作系统
比如说Windows它不让你改
那你怎么办呢
就是另外一种方法
就叫影子页表
影子页表的说法就是说
你爱访问什么访问什么
但是你访问完了之后
它就会出错
因为它没这权限
它硬件就会(08:31)到操作系统
但是它自己是操作系统
所以它会
(08:34)到Hypervisor
所以这个时候Hypervisor
捕获了这个异常之后说
你想干这件事
那么我来决定
是不是现在让你干这件事
还是让你先等会
让别人先干完了你再干
所以这个叫做影子页表的方案
就是每一个客户端操作系统
需要的没有权限的操作
比如说改MMU这种操作
它都会造成一种异常
然后变成一种硬件的中断
然后Hypervisor
捕获这种中断
然后来把它这个事情
给它打上个补丁
然后让它截住这个操作
把它转换成它允许的操作
这是两个在没有硬件支持的
情况下的操作
但是现在Intel和AMD
这两家作为CPU的巨头们
都想说 现在虚拟化这么时兴
我干嘛不在硬件里支持
其实你想这个页表这东西
原来想的是就是一个操作系统
我们只有一个页表
一个操作系统管理的
其实这件事情
如果你想做成一个多级的
第一级 我说它到底是哪一个
客户操作系统的页表
然后我确定了那个之后
我再往下看
它的页比是怎么回事
每一个操作系统
它自己管理自己的列表
这个事情实际上硬件里实现
是非常简单的
在几年之前
无论是Intel还是AMD
都已经在硬件里
实现了这种功能
他们这种东西的统称
叫做二级地址转换表
叫second-level address
translation tabol
以使用不同的客户操作系统
第二级是传统的页表
当然了Intel和AMD
都有不同名字 商品名字
AMD叫AMD-V 叫RVI
Intel里头 叫VTX或者叫EPT
这些都在硬件里实现
现在目前大部分的Hypervisor
都是利用
这个硬件支持的虚拟化
所以现在虚拟化的开销
实际上是越来越小了
-授课视频
--什么是大数据
--大数据典型应用
--大数据的特点
--大数据技术体系
--大数据生态系统
--大数据技术挑战
--课程内容
-1. 绪论--Quiz 1
-授课视频
--2.2并行化理念
--2.9计算虚拟化
-2.云计算--Quiz 2
-授课视频
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
-3.文件存储--Quiz3
-授课视频
--4.13类似框架
--4.14章节总结
-4. 处理框架--Quiz4
-授课视频
-5.内存计算--Quiz5
-授课视频
--数据副本及一致性
--节点本地数据存储
-6. NoSQL--Quiz6
-授课视屏
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
-7. 流计算--Quiz7