深刻浅出计算机组成原理学习笔记:第三十四讲

上世纪60年代,计算机仍是异常昂贵的设备,实际的计算机使用需求要面临两个挑战。服务器

第一,计算机特别昂贵,咱们要尽量地让计算机忙起来,一直不断地去处理一些计算任务。
第二,不少工程师想要用上计算机,可是没有能力本身花钱买一台,因此呢,咱们要让不少人能够共用一台计算机。网络

1、缘起分时系统

为了应对这两个问题,分时系统的计算机就应运而生了。
不管是我的用户,仍是一个小公司或者小机构,你都不须要花大价钱本身去买一台电脑。你只须要买一个输入输出的终端,就好像一套鼠标、键盘、显示器这样的设备,
而后经过电话线,连到放在大公司机房里面的计算机就行了。这台计算机,会自动给程序或任务分配计算时间。你只须要为你花费的“计算时间”和使用的电话线路付费就能够了架构

比方说,比尔·盖茨中学时候用的学校的计算机,就是GE的分时系统。微服务

 

2、从“黑色星期五”到公有云

一、美国的感恩节的黑色星期5、网络星期一和国内的双十一同样

现代公有云上的系统级虚拟机可以快速发展,其实和分时系统的设计思路是一脉相承的,这其实就是来自于电商巨头亚马逊大量富余的计算能力。工具

和国内有“双十一”同样,美国会有感恩节的“黑色星期五(Black Friday)”和“网络星期一(CyberMonday)”,这样一年一度的大型电商促销活动。几天的活动期间,
会有大量的用户进入亚马逊这样的网站,看商品、下订单、买东西。这个时候,整个亚马逊须要的服务器计算资源多是平时的数十倍。性能

二、一年的365天里,有360服务器资源是大量空闲的

因而,亚马逊会按照“黑色星期五”和“网络星期一”的用户访问量,来准备服务器资源。这个就带来了一个问题,那就是在一年的365天里,有360天这些服务器资源是大量空闲的。要知道,这个空闲的服务器数量不是一台两台,也不是几十几百台。根据媒体的估算,亚马逊的云服务器AWS在2014年就已经超过了150万台,到了2019年的今天,估计已经有超过千万台的服务器。优化

三、把这些空闲的服务器出租出去遇到的问题

平时有这么多闲着的服务器实在是太浪费了,因此,亚马逊就想把这些服务器给租出去。出租物理服务器固然是可行的,可是却不太容易自动化,也不太容易面向中小客户。网站

直接出租物理服务器,意味着亚马逊只能进行服务器的“整租”,这样大部分中小客户就不肯意了。为了节约数据中心的空间,亚马逊实际用的物理服务器,
大部分多半是强劲的高端8核乃至12核的服务器。想要租用这些服务器的中小公司,起步每每只须要1个CPU核心乃至更少资源的服务器。一次性要他们去租一整台
服务器,就好像刚毕业想要租个单间,结果你非要整租个别墅给他spa

这个“整租”的问题,还发生在“时间”层面。物理服务器里面装好的系统和应用,不租了而要再给其余人使用,就必须清空里面已经装好的程序和数据,得作一次“重装”。
若是咱们只是暂时不用这个服务器了,过一段时间又要租这个服务器,数据中心服务商就不得不先重装整个系统,而后租给别人。等别人不用了,再重装系统租给你,特别地麻烦。操作系统

四、出租服务器遇到问题的解决方案

其实,对于想要租用服务器的用户来讲,最好的体验不是租房子,而是住酒店。我住一天,我就付一天的钱。此次是全家出门,一次多定几间酒店房间就好啦。

而这样的需求,用虚拟机技术来实现,再好不过了。虚拟机技术,使得咱们能够在一台物理服务器上,同时运行多个虚拟服务器,而且能够动态去分配,每一个虚拟服务器占用的资源。

对于不运行的虚拟服务器,咱们也能够把这个虚拟服务器“关闭”。这个“关闭”了的服务器,就和一个被关掉的物理服务器同样,它不会再占用实际的服务器资源
可是,当咱们从新打开这个虚拟服务器的时候,里面的数据和应用都在,不须要

3、虚拟机的技术变迁

一、虚拟机

虚拟机(Virtual Machine)技术,其实就是指在现有硬件的操做系统上,可以 模拟一个计算机系统的技术。
而模拟一个计算机系统,最简单的办法,其实不能算是虚拟机技术,而是一个模拟器(Emulator)。

二、解释型虚拟机

要模拟一个计算机系统,最简单的办法,就是兼容这个计算机系统的指令集。咱们能够开发一个应用程序,跑在咱们的操做系统上。这个应用程序呢,
能够识别咱们想要模拟的、计算机系统的程序格式和指令,而后一条条去解释执行。

