博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019/07/17 虚拟化技术概述(01)
阅读量:3925 次
发布时间:2019-05-23

本文共 6421 字,大约阅读时间需要 21 分钟。

现代计算机体系结构,遵循冯诺依曼体系,一般而言,计算机有5大部件组成,

硬件部分,运算器,控制器都集成在cpu,都要经过电子通信线路传输给其他部件,运算器只要是把基于数据总线加载来的数据完成运算的,(cpu还有一级缓存,二级缓存,三级缓存,寄存器)一般而言,缓存的数字越大,造价越低,但是性能越差
RAM,随机访问存储器,random access memory,内存能把每一个存储单元都分配一个地址,基于地址的方式来进行访问的,32位的cpu最大寻址总线式宽度是32位,2的32次方,能够标识的最大存储地址范围 ,最小单位是字节,每一个数据是按位bits存储,但是对于内存存储器是以字节bytes最小存取单元,8bits
内存是易失性的存储,其内部无法长久保存
需要辅助的外部输入输出设备,cpu必须能够标识出IO设备,才能进行交互,因此每一个IO设备都应该有他的地址,IO设备有所谓的IO端口,空间是平面的,IO端口是0-65535,每个IO设备在计算机内部都需要标识,而后cpu与他通过固定地址进行交互

现在传统计算机内部有三种总线,控制总线,数据总线,地址总线(用来寻址)RAM有控制器,当cpu每一次都需要访问RAM中的某一个固定单元时,CPU就基于总线向RAM控制器发出存取信号,RAM控制器根据对方发来的地址信号来判定接下来,应该访问哪个存储单元,这种交互速度非常块,一般是以内存工作频率进行工作的,但是取决于你cpu的前端总线,后端总线等等各种总线交换的速率

在这里插入图片描述
计算机的5大核心部件是运算器,控制器,存储器,输入设备,输出设备,
服务器用到IO设备除了存储器用的最多,还有网络
如果不考虑并行运算,cpu只有单核,意味着硬件资源只有一组,在某一时刻运行的时候,就类似你的大脑,也只能是一个,但是现代的操作系统似乎能够同时执行多个进程,
这就是因为中间有操作系统存在,操作系统就是计算机的虚拟机,操作系统的出现,可以使得一台计算机可以同时运行多个程序,操作系统把底层的单组计算资源给虚拟化了,cpu是如何被多个程序使用的,持续复用,将整个cpu,运算的能力按照基于时间流逝的能力划分成时间片,time slips ,把时间片分给不同的程序,假设每5毫秒一片,第一个5毫秒给第一个进程,第二个5毫秒给第二个进程,以此轮流进行分配,使得单个cpu能够被多个进程所使用,好在每个程序分配的时间片足够计算完成,所以才能造成并行运算的假象,其实进程还是串行的,如果考虑只有一个核心的话,
在这里插入图片描述
内存只是一个平面化的存储空间,放了一个程序就没办法放第二个,否则会重叠覆盖冲突的,但是正是操作系统的存在,使得这个现状发生了改变,分隔虚拟,内存是实现了空间复用的,把一个内存空间给切割成很多单独的离散存储空间,页框,每一个页框大概是4K存储空间,把页框分配给一个又一个进程,分配给进程以后,进程所拿到的就不是整个地址空间,
c语言之类的,写汇编是可以直接操纵内存地址的,
内存,在物理层面上,是分了一个又一个很小的空间页框,然后每一个进程节点,告诉这个进程,你有所有空间可用,每一个进程都独立拥有4G内存可用,跟其他进程无关,所以每一个进程起来以后就立即知道,假设自己有4G内存可用,调用系统内核,底端的1G是给操作系统内核,之后3G是给进程,所以成需要可以在3G空间力翻转腾挪随意分配,
程序员写的时候,到底分配哪个地址空间,这个是线性的,从0-2的32次方-1的空间,可以随意使用,但是不是真正 的,一个进程起来以后并不能把3G内存空间全部用到
既然用的空间很少,那么把它跟真正的物理空间对于起来即可,毕竟是虚拟的,需要有附着点才可以,数据存在物理内存的某个页框中,在自己的线性地址,连续三个页面page,真正可能存储在物理空间中的三个并不连续的地址空间中,
当一个进程需要访问自己的数据的时候,它得到的地址是,拿到的地址应该是线性空间的地址,,这样,物理地址到线性地址进行映射,每一个进程都会有一个映射表,为了内核完成这个功能,得为每个进程保存一个进程结构,里面记录了进程的ID,PPid父进程id,有一大段空间记录了进程从线性地址到物理空间的映射关系,
在这里插入图片描述
每一次当进程访问自己空间中的数据的时,内核查这个表,去找到真正的对应的物理空间中的数据,对于数据访问来讲,就多了一层地址转换的过程地址有2的32次方个 ,假如一个进程用来300M的内存空间,这里面的映射关系是很多的,条目很多的化,找起来非常慢
就需要分层,任何平面化东西,一旦大量的找起来麻烦的时候,就需要分层(1级目录,2级目录,3级目录),最终用2个子目录找到了映射结果,三次查询就能找到了
事实上内核也把内存分隔成了三段,第一段10位(总32位),第二段10位,第三段12位,一级子目录比如有1024个,2级子目录有1024个,12次方就是4096个,在4096个找和32次方里找,显然很简单
cpu上有一个专门的硬件单元,MmU来实现,内存管理单元,负责在一个进程运行时,直接把映射表,装入到MMU,在MMU完成硬件级快速转换,对于每一个进程而言,其内部的地址映射关系,从物理地址,到线性地址,的映射关系叫页表,page table
在这里插入图片描述这实际上是内存的过载使用,因为每个进程都假设自己有4G
对于linux来讲,最复杂的就是内存编号,内存按空间序列,序列是用两级方式来实现的,虚拟内存,称为空间复用
在这里插入图片描述
存储和网卡,多个程序要想使用,硬盘本身也是被虚拟化的,首先可以被分区,每一个区当一个设备,其次,文件系统实在硬盘之上附着的中间层,又一次把空间做了虚拟,能够实现所谓的按文件方式来存取,而不是按空间存取,文件系统本身就是把可利用的空格键,划割成很多的存取单元,而后让每一个需要存取的数据,拥有其中的一部分block,组织起来,就可以当作虚拟出来的单独的使用单位进行使用。

