日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

[ kvm ] 学习笔记 1:Linux 操作系统及虚拟化

發布時間:2024/1/8 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ kvm ] 学习笔记 1:Linux 操作系统及虚拟化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

一臺計算機是由一堆硬件設備組合而成,在硬件之上是操作系統,操作系統與計算機硬件密不可分,操作系統用來管理所有的硬件資源提供服務,各個硬件設備是通過 總線 進行連接起來的:

在操作系統之上,需要一個人機交互接口,我們才能使用計算機對其發送指令,這個人機交互接口就是 shell,如圖:

  

操作系統分為:

  (1)用戶態

  (2)內核態

?

用戶態和內核態都可以訪問 CPU ,只有當用戶態需要執行特權指令時,才進行 用戶態 - 內核態的切換。內核模式只是為了支撐用戶態為了完成某些操作的,操作系統能否產生生產力,通常是看程序是否在用戶態占據了大量時間,內核模式是不產生生產力的。例如:1 + 1 只需要用戶在 用戶態執行。

?

計算機五大部件:

  運算器、控制器 - CPU (MMU 內存控制單元) -? 內存分頁(memory page)

?  存儲器(Memory)

?  I/O設備(VGA、鍵盤、磁盤)

?

五大部件是通過總線連接:

?

?

2. CPU

CPU:從內存中取出指令并執行:

  取指單元 - 解碼單元 - 執行單元 需要三個時鐘周期

?

cpu 作為計算機大腦,它從內存中取出指令并執行。在每個 cpu 基本周期內,首先從內存中取出指令,解碼以確定其類型和操作數,在執行,然后再取指、解碼并執行。

每個 cpu 都有一套可執行的專門指令集。所以 x86 處理器不能運行 arm 程序,而 arm 處理器也不能執行 x86 程序。

?

如上圖,現在一般都是這種模式,其中有多個執行單元,例如:一個 CPU 用于布爾運算。兩個或更多指令被同時取出、解碼并裝入暫存區中,直至它們執行完畢。只要有一個執行單元空閑,就檢查保持緩沖區中是否還有可處理的指令,如果有,就把指令從緩沖區中移出并執行。

每個 CPU 中都有用來保存關鍵變量和臨時數據的存儲器,這些存儲器通常被稱為 CPU 的寄存器,指令計數器指令到下一個指令。操作系統必須清楚的明白每一個寄存器,進行上下文切換時,需要保存現場和還原現場。

保存和恢復現場都需要時間,現場是保存到內存中的, 上下文切換會花費大量時間。

?

CPU 主頻是 cpu 內部的數字時鐘信號頻率,又稱為 時鐘頻率(時鐘頻率:在 1 秒鐘內,所能完成操作的個數)

?

?

?

在這臺主機上, 主頻為:3.7GHz,意味著 一秒內可以產生 37億次脈沖頻率,所以說主頻越高的處理器,性能越強勁。但是由于 cpu 內部結構復雜,一般主頻越高產生的熱量也越高,而 cpu 主頻的提升到 4GHz 以上時,產生的熱量將會非常高,長時間高溫無法保證 cpu 將繼續穩定的工作,cpu 熱量越高會自動降頻,因此想要繼續提升 cpu 性能只能另尋他路,這就產生了 多核心、多線程的 CPU

?

多核心、超線程(多線程):

  一顆 cpu 在某時刻可以運行兩個線程,超線程模式;

  一個進程在執行時只能用到一個 cpu 線程,通過程序的多個線程將指令在不同的 cpu 上執行(并行編程);

  線程是共享進程所打開的文件描述符的,共享進程的所有資源。Linux 并非真正的線程操作系統,但是 Linux 的進程非常輕量級,每個線程在 Linux 內核看來仍然是一個進程。

?

當一個程序第一次在 1號 cpu 執行時,沒有執行完畢保存現場,第二次執行時,卻在 2 號 cpu 上執行,會造成緩存沒辦法命中的問題。內核為了保證 cpu 核心是被負載均衡使用的,哪個cpu核心空閑,就在哪個 cpu 上執行。

?

內核在管理 cpu 時,每個 cpu 都有 2 個執行進程的隊列,等待進程的隊列、過期隊列,當等待進程隊列執行完,在將兩個隊列反轉執行,避免復制,內核會定期將 cpu 隊列進行 rebalance ,但是會有一個問題,緩存命中的問題。

?

使用 cpu 親和性可以提高進程的緩存命中。