一、宿主机、模拟器、客户机

在这个过程当中,咱们把原先的操做系统叫做 宿主机(Host),把可以有能力去模拟指令执行的软件,叫做模拟器(Emulator),
而实际运行在模拟器上被“虚拟”出来的系统呢,咱们叫 客户机(Guest VM)。这个方式,其实和运行Java程序的Java虚拟机很像。
只不过,Java虚拟机运行的是Java本身定义发明的中间代码,而不是一个特定的计算机系统的指令。

这种解释执行另外一个系统的方式,有没有真实的应用案例呢?固然是有的,若是你是一个Android开发人员,你在开发机上跑的Android模拟器,
其实就是这种方式。若是你喜欢玩一些老游戏,能够注意研究一下,不少能在Windows下运行的游戏机模拟器,用的也是相似的方式。

二、模拟的系统能够跨硬件

这种解释执行方式的最大的优点就是,模拟的系统能够跨硬件。好比,Android手机用的CPU是ARM的,而咱们的开发机用的是Intel X86的,两边的CPU指令集都不同,
可是同样能够正常运行。若是你想玩的街机游戏,里面的硬件早就已经停产了,那你天然只能选择MAME这样的模拟器。

 

三、模拟系统存在的缺陷

第一个是,咱们作不到精确的“模拟”。不少的老旧的硬件的程序运行,要依赖特定的电路乃至电路特有的时钟频率,想要经过软件达到100%模拟是很难作到的。
第二个缺陷就更麻烦了,那就是这种解释执行的方式,性能实在太差了。由于咱们并非直接把指令交给CPU去执行的,而是要通过各类解释和翻译工做。

因此,虽然模拟器这样的形式有它的实际用途。甚至为了解决性能问题,也有相似于Java当中的JIT这样的“编译优化”的办法,把原本解释执行的指令,编译成Host能够直接运行的指令。可是,这个性能仍是不能让人满意。毕竟,咱们原本是想要把空余的计算资源租用出去的。

若是咱们空出来的计算能力算是个大平层,结果通过模拟器以后可以租出去的计算能力就变成了一个格子间,那咱们就划不来了。

4、Type-1和Type-2:虚拟机的性能提高

一、咱们须要一个全虚拟话的技术

因此,咱们但愿咱们的虚拟化技术,可以克服上面的模拟器方式的两个缺陷。同时,咱们能够放弃掉模拟器方式能作到的跨硬件平台的这个能力。
由于毕竟对于咱们想要作的云服务里的“服务器租赁”业务来讲,中小客户想要租的也是一个x86的服务器。而另一方面,他们但愿这个租用的服务器用起来,
和直接买一台或者租一台物理服务器没有区别。做为出租方的咱们,也但愿服务器不要由于用了虚拟化技术,而在中间损耗掉太多的性能。

因此,首先咱们须要一个“全虚拟化”的技术,也就是说,咱们能够在现有的物理服务器的硬件和操做系统上,去跑一个完整的、不须要作任何修改的客户机操做系统(Guest OS)。那么,咱们怎么在一个操做系统上,再去跑多个完整的操做系统呢?答案就是,咱们本身作软件开发中很经常使用的一个解决方案,就是加入一个中间层。
在虚拟机技术里面,这个中间层就叫做 虚拟机监视器,英文叫VMM(Virtual MachineManager)或者Hypervisor。

 

若是说咱们宿主机的OS是房东的话,这个虚拟机监视器呢,就好像一个二房东。咱们运行的虚拟机,都不是直接和房东打交道,而是要和这个二房东打交道。
咱们跑在上面的虚拟机呢,会把整个的硬件特征都映射到虚拟机环境里,这包括整个完整的CPU指令集、I/O操做、中断等等。
既然要经过虚拟机监视器这个二房东,咱们实际的指令是怎么落到硬件上去实际执行的呢?这里有两种办法,也就是Type-1和Type-2这两种类型的虚拟机。

二、Type-2型虚拟机

咱们先来看Type-2类型的虚拟机。在Type-2虚拟机里,咱们上面说的虚拟机监视器好像一个运行在操做系统都发送给虚拟机监视器。
而虚拟机监视器,又会把这些指令再交给宿主机的操做系统去执行

 

 

那这时候你就会问了,这和上面的模拟器看起来没有那么大分别啊?看起来,咱们只是把在模拟器里的指令翻译工做,挪到了虚拟机监视器里。
没错,Type-2型的虚拟机,更可能是用在咱们平常的我的电脑里,而不是用在数据中内心。

三、Type-1型的虚拟机

