如果我使用的是Oracle的virtualbox,並且我將多個虛擬內核分配給虛擬機,那麼實際內核的分配情況如何?它是使用虛擬機中的兩個真實核心,還是使用模擬核心的東西?,當您分配多個虛擬內核時會發生什麼?
回答
你的問題幾乎就像問:操作系統如何確定運行給定進程/線程的內核?您的計算機始終在做這種類型的決定 - 它有更多的進程/線程正在運行,而不是您有可用的內核。這個具體的答案在本質上是相似的,但也取決於來賓機的配置方式以及您的硬件對加速虛擬化過程的支持程度 - 所以這個答案當然不是確定性的,我不會真正瞭解主機如何調度代碼但是讓我們來看看兩個相對簡單的例子:
第一個將是一個完全虛擬化的機器 - 這將是一個沒有啓用或啓用最小加速的機器。呈現給客戶端的硬件是完全虛擬化的,即使許多CPU指令直接通過並直接在CPU上執行。在這種情況下,您的虛擬機虛擬機的行爲與主機上運行的任何進程大致相同:CPU資源由操作系統調度(爲了清楚,在這種情況下爲主機),並且可以運行進程/線程在任何核心他們被允許。默認情況下通常是任何可用的內核,儘管可能存在一些優化以嘗試並保持同一內核上的進程,以允許L1/L2緩存更有效並最小化上下文切換。通常情況下,在這種情況下,只有一個CPU分配給來賓操作系統,這大致會轉化爲主機上運行的單個進程。
在稍微複雜的情況下,虛擬機配置了所有可用的CPU虛擬化加速選項。在Intel說這些被稱爲VT-x的AMD是AMD-V。這些主要支持特權指令,通常需要一些二進制翻譯/陷印來保護主機和客戶機。因此,主機操作系統失去一點可見性。包括硬件加速的MMU支持(例如,可以直接訪問內存頁表,而不會被虛擬化軟件遮蓋) - 並且可見性會下降一點。最終,它仍然在很大程度上表現爲第一個例子:它是一個在主機上運行的進程,並且相應地進行調度 - 只是您可以考慮爲每個虛擬CPU分配一個線程來運行指令(或將它們傳遞給它們)。
值得注意的是,儘管您可以(通過正確的硬件支持)爲guest虛擬機分配的虛擬內核數量比可用的多,但這不是一個好主意。通常這會導致性能下降,因爲guest虛擬機可能會崩潰CPU,並且無法正確調度正在請求的資源 - 即使CPU沒有完全納稅。我將它作爲一個場景與一個多線程程序共享某些相似之處,該程序產生的線程遠多於(實際上處於繁忙狀態)比可用來運行它們的空閒CPU內核多。如果您使用較少的線程完成工作,您的表現通常會更差。
在極端情況下,VirtualBox甚至支持hot-plugging CPU資源 - 雖然只有少數操作系統能夠正確支持它:Windows 2008數據中心版和某些Linux內核。當一個訪客CPU內核被視爲主機邏輯內核上的進程/線程時,通常應用相同的規則,但是主機和硬件本身決定使用哪個邏輯內核作爲虛擬內核。
與所有他這樣說 - 你怎麼VirtualBox的實際上分配這些資源的問題......嗯,我還沒有通過代碼掘我當然不能明確回答,但它一直是我的經驗,這一般表現如上所述。如果你真的很好奇,你可以嘗試在任務管理器中標記VirtualBox VBoxSvc.exe和相關的進程,並選擇「Set Affinity」選項並將它們的執行限制在一個CPU上,看看是否符合這些設置。這可能取決於如果這些設置得到主機認可,那麼可用硬件幫助的級別有所提高,因爲guest可能並未真正作爲這些設置的一部分運行。
- 1. 當您指定的分區數量多於可用內核數量時,會發生什麼情況?
- 2. 進程啓動時分頁(虛擬內存)系統中會發生什麼?
- 3. 當內核代碼中斷時會發生什麼?
- 4. 當您產生activerecord對象時會發生什麼?
- 5. 當運行時JVM內存不足以分配時會發生什麼?
- 6. 爲什麼用malloc分配的虛擬內存沒有發佈?
- 7. 當您將兩個分支與子模塊合併時會發生什麼?
- 8. 當包含lambda的類型被分配時會發生什麼?
- 9. 當您爲同一個程序集多次調用Assembly.CreateInstance時會發生什麼?
- 10. 當你爲linux內核編寫一個路徑時會發生什麼
- 11. 如果您將值分配給$ _REQUEST,會發生什麼情況?
- 12. 當Android應用程序被破壞時SQLite虛擬表會發生什麼
- 13. 當您爲新創建的堆棧分配對象分配引用時會發生什麼?
- 14. 當您不在Flash中嵌入字體時會發生什麼?
- 15. 當您加入「或」或SQL時會發生什麼?
- 16. 當您返回View時應該是PartialView會發生什麼?
- 17. 在虛擬機中分配每個實例的CPU內核數
- 18. 當進程訪問剛分配給brk/sbrk的地址時,內核會發生什麼?
- 19. 當您在程序集中推送內存地址時會發生什麼?
- 20. 在多級繼承中派生的虛擬基類會發生什麼?
- 21. 當您聲明XNamespace並分配字符串值時發生了什麼?
- 22. 當java中有多個主要方法時會發生什麼?
- 23. 程序訪問內核空間時會發生什麼
- 24. 調用CUDA內核時會發生什麼?
- 25. 當我使用*(int *)&x分配一個常量值x時會發生什麼?
- 26. 當您在堆棧中請求更多空間時會發生什麼情況?
- 27. 生成器函數分配時會發生什麼?
- 28. 如果HAProxy集羣爲多臺計算機分配相同的虛擬IP,會發生什麼情況?
- 29. 當localStorage已滿時會發生什麼?
- 30. 當redis重載時會發生什麼?
你的問題很有趣。我在AMD x86_64處理器上使用VBox 4.0.4,我已經爲VM實例(Linux Red hat 64位)激活了兩個虛擬內核,但只有一個虛擬內核處於激活狀態,從文檔「VirtualBox最多可以爲每個虛擬機提供32個虛擬CPU 」。我會跟着這個問題。 – 2011-04-15 20:24:34