网卡,当前一台主机上如何让多个进程同时使用,网卡只有一个,是如何是实现连续报文发送供多个进程进行使用,持续复用,网卡只有一个,在某一刻只能像我们的交换机发一个电信号,

要想让多个进程都发送该如何,持续复用,网卡有队列,任何进程有报文需要发送,扔给网卡的队列,网卡从里面拿一个发一个,按先后次序,持续复用,网卡也是复用,被虚拟出来的,网卡发送信号是靠以太网网线中的线来实现的,
双绞线,一共4组,只有2组由用,每组只有一根有用,其他的是减少保留的,是减少通信时电信号干扰的,真正负责通信的只有两根线,一个接收,一个发送,所以网卡发信号的时候,只能是一个信号,最多只能一个报文,拿过来转换成物理电频信号,转换成010101发出
在这里插入图片描述
操作系统已经是一个虚拟机了,把有限的资源持续复用,就算是多核CPU,进程数量也是大于cpu核心数的,
虚拟化技术,要把从操作系统这里得到的资源,再一次分隔,(能否不让操作系统分隔有限资源)

虚拟化,vware work station,硬件之上有操作系统 ,操作系统有程序VMware Workstation等可以创建虚拟机,虚拟机上面也有操作系统,内核,有自己的配置和空间,能装操作系统就应该有具有操作系统的核心资源

