天天看點

作業系統哲學原理(20)多核原理-多核結構和記憶體

說明:該系類文章更多的是從從哲學視角看 作業系統 這門學科。同時也是 作業系統的學習筆記總結。因為部落客 這些年主要是以研究安卓系統和 嵌入式Linux為主,是以這個系類文章也是這兩個領域不可或缺的基石之一,尤其是對作業系統感興趣的夥伴可特别關注。

20 多核結構和記憶體

每一次CPU能力的提升帶來知識人們更大的貪欲,而且CPU的主頻達到4GHz以後很難再向上提升,這個時候唯一的辦法就是采取多核政策。

20.1 以量取勝

  • 多處理器:在一個體系結構上放置多個CPU。
  • 多核:在同一塊晶片(CPU)上放裡多個核(core),即執行單元。
  • 多處理器和多核的差別:多核結構更加緊湊.成本在同等執行單元數相同的情況下更便宜、功耗更低。為簡單起見,人們現在将多處理器和多核結構統稱為多核結構。
  • 多核計算機的出現,打破了單核環境下的許多作業系統設計的正确性或可靠性。(例如,我們在鎖的實作中以中斷啟用和禁止來實作鎖的做法,在多核環境下将不能工作;事實上本書前面兩大部分講述的程序和記憶體管理的許多政策和機制針對的均是單CPU或單核的環境:這些政策和機制在多核環境下要麼是不能正确運作,要麼是效率太低,當然也有可能是二者兼而有之;是以,為了适應多核環境所提出的新要求,也為了更好地利用多核技術提供的新友善,作業系統需要作出相應調整)

20.2 多核基本概念

多核的一些基本概念:

在x86體系結構下,多處理功能晶片經過了4個演變階段,如下所示:

  1. 對稱多處理器結構(SMP,Architecture)
  2. 超線程結構(Hyper Threading )
  3. 多核結構(Multi-core Architecture)
  4. 多核超線程結構(Multi-core Hyper Threading Architecture)

20.2.1 多處理器結構

多處理器結構:一條總線上挂載多個處理器。在傳統的體系裡,一台電腦隻有一個CPU;而在多處理器系統裡,一台電腦可以有多個CPU,如圖所示:

作業系統哲學原理(20)多核原理-多核結構和記憶體

在多CPU的情況下,以CPU之間的關系不同又可以分為對稱和非對稱多處理器結構。

  • 在對稱結構下,多個CPU的角色功能平等,沒有主從之分,這種多CPU結構稱為對稱多處理器結構(Symmeric Multi-Processor Architecture,簡稱SMP)
  • 在非對稱多處理器結構下,不同CPU的角色地位不同,有所謂的主從CPU之分,這種多CPU結構稱為非對稱多處理器結構(Asymmeric Multi-Processor Architecture,簡稱AMP)

當然現在SMP結構遠比AMP結構普遍。

20.2.2 超線程結構

多個CPU雖然提升了計算機的性能,但是付出的代價是高昂的成本和巨大的功耗。而在實際中,基于很多原因,CPU的執行單元并沒有被充分使用。如果CPU不能正常讀取資料(由于總線/記憶體的瓶頸),其執行單元使用率會明顯下降。目前大多數執行線程缺乏ILP(Instruction_Level_Parallelism,多種指令同時執行)支援。這些都造成了目前CPU的性能沒有得到全部的發揮。是以,Intel提出了超線程(Hyper_Threading)技術來讓一個CPU同時執行多個線程,進而提高CPU效率和使用者滿意度。

超線程技術是在一個CPU上同時執行的多個程式共同分享該CPU内的資源,理論上像兩個CPU在同一時間執行兩個線程,即可在同一時間裡,讓應用程式使用晶片的不同部分。超線程結構如圖所示:

作業系統哲學原理(20)多核原理-多核結構和記憶體

圖中的每個CPU并不是實體上的單個CPU,而是兩兩為一個獨立的CPU。即圖中隻有4個實體CPU,而每個CPU又因超線程技術被分解為兩個邏輯CPU。每個邏輯CPU可以執行一個線程式列。這樣一個實體CPU可以同時執行兩個線程。

