传统的计算机
在一个物理机器上只能运行一个操作系统 操作系统之上又可以运行各种各样的用户进程
那这看起来似乎是很合理的 但是在有的商业化的环境当中 这会导致硬件资源利用率不充分的一个问题
比如 你拥有一个非常强大的一个物理机 性能很好 但是由于这台机器上 它只能运行一个操作系统
那么你的这台机器 如果说你想要租给其他人使用的话
那其他人的这个要运行的东西只能在同一个操作系统之上运行 比如说
王者荣耀的这个游戏服务器和和什么吃鸡的那个游戏服务器 它必须放在同一个操作系统之上
来运行 但两个进程他们在同一个操作系统之上 是不是有可能会有一些安全隐患啊 他们之间可能会相互影响 也会相互的争夺操作系统管理的这些资源
所以 在商业环境当中 两个应用让他们同时在一个操作系统上运行 这可能会造成一些隐患
那一种解决方法是 我们把其中一个应用把它迁移到另一台物理机器上
然后这台物理机器上有一个独立的操作系统 那这样两个应用就不可能相互影响 对吧
但是这又会导致物理机器硬件资源的极大浪费 刚才我们说很多商业级的这种物理机器 它的性能是很强的
我的这个硬件性能本来可以同时支持你们两个进程的使用绰绰有余 但是为了安全起见 我又不得不浪费
把其中一个进程迁移到另一台机器上去运行好 所以传统的这种结构 一个机器上只能安装一个操作系统 会带来很多应用上的限制
因此 就有人发明了虚拟机
虚拟机virtual machine英文所写叫VM
虚拟机是使用虚拟化的技术 把一台物理机器虚拟化为多台虚拟机器
每一个虚拟机器上都可以独立的运行一个操作系统 要把一台物理机器虚拟化为多台虚拟机器
就需要使用到虚拟机管理程序 英文叫virtual machine monitor
缩写vmm这个缩写也非常常见 那也有人把虚拟机管理程序称为Hypervisor
在中文上也会把翻译为虚拟机监控程序 所以虚拟机管理程序 虚拟及监控程序
vm还Hypervisor这些术语都是一个意思 那接下来我们会使用虚拟机管理程序这个术语
第一类的虚拟机管理程序会直接运行在硬件之上
由虚拟机管理程序会把一个物理机器虚拟化为多台虚拟机器
会把一个总的硬件资源划分为多个部分 分别给各个虚拟机来使用
那每一台虚拟机器上面可以安装各自的操作系统 比如 第一台虚拟机上安装windows 第二台上面安装linux
而第三台上面又安装windows 在每个操作系统之上又可以运行各自的用户进程
好 我们可以简单说一下 如何把一个机器上的硬件资源 把它分配给各个虚拟机器
比如一个cpu 一个单核的cpu 它也可以模拟多台虚拟机器
我们只需要把这个cpu的时间片进行划分 对吧 每个虚拟机器分配若干个时间片
那这样的话 在上层的这个操作系统看来似乎给自己分配的就是一个独立的cpu 对吧
但事实上只是把这个物理cpu的某一些时间片分配给他了而已 那磁盘和内存的分配更不用说
只需要把磁盘空间划分出来 分配给个虚拟机器 内存空间划分出来分配给各个虚拟机器
那这样的话 每个虚拟机器都可以拥有各自独立的硬件资源 就有点类似于传统的计算机当中
操作系统把硬件资源进行了划分 向cpu就是按时间划分为时间片
像内存磁盘这些就是划分为了不同的空间分配给哥进程 那这样每个进程是不是也可以拥有自己独立的资源
而所以 第一类虚拟及管理程序就有点类似于我们传统的操作系统一样 它会负责直接管理这些硬件资源 并且分配这些硬件资源
这只是一层更深的套娃而已 那值得一提的是 只有虚拟机管理程序是运行在内核态的
只有它可以使用特权最高的那些指令 而上层的操作系统和应用程序
他们实际上是运行在用户态的 那这会导致一个问题 上层的操作系统
他可不知道自己运行在用户台 他以为自己运行在内核态 所以上层的操作系统
依然会使用一些特权指令 对吧 但是刚才我们说只有虚拟及管理程序运行在内核态
所以上层的这个操作系统不能让他使用特权指令 那这种情况怎么办呢
当上层的操作系统想要使用特权指令的时候 它的这个行为动作
会被虚拟机管理程序给截获 然后这个虚拟机管理程序会负责把上层的操作系统想要执行的这个特权指令
进行一些等价的转换 反正就是要给上层模拟出 哎 好像这个指令执行成功了那种感觉
好 所以我们说上层的操作系统 它是运行在虚拟内核空间的 它并不是真正的内核空间
实际上是用户空间 只不过他自己以为自己运行在内核空间而已 这是第一类虚拟机管理程序
直接运行在硬件之上 直接会管理硬件 分配硬件资源
它不是直接运行在硬件上的 而是运行在一个速主操作系统上 host os
比如 在我的mac电脑上 我安装了mac这个操作系统 那我可以在我的这个电脑上安装第二类的虚拟机管理程序
比如 很多同学可能听过virtro box或者VMware这是我们国内的学生比较常用的两款
虚拟机管理程序 那我的电脑上是安装了VirtualBox安装了这个软件之后
我就可以去下载另一个操作系统的镜像文件 比如在我的这个VirtualBox上 我就安装了一个linux的操作系统
并且我可以指定要给我上层安装的这个操作系统分配多大的内存
也可以给他指定要给他分配多大的磁盘空间 那接下来我就可以点这个启动
然后在我的Mac电脑上套娃启动一个linux的操作系统好所以我的电脑本身
是mac os的操作系统 这就是宿主操作系统在我的操作系统之上
我安装了某一个第二类的虚拟机管理程序VirtualBox在这个虚拟机管理程序之上 我就可以安装一个客户操作系统
比如我安装的就是一个linux那如果我愿意的话 我也可以安装一个windows的操作系统
那如果我再安装一个windows的这个客户操作系统的话 我可以在我的电脑上同时启动
两个客户操作系统 当然也可以只启动一个 只要我的硬件资源足够
那我就可以在我的这个速主操作系统之上安装并且同时启动多个
客户操作系统 那显然在我的操作系统之上 除了客户操作系统之外
还会同时运行着很多我自己安装的一些进程 对吧 比如我现在正在给大家录课 那么我的电脑上还在运行ppt相关的进程
同时 我也可以启动我的这个客户操作系统 让我的客户操作系统也正常了工作
而我的客户操作系统启动了之后 就跟正常的操作系统一样 我也可以在上面安装软件
也可以让这些软件正常的运行 所以有的时候我陆客如果想给大家演示windows操作系统
的一些情况 那我就会启动一个windows操作系统的虚拟机器 然后在上面安装一些windows的应用程序 给大家做这样的演示
好 所以第二类的虚拟机管理程序 它并不是直接运行在硬件之上
而是运行在速主操作系统上面 这个虚拟及管理程序想要给各个虚拟机器分配硬件资源
那么 他只能请求操作系统给他分配 然后再由这个虚拟及管理程序进行再分配
硬件资源的管理者依然是速主操作系统啊 那这是两类虚拟机管理程序
第一类虚拟机管理程序和第二类虚拟机管理程序思想各不相同 那由于他们的实现方式不同 因此就造成一些特性上的差异 这给大家做了一个总结
首先 对物理资源的控制权 第一类的虚拟机管理程序 它是直接运行在硬件之上的
可以直接控制和分配这些物理硬件资源 而第二类的这个虚拟机管理程序 它是运行在速主操作系统之上的
依赖于诉主操作系统为其分配物理资源 他要使用硬件资源只能向诉主操作系统申请并且被分配
因此 两类虚拟机管理程序在给上层的这个客户操作系统
分配资源的时候也会出现一些差异 比如第一类虚拟及管理程序在安装客户操作系统的时候
他会直接在原本的硬盘上给他划分一些存储空间 直接分配给他 比如说 我把零号块到1024号块
全部分配给第一台虚拟机vm一然后从1025号快一直到2048号快
全部给他分配到第二台虚拟机vm二我可以直接把一些未经抽象的
物理资源分配给上层的虚拟机器 那这就有点类似于我们之前说的外核的那种分配方式
那相比之下 第二类的虚拟机器向速主操作系统申请物理资源的时候
诉主操作系统给他分配的这个资源是经过抽象的 比如第二类虚拟机管理程序 想给
第一台虚拟机分配十个GB的磁盘存储空间 那么这个虚拟机管理程序
会向操作系统申请创建一个大小为十GB的大文件
那这个大文件具体存放在磁盘当中的哪些位置 是由宿主操作系统
来决定的那虚拟机管理程序在获得了这十GB的大文件之后
他又会把这十GB的空间给分配给第一台虚拟机器
让第一台虚拟机器以为自己好像拥有了实际币的磁盘存储空间一样
但事实上 这只是一个虚拟磁盘 这十gb的空间在磁盘当中未必是连续的
背后对应的是速主操作系统文件系统当中的一个大文件而已
这是对于外存的分配 那对于内存的分配是不是也一样啊 第二类的
虚拟机管理程序向操作系统请求 给他分配一片内存空间
那速主操作系统给他分配了4Gb的内存空间 但这4Gb
事实上是虚拟内存 对吧 各个页面也许是离散存储的好 那这个虚拟机管理程序获得了这4Gb的虚拟内存之后
又可以把这4Gb的虚拟内存拆分分给不同的这个虚拟机器
比如第一台虚拟机器分两gb 第二台虚拟机器又分两gb 它就是这么干的 所以就是多增加了一层套啊
他本身得到的也是一个虚拟的硬件资源 然后他又把这个虚拟的硬件资源再虚拟
再分配给哥哥虚拟机器 那显然这会导致第一类虚拟机管理程序性能更好 对吧
因为我们每进行一次硬件的虚拟化 就意味着上层的这些用户操作系统在使用这些硬件资源的时候
他的这个地址需要先应设为这个虚拟机管理程序获得的这个虚拟地址空间
然后宿主操作系统又需要把这个4Gb的虚拟地址空间再给映射到实际的物理地址空间
所以 经过了多层的虚拟 就意味着在使用这些资源的时候又需要经过多层的映射
才可以对应到最终的一个物理地址上 那这就会导致第二类的虚拟及管理程序 它的性能更差
总是需要通过这个宿主操作系统作为中介好另一个方面 在一台机器 它的硬件资源确定固定不变的情况下
第一类的虚拟机管理程序往往可以支持更多台的虚拟机 因为第一类的这个虚拟机管理程序
他拥有所有的硬件资源 对吧 而第二类的虚拟机管理程序 他自己的资源需要跟速主操作系统申请
那速主操作系统 它本身也需要一些硬件资源 同时它上面的这些进程也需要使用一些硬件资源
所以 在硬件资源相同的情况下 显然第一类的这个虚拟机管理程序可以支持更多台的虚拟机
这是可以支持的虚拟及数量接下来虚拟机的可迁移性
而低类的虚拟机管理程序要迁移虚拟机 比如要把这台虚拟机器迁移到另一个虚拟机管理程序之上
那这个迁移的动作是比较麻烦的 而第二类的虚拟及管理程序要迁移一台虚拟机就非常方便
比如我自己的这个虚拟机管理程序上 我要迁移这个limix操作系统 我要把我的这个操作系统
给你用 那么我只需要把这个操作系统导出导出为i so就是镜像文件
然后你直接把我这个镜像文件拷过去 在你自己的VirtualBox上面一加载一安装 你就可以使用到跟我这边完全一样的操作系统了
包括我在我的这个客户操作系统上安装的一些程序啊或者数据啊什么的
都可以一起打包给你 然后你可以很方便的迁移到你自己的VirtualBox上
所以这是由于它的可迁移性好 所以第二类的这个虚拟机管理程序 它的商业化应用目前来看是更广泛一些的
使用起来会很灵活嘛 而最后运行模式方面低类的虚拟机管理程序
它运行在最高的特权级别 可以使用最高特权的指令 那以前当我们介绍指令的时候
只是把指令分为了非特权指令和特权指令这样的两个特权级别 对吧
但是 在近几年的cpu当中 指令的特权集可能会被进行更多层次的划分
比如化为零级一级二级三级越往上 特权级越低越往下
特权级别就越高 所以这地方我们说低类的虚拟及管理程序运行在0环
指的就是它运行在最高的这个特权级别 它可以使用最高特权的一些指令
把指令划分为更多的特权级别是有好处的 比如像刚才我们说
如果指令指分为非特权指令和特权指令 那么任何一条特权指令的这个使用
都需要虚拟及管理程序把它截获 并且判断这条特权指定的使用是否合法
如果合法的话 还需要由它来模拟出特权指令执行的一个效果 但是如果我们对指令的这个特权级进行更精细化的
一个分类让第一类的虚拟程序运行在最高特权级Ring 0
我们把这个最高的特权级别称为0环 然后让这个客户操作系统的内核运行在一环
次高特权级 接下来让用户进程运行在二环叫最低的特权级
那进行了这样的划分就可以保证当上层的客户操作系统 它使用二环一环的这些
指令的时候 我这个虚拟机管理程序不用管 直接让你执行就行了
除非你需要使用到少数的一些0环的指令 我才帮你检查这些灵环的指令应不应该让你执行 会不会导致不安全等等
这就相当于我们把原本的特权指令进一步的进行了细分 把特权指令当中的一些敏感指令
放在灵环 然后把一些不敏感的指令放在一环 这样的话 虚拟及管理程序不用检查每一条特权指令的执行
只需要检查某一些敏感指令的执行就可以了 所以在第一类的虚拟机管理程序当中
只有虚拟机管理程序是运行在最高特权级的 上层的操作系统运行在次高优先级
好 再来看第二类的虚拟机管理程序 第二类虚拟机管理程序一部分运行在用户台
一部分运行在内核态 在内核态的这个部分是以虚拟机
驱动程序的方式加载到操作系统内核当中的 那当上层的这个应用程序
发出系统调用 比如说要系统调用的时候上层的这个操作系统
他可以直接去读写磁盘吗 显然不可以 所以
用户进程的系统调用会被虚拟机管理程序截获 然后由虚拟机管理程序
进行一些处理代替他向底层的这个速主操作系统发出系统调用
来请求底层宿主操作系统的服务好 所以无论怎么看 第二类的虚拟机管理程序 它的性能肯定都会更差一些
这个速主操作系统 它总是要作为一个工具人 作为一个中介来被使用好的 那么这就是第一张的最后一个考点虚拟机
而且不负责任的预测一下 他肯定会考第一类虚拟机管理程序和第二类虚拟机管理程序的一个区别
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习