也需要虚拟各种设备
在这里插入图片描述
底层有限的资源已经被操作系统虚拟过一次了,而后所谓的虚拟机软件程序,VMM,虚拟机管理器,能实现把有限的底层硬件资源,虚拟成硬件设备,并完成设备接口提供给再次安装的操作系统,虚拟机也需要完整的提供计算机5大部件(cpu,ram,io)
用软件给它实现一颗CPU,这个cpu拥有一颗真正cpu的接口,使得能够识别cpu
在这里插入图片描述
2级切割,首先内核将时间片切割以后分配给虚拟机,虚拟机内核拿到以后,虚拟机内部也需要一个进程,
切割以后拼成一个加的cpu的时间片,供虚拟机内部多个进程之间,分开使用
内存更麻烦。
内存本来就是两级结构虚拟的,每个进程都是虚拟的地址空间,这个虚拟地址空间被映射成物理地址空间中的存储空间工具,VMM本来就是个进程,启动虚拟机后,被分配了,一定意义上的内存空间,这个虚拟机拿到的内存空间,本来就是一个进程所拥有的线性地址空间,但是虚拟机又内核,要把这段空间当成真正的内存来使用,又是每一个进程都有虚拟
所以虚拟机中的内存在访问自己的地址时,这个地址被转换成物理地址(虚拟机进程的地址也是虚拟的),所以再一次被转换,即便有MMU转换,每一次转换也会很慢,cpu为了加速这个转换,还在cpu内部提供了一个缓存空间叫TLB,专门用来缓存这些转换的结果,转换后缓冲器,
虚拟机的内存中,每个进程应该有个页表,定义了从自己的线性地址到物理地址的映射关系,还需要一个页表,是虚拟机程序本身的进程,到真正意义上的物理地址的映射关系,还有一级页表
为了避免MMU转换太慢,就需要加速才可以,对它执行加速才可以,如果能把地址从虚拟机中的物理地址直接映射,不用中间,就需要外部的一个辅助关系 了,才能做到让虚拟机中进程的页表,或者地址,直接映射到真正意义上的物理地址上,
这个页表称为影子页表 shadow MMU 虚拟化技术
实现从虚拟机内部的进程地址到真正意义上的物理地址的直接映射,来加速的,,shadow MMU是靠软件来实现的,每一个进程都应该拥有,因此性能比较低下,
在这里插入图片描述
最麻烦的在于有多个虚拟机,每一个虚拟机内部都有进程,我们MMU的转换结果,是有缓存的,可以理解为从某个线性地址到物理地址的直接对应关系,
但是有多个虚拟机,第一个虚拟机,用的线性地址 ,1234,第二个可能也用到了 ,我们是否要转换成同样的物理地址,但是缓存是的确这么运作的,每一次cou运行一个虚拟机进程时,都需要把这个缓存进行情况,否则就会带来麻烦的,要想不麻烦就需要扩展功能,所以现代cpu在生产的时候,把内部的TLB多加了一项type(本来是的线性地址到物理地址的线性关系,但是无法标识哪个虚拟机),所以使得每个虚拟机都需要清空,所以在前面加一个字段,这个字段标识是哪一个虚拟机的,虚拟机iD
从此TLB就不叫TLB,而是TAGGED的TLB,因此以后不能清空了但是i早期的X86架构,都是新晋的平台,才拥有这些功能的,shadow MMU无论如何都是很低效的,因此后来的硬件级方面也都实现了,比如英特尔的CPU实现了扩展的页表,EPT而amd实现的是NPT
在这里插入图片描述
x86架构,没有充分考虑虚拟化,从一开始设计的时候,就没有考虑到虚拟化是什么,虚拟化不是什么新技术,IBM上个世纪60年代已经在用了

cpu是整个计算机最核心的部件 了,其内部的所有功能,都是我们提供指令来实现,cpu指令集,内部的指令有大类,

特权指令,可以直接操控计算机硬件的
普通指令,做运算,任何让都能使用
当作环,外层指令,环1,环0,进程所能使用的仅是环3 的,内核能使用的是环0的,环1 ,环2历史原因未使用,
内核把底层的特权指令封装成了系统调用,哪些进程能使用,哪些进程自己发送调用,内核代为运行这个代码,进程发送调用,内核来判断你是否权限调用
在这里插入图片描述
为什么要给虚拟机模拟cpu就是为了不让它认为直接去底层内核调用,但是环0总是需要模拟出一个假象的,
虚拟的cpu有两个功能,1.非特权指令当虚拟机直接跑在物理cpu的环3上
2.内核跑特权上,要跑模拟的cpu上,所以模拟的cpu是用来跑环0的,也能模拟环3
只模拟环0,这叫虚拟化,如果环3都模拟了,这叫模拟器
如果虚拟化,只模拟环0,也意味着你虚拟机跑的架构还是和底层架构一样,因为看不到环3 是一模一样的,如果环3 是模拟,本来真正的环3 ,x86的指令集,但模拟出的可能是ARM的指令集
因此虚拟化,指的是虚拟出来的架构,和底层真正的架构应该是一致的,只是不能让虚拟机控制环0上的指令而已,
但是模拟的,环0和环3全是假的,因为模拟出来的架构和底层的架构可以不一样,可以异构。
如果X86架构模拟出一个powerpc 架构来,性能就弱爆 了
在这里插入图片描述

早期的苹果maxos只能跑在powerpc的cpu架构上,所以没办法跑在x86系统之上,

即便只模拟环0也会很慢,系统调用也需要时间,cpu运行在内核空间就是要执行环0指令的,即便是模拟环0,用软件实现转换,性能的损耗还是挺严重的,于是硬件上实现,
所以现在cpu支持虚拟化,中间多了一环,环0内部的-1环,如果要支持硬件虚拟化,就要用-1环,真正物理系统宿主机上的cpu,宿主机内核运行在环-1上的,虚拟机内核运行在环0 上,愉快使用环0,但是环0是假的,但是调用硬件级某个指令时,就直接触发模式转换,从虚拟机模式转换成物理机模式,由物理机来完成后续操作,不用专门模拟器来模拟环0 了,
这叫cpu的硬件虚拟化
对英特尔和AMD,都有自己的虚拟化技术AMD 的叫AMD-V,intel叫 inter-VT,正是有硬件虚拟化,才使得技术可以良好运行,