在数据中内心面用的虚拟机,咱们一般叫做Type-1型的虚拟机。这个时候,客户机的指令交给虚拟机监视器以后呢,再也不须要经过宿主机的操做系统,才能调用硬件,
而是能够直接由虚拟机监视器去调用硬件。

另外,在数据中内心面,咱们并不须要在Intel x86上面去跑一个ARM的程序,而是直接在x86上虚拟一个x86硬件的计算机和操做系统。因此,
咱们的指令不须要作什么翻译工做,能够直接往下传递执行就行了,因此指令的执行效率也会很高。

 

因此,在Type-1型的虚拟机里,咱们的虚拟机监视器其实并非一个操做系统之上的应用层程序,而是一个嵌入在操做系统内核里面的一部分。
不管是KVM、XEN仍是微软自家的Hyper-V,其实都是系统级的程序。

由于虚拟机监视器须要直接和硬件打交道,因此它也须要包含可以直接操做硬件的驱动程序。因此Type-1的虚拟机监视器更大一些,同时兼容性也不能像Type-2型那么好。
不过,由于它通常都是部署在咱们的数据中内心面,硬件彻底是统一可控的,这倒不是一个问题了。

5、Docker:新时代的最佳选择?

虽然,Type-1型的虚拟机看起来已经没有什么硬件损耗。可是,这里面仍是有一个浪费的资源。在咱们实际的物理机上,咱们可能同时运行了多个的虚拟机,
而这每个虚拟机,都运行了一个属于本身的单独的操做系统。

一、能不能少运行一个操做系统?

多运行一个操做系统,意味着咱们要多消耗一些资源在CPU、内存乃至磁盘空间上。那咱们能不能不要多运行的这个操做系统呢?

实际上是能够的。由于咱们想要的未必是一个完整的、独立的、全虚拟化的虚拟机。咱们不少时候想要租用的不是“独立服务器”,而是独立的计算资源。
在服务器领域,咱们开发的程序都是跑在Linux上的。其实咱们并不须要一个独立的操做系统,只要一个可以进行资源和环境隔离的“独立空间”就行了。
那么,可以知足这个需求的解决方案,就是过去几年特别火热的Docker技术。使用Docker来搭建微服务,能够说是过去两年大型互联网公司的必经之路了。

 

二、资源隔离技术

在实践的服务器端的开发中,虽然咱们的应用环境须要各类各样不一样的依赖,多是不一样的PHP或者Python的版本,多是操做系统里面不一样的系统库,可是一般来讲,
咱们其实都是跑在Linux内核上的。经过Docker,咱们再也不须要在操做系统上再跑一个操做系统,而只须要经过容器编排工具,好比Kubernetes或者Docker Swarm,
可以进行各个应用之间的环境和资源隔离就行了。

这种隔离资源的方式呢,也有人称之为“操做系统级虚拟机”,好和上面的全虚拟化虚拟机对应起来。不过严格来讲,Docker
并不能算是一种虚拟机技术,而只能算是一种资源隔离的技术而已。

 6、总结延伸

这一讲,我从最古老的分时系统讲起,介绍了虚拟机的相关技术。咱们如今的云服务平台上,你可以租到的服务器其实都是虚拟机,而不是物理机。
而正是虚拟机技术的出现,使得整个云服务生态得以出现。

虚拟机是模拟一个计算机系统的技术,而其中最简单的办法叫模拟器。咱们平常在PC上进行Android开发,其实就是在使用这样的模拟器技术。
不过模拟器技术在性能上实在不行,因此咱们才有了虚拟化这样的技术。

在宿主机的操做系统上,运行一个虚拟机监视器,而后再在虚拟机监视器上运行客户机的操做系统,这就是现代的虚拟化技术。
这里的虚拟化技术能够分红Type-1和Type-2这两种类型。

Type-1类型的虚拟化机,实际的指令不须要再经过宿主机的操做系统,而能够直接经过虚拟机监视器访问硬件,因此性能比Type-2要好。而Type-2类型的虚拟机,
全部的指令须要经历客户机操做系统、虚拟机监视器、宿主机操做系统,因此性能上要慢上很多。不过由于经历了宿主机操做系统的一次“翻译”过程,它的
硬件兼容性每每会更好一些。

今天,即便是Type-1型的虚拟机技术,咱们也会以为有一些性能浪费。咱们经常在同一个物理机上,跑上8个、10个的虚拟机。并且这些虚拟机的操做系统,其实都是同一个Linux Kernel的版本。因而,轻量级的Docker技术就进入了咱们的视野。Docker也被不少人称之为“操做系统级”的虚拟机技术。不过Docker并无再单独运行一个客户机的操做系统,而是直接运行在宿主机操做系统的内核之上。因此,Docker也是如今流行的微服务架构底层的基础设施。

相关文章
相关标签/搜索