硬體虛擬化的原理是什麼?

硬體虛擬化, 也就是你開啟虛擬機之後, 是虛擬機直接對接底層硬體的嗎?
這個問題是我在使用VirtualBox時的困惑, 我的CPU是Core i7-3537U 只有雙核四線程, 卻可以同時開7-8台虛擬機, 而且電腦不卡//沒有更多了, 但估計還能接著開

既然線程數量少於虛擬機分配CPU數量, 這個虛擬化在底層是如何實現的?

題主上圖: 圖為7台虛擬機開機的圖片, 其中一台還分配了雙CPU


你的CPU只有4個線程,不還是可以同時運行一大堆應用么。比如一邊看網頁,一邊聽音樂,一邊敲代碼,一邊編譯,等。

這在本質上和overcommit你的CPU來跑虛擬機沒什麼區別,就是個時分復用,由host OS的scheduler來調度各個線程/vCPU。因為你大多數的vCPU都是處於idle的狀態,於是它們本質上並不會佔用你的物理線程。你可以試試讓所有的虛擬機同時運行CPU bound的application來感受一下。


虛擬化:把一套硬體,通過一定的方式(開始是軟體的方式)模擬成多套硬體,給不同的系統使用。
硬體虛擬化:讓硬體來幫助虛擬化軟體,實現一部份虛擬化的功能,用來加速虛擬化操作。

不恰當,但是好理解的例子:有一台印表機,它連接在一部電腦上。只有這一部電腦才能使用它。為了讓不同電腦都能用上它,我們在這電腦上配置共享印表機的功能,就好比是軟體虛擬化。之後,印表機自己進化成網路介面,直接就可以面向不同電腦同時服務,這就成了硬體虛擬化。

實際的一個例子:網卡虛擬化。服務器的一個網卡,用軟體虛擬化的時候,有一個軟體組件,把這塊網卡與大量虛擬網卡連接在一起,組成一個虛擬的交換機網路。而支持硬體虛擬化的網卡,則可以以硬體映射的方式,把一塊網卡物理的映射給多台虛擬服務器,這個過程完成後,就不需要軟體中轉數據。


沒有虛擬化的時候,操作系統線程數量多於CPU的線程數你也沒有覺得奇怪啊,本質上還是時分復用,同一時刻同時運行的線程數肯定不會超過CPU的線程數。

VirtualBox細節沒看過,但是KVM我知道,虛擬機的VCPU對Host來說,就是一個線程,你開多個虛擬機,有多個VCPU,跟你在操作系統下開很多程序沒本質差別。

至於虛擬化底層怎麼處理的,你需要去看看CPU虛擬化和內存虛擬化的東西。
虛擬化技術原理與實現


虛擬化是有代價的,硬體虛擬化的意義在於:CPU通過特殊的指令和物理設計來減小這個代價。

比如說,過去內存管理是操作系統完成的,但是現代CPU支持了硬體層面的內存管理,提供了各種模式供操作系統使用,這些模式提供了不同的物理內存和虛擬內存之間的映射方式,提供了頁式內存管理的分頁緩存機制,提供了硬體層面的TLB加速分頁機制下的內管理操作。這些離不開操作系統的使用,但是因此,使用虛擬內存的操作系統就能獲得更好的性能。

虛擬化也是,支持硬體虛擬化的CPU,可以給會使用這一系列機制的虛擬機提供更好的性能。


每個虛擬機都是一個進程,你同時開8個程序會出現問題嗎,雖然其中一個程序還是雙線程


你可以看看6502虛擬機(紅白機)的實現,就會明白,虛擬機實現其實原理上很簡單,主要就是對cpu和內存的模擬,而cpu模擬,就是一堆if,每個指令的模擬都很簡單,比如add指令就簡單的用+就可以了,各種定址就是算個地址從一個buffer里讀個數據而已,內存的模擬就更簡單了,就一個數組就可以了,整個代碼量很小。虛擬器運行起來的效果是通過外設來體現的,主要是實現一個終端,這個也不難。好像還有其他實現虛擬的技術,沒有去了解,反正我自己覺得虛擬機並不神秘,就是一堆if+加一片數組的小程序。


硬體虛擬化是一個非常複雜的體系。intel的vt和amd的svm,都不是一兩句能說清楚的。簡單來說就是硬體層面支持虛擬化。
不過聽你的問題似乎不在於硬體虛擬化,而在於基本的操作系統和計算機知識。


推薦閱讀:

虛擬化承載層是什麼意思?
一個膽小怕事的人怎麼去做應用虛擬化軟體的銷售?

TAG:虛擬機 | 虛擬化 |