注意:

  • 超線程技術的CPU還需要晶片組和軟體的支援,才能發揮其優勢。
  • 超線程的性能并不等同幹兩個CPU的性能(雖然采用超線程技術能同時執行兩個線程,但它并不像兩個真正的CPU那樣,每個CPU都具有獨立的資源。當兩個線程都同時需要某一個資源時,其中一個要暫時停止,并讓出資源,直到這些資源閑置後才能繼續)。

20.2.3 多核結構

為了克服多CPU和超線程的缺陷,即實作性能像多CPU,功耗像超線程的結構,這種結構就是多核結構。

多核結構:在一個CPU裡面布置兩個執行核,即兩套執行單元,如ALU、FPU和L2緩存等。而其他部分則兩個核共享(由于使用的是一個CPU,其功耗和單CPU一樣。由于布置了多個核,其指令級并行将是真正的并行,而不是超線程結構的半并行)。

當然,我們也可以在一台計算機裡面布置多個配有多個執行核的CPU,而形成更多的核。如圖所示為多核、多處理器結構:

作業系統哲學原理(20)多核原理-多核結構和記憶體

20.2.4 多核超線程結構

而在多核情況下,我們也可以将超線程技術予以使用,進而形成多核超線程(Multi-core_Hyper_Threading_Architecture)技術。即每個實體執行核裡面又分解為兩個或多個邏輯執行單元,如圖所示:

作業系統哲學原理(20)多核原理-多核結構和記憶體

20.3 多核的記憶體結構

由于一台計算機裡面有多個執行核,而每個執行核均需要對記憶體進行通路,那麼這種情況下記憶體在多個核之間配置設定的方式有以下幾種:UMA、NUMA、COMA、NORMA

20.3.1 UMA(Uniform Memory Access)

均勻記憶體通路(UMA):最簡單的記憶體共享方式就是将記憶體作為與執行核獨立的單元建構在核之外,所有的核通過同一總線對記憶體進行通路。由于每個核使用相同的方式通路記憶體,其到記憶體的延遲也相同。在這種模式下,最重要的是所有核的地位在記憶體面前平等。

  • 其優點是設計簡單,實作容易。
  • 缺點是大鍋飯,難以針對個體的程式進行通路優化,和擴充困難。因為随着執行核數的增加,對共享記憶體的競争将變得自熱化,進而造成系統效率急劇下降。

目前的對稱多處理器共享存儲系統基本上采用此種模式。這種模式隻能在處理器個數或執行核數從較少時方可使用。

20.3.2 NUMA(Non-Uniform Memory Access)

  • 如果我們想建構CPU數量很多的多處理器系統,或者欲建構執行核多于4個的多核系統,則UMA結構因記憶體共享瓶頸而不能勝任。在這種情況下,一種自然的選擇是使用多個分開的獨立共享記憶體,即NUMA模式:每個執行核或CPU到達不同共享記憶體的距離不同,通路延遲也不一樣。在這種模式下,最重要的特點是執行核在不同的記憶體單元面前地位并不平等:到近的記憶體具有優勢地位,而到遠的記憶體則屬于劣勢。
  • 在NUMA下,原則上應該将程式排程到離本地記憶體(程式存放的記憶體單元)近的執行核上,以提升程式的記憶體通路效率,進而提高程式的執行效率。NUMA結構的優點是靈活性高、擴充容易。在執行核的數最增加的時候,其通路記憶體的效率可以保持不下降(這種不下降的前提是優良的排程政策);否則,有可能因記憶體通路跟離遠而造成效率下降。是以,NUMA對排程的要求很高。但因為擴充容易,NUMA得到非常廣泛的應用。

20.3.3 COMA(Cache Only memory Access)

NUMA具有靈活、易擴充的優點,但對排程的要求高。如果不能或難以将程式排程到就近的執行核上,則需要新的機制:緩存。即在每個執行核裡面配置緩存,其執行需要的資料均由緩存得到滿足。這樣,不論資料原來是處于哪個記憶體單元,其對效率的影響均将不複存在。這種完全由緩沖滿足資料通路的模式稱為全緩存記憶體通路,即COMA模式。在這種模式下,每個執行核配備的緩存共同組成全局位址空間。