?

對稱多處理器:SMP

對稱多處理器結構(SMP,Symmetric Multi-Processor)

服務器最開始是單CPU,然后才進化到了雙 CPU 甚至多 CPU 的 SMP 架構。所謂 SMP 架構指的是 多路 CPU 無主次,共享內存、總線、操作系統等。此時每個 CPU 訪問內存任何地址所耗費的時間是相等的,所以也稱為 一致存儲器訪問結構。

?

大家共享同樣的內存,所以擴展能力有限,因為 cpu 數量增加了,內存訪問沖突也會增加。為了進一步提高 cpu? 數量的同時還能保證效率, NUMA 架構出現了, 將多個 SMP 進行松耦合。

?

非一致存儲訪問結構(NUMA, Non-Uniform Memory Access)

NUMA 架構中,多個 SMP 通過 Crossbar switch 交換矩陣進行互聯。

每個SMP有自己的內存,同時還可以訪問其他SMP 的內存,但是需要經過高速交換矩陣,很顯然 SMP? 訪問自己的內存速度非常高,但是訪問遠程 SMP 的內存還需要經過交換矩陣,延遲增加,可以看出NUMA 通過犧牲內存的訪問延遲來達到更高的擴展性。

總之,SMP與NUMA架構對軟件程序方面影響擴展性不大,一臺主機內都使用單一的操作系統。缺點是CPU數量增加,訪問遠端內存的時延也會增加,性能不能線性增加。此時MPP架構就出現了。

?

海量并行處理結構:(MPP,Massive Parallel Processing)

MPP說白了就是將多臺獨立的主機組成集群。顯然在此架構下,每個節點都有各自的CPU、內存、IO總線、操作系統,完全松耦合。最關鍵的是MPP集群中的軟件架構也相應的改變了,這樣MPP的效率隨節點數量增加就可以線性增加了。MPP,可以理解為刀片服務器,每個刀扇里的都是一臺獨立的smp架構服務器,且每個刀扇之間均有高性能的網絡設備進行交互,保證了smp服務器之間的數據傳輸性能。相比numa 來說更適合大規模的計算,唯一不足的是,當其中的smp 節點增多的情況下,與之對應的計算管理系統也需要相對應的提高。

?

SMP 和 NUMA 的區別:是否共享內存

SMP:

?

NUMA:

在NUMA架構下,如果通過上層軟件來使得程序盡量少的讀取遠端的內存,NUMA效率也會線性增加。但是實際上NUMA操作系統仍然是同一個,內存仍然是全局均勻的,所以訪問遠端內存是不可避免的。

?

MMP:
  將多個獨立的 smp 架構系統組成集群,每個節點都有獨立的 cpu、內存、IO總線、操作系統,完全松耦合。MMP 是通過節點高速互聯進行交互。

?

?

3. 內存

早期的計算機內存,只有物理內存,而且空間是極其有限的,每個應用或進程在使用內存時都得小心翼翼,不能覆蓋別的進程的內存區。

為了避免這些問題,就提出了虛擬內存的概念,其抽象了物理內存,相當于對物理內存進行了虛擬化,保證每個進程都被賦予一塊連續的,超大的(根據系統結構來定,32 位系統尋址空間為 2^32,64 位系統為 2^64)虛擬內存空間,進程可以毫無顧忌地使用內存,不用擔心申請內存會和別的進程沖突,因為底層有機制幫忙處理這種沖突,能夠將虛擬地址根據一個頁表映射成相應的物理地址。這種機制正是虛擬化軟件做的事,也就是 MMU 內存管理單元。

?

內存虛擬化也分為基于軟件的內存虛擬化和硬件輔助的內存虛擬化,其中,常用的基于軟件的內存虛擬化技術為 “影子頁表”技術,硬件輔助內存虛擬化技術為 Intel 的 EPT(Extend Page Table,擴展頁表)技術。

?

常規軟件內存虛擬化

虛擬機本質上是 Host 機上的一個進程,按理說應該可以使用 Host 機的虛擬地址空間,但由于在虛擬化模式下,虛擬機處于非Root模式,無法直接訪問Root 模式下的 Host 機上的內存。

