深刻淺出計算機組成原理學習筆記:第三十四講

上世紀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也是如今流行的微服務架構底層的基礎設施。

相關文章
相關標籤/搜索