20.3.4 NORMA(Non-Cache Only memory Access)

  • NORMA模式:記憶體單元為每個執行核所私有,且每個執行核隻能通路自己的私有記憶體,對其他記憶體單元的通路通過消息傳遞進行。
  • 這種模式的優點是設計比NUMA還要簡單,但執行核之間的通信成本高昂。這已經有一點像網絡了。因為效率問題,此種模式在多核體系結構下使用甚少。

20.4 對稱多處理器計算機的啟動過程

對于對稱多處理器來講,執行流程如下:

所有的CPU裡面有一個被定為啟動處理器(Boot_strap_Processor,BSP)。而其他的處理器則作為應用處理器(Application_Processor,AP)。(到底哪個CPU是BSP則由某一特定寄存器的值來決定)

  • BSP首先讀取并執行BIOS(或EFI)的初始化(boot_strap)代碼(通常處于實體位址FFFF_FFF0_H)對自己進行初始化:
    • 設定進階可程式設計中斷控制器(Advanced_Pogrammable_Interrupt_Controller,APIC)環境;
    • 建立全局的資料結構;
    • 設定跳轉代碼(trampoline_codes);
    • 準備AP的運作環境;
  • 而AP則在上電/重新開機後進行一個簡單的自我設定後進入到等待啟動狀态。
  • 然後BSP通過發送程序間中斷來叫醒AP,對AP進行啟動并令其進行初始化。
  • AP在收到BSP發出的IPI啟動信号後将:
    • 執行BIOS/EFI裡面的AP初始化代碼或BSP準備的跳轉代碼。該跳轉代碼将初始化AP處理器;
    • AP再次進入到等待BSP中斷的狀态;
  •   而BSP則繼續執行BIOS/EFI的後續代碼,并負責啟動作業系統。

注意:SMP的BIOS與單核或單處理器裡的BIOS并不一樣。由于有多個處理器,SMP的BIOS裡面包括了多個處理器的規格和資訊,每個處理器的APIC描述表。而這些資訊包括諸如CPU的數量與編号、本地APIC資訊、I/O的APIC資訊、AP的初始化代碼等。

20.5 多處理器之間的通信

程序間的通信機制如下:管道、套接字、信号、信号量、消息隊列、共享記憶體等。參考這些機制,實作多CPU之間的通信的方式是發送中斷,詳細說明如下:

在多CPU之間通信,自然也可以發送信号。不過這個信号不是記憶體的一個對象,因為這樣的話,無法及時引起另外一個CPU的注意。而要引起其注意,需要發送的是中斷。

用來協調這些CPU之間中斷的機制就是所謂的進階可程式設計中斷控制器APIC,這是實作SMP功能必不可少的;且是Intel多處理規範的核心。在此種規範下,每個CPU内部必須内置APIC單元。CPU通過彼此發送中斷(所謂的IPI,處理器間中斷)來完成它們之間的通信。通過給中斷附加動作(action),不同的CPU可以在某種程度上彼此進行控制。

除了每個CPU自己本地的APIC外,所有CPU通常還共享一個I/O_APIC來處理由I/O裝置引起的中斷,這個I/O_APIC是安裝在主機闆上的。如圖所示:描述的是英特爾公司的Xeon多處理器結構下的本地APIC和I/O_APIC的結構示意圖。如下所示:

作業系統哲學原理(20)多核原理-多核結構和記憶體

除了處理處理器間及輸入輸出的中斷外,APIC也負責處理本地中斷源發出的中斷:如本地連接配接的FO裝置、時序中斷、性能監視計數器中斷、高溫中斷、内部錯誤中斷等。

20.6 SMP緩存一緻性

20.7 多處理器、超線程和多核的比較

  • 多處理器的共享實體資源最少,每個線程有自己單獨的處理器;成本最高、獨立性最高、功耗最大;
  • 超線程共亨最多,ALU、FPU、MSR、緩存等均為共享實體資源;獨享的資源有本地APIC、通用寄存器、LI緩存、CPUID等;成本、獨立性和功耗坡小;
  • 多核介于二者之間(包括成本),共享處理器,不共享ALU、FPU等;共享資源包括最後一級緩存,少部分寄存器等。而獨享的有CPUID、APIC、BIOS等。