這個時候就需要 VMM 的介入,VMM 需要 intercept (截獲)虛擬機的內存訪問指令,然后 virtualize(模擬)Host 上的內存,相當于 VMM 在虛擬機的虛擬地址空間和 Host 機的虛擬地址空間中間增加了一層,即虛擬機的物理地址空間,也可以看作是 Qemu 的虛擬地址空間(稍微有點繞,但記住一點,虛擬機是由 Qemu 模擬生成的就比較清楚了)。所以,內存軟件虛擬化的目標就是要將虛擬機的虛擬地址(Guest Virtual Address, GVA)轉化為 Host 的物理地址(Host Physical Address, HPA),中間要經過虛擬機的物理地址(Guest Physical Address, GPA)和 Host 虛擬地址(Host Virtual Address)的轉化,即:

  GVA -> GPA -> HVA -> HPA

其中前兩步由虛擬機的系統頁表完成,中間兩步由 VMM 定義的映射表(由數據結構 kvm_memory_slot 記錄)完成,它可以將連續的虛擬機物理地址映射成非連續的 Host 機虛擬地址,后面兩步則由 Host 機的系統頁表完成。如下圖所示。

?

?這樣做的目的有兩個:

  (1)提供給虛擬機一個從零開始的連續的物理內存空間;

  (2)在各虛擬機之間有效隔離、調度以及共享內存資源。

?

影子頁表技術

接上圖,我們可以看到傳統的內存虛擬化方式,虛機每次內存訪問都需要 VMM 介入,并由軟件進行多次地址轉換,其效率是非常低的。因此才有影子頁表技術和EPT技術。

影子頁表簡化了地址轉換的過程,實現了 Guest 虛擬地址空間到 Host物理地址空間的直接映射。要實現這樣的映射,必須為 Guest 的系統頁表設計一套對應的影子頁表,然后將影子頁表裝入 Host 的 MMU 中,這樣當 Guest 訪問 Host 內存時,就可以根據 MMU 中的影子頁表映射關系,完成 GVA 到 HPA 的直接映射。而維護這套影子頁表的工作則由 VMM 來完成。

由于 Guest 中的每個進程都有自己的虛擬地址空間,這就意味著 VMM 要為 Guest 中的每個進程頁表都維護一套對應的影子頁表,當 Guest 進程訪問內存時,才將該進程的影子頁表裝入 Host 的 MMU 中,完成地址轉換。

我們也看到,這種方式雖然減少了地址轉換的次數,但本質上還是純軟件實現的,效率還是不高,而且 VMM 承擔了太多影子頁表的維護工作,設計不好。為了改善這個問題,就提出了基于硬件的內存虛擬化方式,將這些繁瑣的工作都交給硬件來完成,從而大大提高了效率。

?

EPT 技術

這方面 Intel 和 AMD 走在了最前面,Intel 的 EPT 和 AMD 的 NPT 是硬件輔助內存虛擬化的代表,兩者在原理上類似,本文重點介紹一下 EPT 技術。

如下圖是 EPT 的基本原理圖示,EPT 在原有 CR3 頁表地址映射的基礎上,引入了 EPT 頁表來實現另一層映射,這樣,GVA->GPA->HPA 的兩次地址轉換都由硬件來完成。

這里舉一個小例子來說明整個地址轉換的過程。假設現在 Guest 中某個進程需要訪問內存,CPU 首先會訪問 Guest 中的 CR3 頁表來完成 GVA 到 GPA 的轉換,如果 GPA 不為空,則 CPU 接著通過 EPT 頁表來實現 GPA 到 HPA 的轉換(實際上,CPU 會首先查看硬件 EPT TLB 或者緩存,如果沒有對應的轉換,才會進一步查看 EPT 頁表),如果 HPA 為空呢,則 CPU 會拋出 EPT Violation 異常由 VMM 來處理。

如果 GPA 地址為空,即缺頁,則 CPU 產生缺頁異常,注意,這里,如果是軟件實現的方式,則會產生 VM-exit,但是硬件實現方式,并不會發生 VM-exit,而是按照一般的缺頁中斷處理,這種情況下,也就是交給 Guest 內核的中斷處理程序處理。

在中斷處理程序中會產生 EXIT_REASON_EPT_VIOLATION,Guest 退出,VMM 截獲到該異常后,分配物理地址并建立 GVA 到 HPA 的映射,并保存到 EPT 中,這樣在下次訪問的時候就可以完成從 GVA 到 HPA 的轉換了。

轉載于:https://www.cnblogs.com/hukey/p/11137285.html

總結

以上是生活随笔為你收集整理的[ kvm ] 学习笔记 1:Linux 操作系统及虚拟化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。