**硬盘设备,如何虚拟化,本地回环设备模拟一个文件为硬盘,在内核级本来就支持回环设备,因此可以把文件模拟成磁盘来使用

对每一个虚拟机来讲,要想用一个硬盘,首先模拟出一块硬盘来,这个硬盘的芯片架构和真正的硬盘可以不一样,
比如模拟的sici,物理的是STAT,两个之前要来回调用,性能差,中间多了模拟层,使得两级驱动,而虚拟机驱动是几乎没有用的,白白转换,存不下来,还需要再转到底层物理硬盘
让虚拟机中的内核知道自己驱动的不是真正的硬盘,只需要把信号封装一下,发送出去即可,不用真正去驱动硬盘设备,
让内核知道运行在虚拟机中的,当作虚拟的来用,这叫半虚拟化
同样是虚拟化,这样性能就提升了很多了,可以想象成几乎能直接访问物理硬盘了 **
在这里插入图片描述

网卡,假如网卡只有一个,虚拟机如何与外部通信,对于网卡如何虚拟话,在物理机上网卡本来就是持续复用的,每一个进程要想发送报文,就发送到网卡队列里,

真正到网络层级,需要虚拟化的不仅是网卡还包含,网络本身,两个虚拟机想要实现内部通信,提供给每一个虚拟机一个网络接口,还需模拟出一个网络,
在这里插入图片描述
如果需要和物理机通信,在物理机上也用一个软件模拟出一个网卡来,让它也连接到模拟的交换机上,这就是vwmare的仅主机,还有一个dhcp进程提供地址,此时它们还不能和外部通信
在这里插入图片描述
想要与外部通信物理机有物理网卡,NAT,加一个SNAT规则即可,不需要复杂的地方
在这里插入图片描述
nat方式有一个特点,在所有的外部主机看来访问是物理网卡地址,回复是回复给物理网卡 的,假如内部虚拟机做了web服务,有人想要访问你的web服务器,服务发布端口,内部私网主机暴露出去,expose,性能不会太好
在这里插入图片描述因为性能不好,所以可以用到桥接, 把网卡当交换机来用,物理机虚拟出一台网卡来,关联在这个网卡上,并且把物理网卡的MAC地址剥夺过来,为虚拟网卡使用,每一个虚拟机也有一个虚拟网卡,连接到物理网卡上来,外部主机发来报文时,物理机和虚拟机,应该用着不同的mac地址才行,交换机就能把信息交换到不同的主机上去了,但事实上,并不会把网卡叫桥,而是把交换机做桥,(真正的网卡是桥,但是一般把叫虚拟出来的网卡叫做桥bridge)
在这里插入图片描述
**但是依然面对两级转换问题,1.虚拟机内部,要驱动网卡,要物理机驱动真正的网卡向外发送报文,两级发送,如何加速,告诉它,你就是虚拟的,不要做转换,直接扔给物理网卡即可 **

IO设备有两种虚拟方式,一种叫完全虚拟化,一种是半虚拟化,

还有第三种,其实性能更好,(硬盘多几个,一个虚拟机一个,网卡多几个,一个虚拟机一个)直接使用硬件,IO透传技术,不让物理机中间转换了,性能提升很多(也有坏处,因为将来真正跑虚拟机的时候,是很多的物理机,使用透传技术,万一物理机挂了,另外的虚拟机迁徙过去,没有硬盘没有网卡就不能使用了)
在这里插入图片描述

主机虚拟化,

转载地址:http://edkgn.baihongyu.com/

你可能感兴趣的文章
kill -15、kill -9 与 kill
查看>>
剑指 Offer 05. 替换空格
查看>>
剑指 Offer 06. 从尾到头打印链表
查看>>
模式9.建造者模式-Java
查看>>
模式11. 抽象工厂模式-Java
查看>>
模式10. 观察者模式-Java
查看>>
剑指 Offer 09. 用两个栈实现队列
查看>>
模式12.状态模式-Java
查看>>
Volatile-1.保证可见性
查看>>
Volatile-2.不保证原子性
查看>>
剑指 Offer 25. 合并两个排序的链表
查看>>
剑指 Offer 26. 树的子结构
查看>>
剑指 Offer 27. 二叉树的镜像
查看>>
剑指 Offer 29. 顺时针打印矩阵
查看>>
剑指 Offer 31. 栈的压入、弹出序列
查看>>
剑指 Offer 32 - III. 从上到下打印二叉树 III
查看>>
剑指 Offer 33. 二叉搜索树的后序遍历序列
查看>>
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
查看>>
剑指 Offer 68 - II. 二叉树的最近公共祖先
查看>>
剑指 Offer 18. 删除链表的节点
查看>>