多核設計技術

系統設計和軟件開發面臨的多核挑戰

有效地利用多核技術,不僅會大大地改善下一代網絡環境的性能和可擴展性,還會對系統設計和軟件開發產生深遠的影響。目前,系統設計工程師和軟件工程師們非常熟悉針對單核CPU的編程環境,卻對多核計算一無所知,或者缺乏足夠的經驗技能。

圖1 典型的多核CPU結構

例如,多核芯片如何管理共享資源就是一大挑戰。在大多數情況下,多核CPU的內核擁有獨立的L1緩存,共享L2緩存、內存子系統、中斷子系統和外設(如圖1)。因此,系統設計師需要讓每個內核獨立訪問某種資源,並確保資源不會被其他內核上的應用程序爭搶。

多核的出現還讓系統設計變得更加複雜。如運行在不同內核上的應用爲了互相訪問、相互協作,需要進行一些獨特的設計,如高效的IPC(進程間通信,interprocess communication)機制、共享內存的數據結構和同步原語(synchronization primitives)。

程序代碼遷移(code migration)也是個問題。大多數系統廠商都在針對單核CPU架構的代碼庫上進行了大量投資。因而,這些公司需要有一個清晰的遷移策略,來使其代碼可以最大化地利用多核硬件資源。

針對多核設計的操作系統可能會大大減少解決上述挑戰所需的工作量,也可能增加另一些問題的複雜性。這全都取決於操作系統是如何支持多核芯片的多處理模式。多處理模式主要有以下三種:

•非對稱多處理(Asymmetric multiprocessing,AMP)——每個CPU內核運行一個獨立的操作系統或同一操作系統的獨立實例(instantiation)。

•對稱多處理(Symmetric multiprocessing,SMP)——一個操作系統的實例可以同時管理所有CPU內核,且應用並不綁定某一個內核。

•混合多處理(Bound multiprocessing,BMP)——一個操作系統的實例可以同時管理所有CPU內核,但每個應用被鎖定於某個指定的核心。
上述三種模式都有其各自的優點和缺點。每一個模式適合於解決某方面的特定問題,而且對操作系統的要求也各不相同。

非對稱多處理(Asymmetric multiprocessing,AMP)

非對稱多處理(AMP)給開發者提供了一個與傳統單核CPU系統相類似的運行環境,使得開發者已有的一系列經驗和知識可以繼續加以利用;同時,這也爲老程序的移植提供了相當大的便利性,AMP模式的運行機制使得開發者可以直接調控CPU內核運作情況;最重要的是,開發者可以使用標準的調試工具和技術來完成既定的設計。

AMP可以是同構的(homogeneous),也可以是異構的(heterogeneous)。前者是指所有內核運行同一種類型和版本的操作系統,後者則是指每個內核運行不同類型或版本的操作系統(比如一個內核運行QNX Neutrino RT,而另一個內核運行Linux)。

在同構環境中,開發人員只要選擇一個可提供分佈式編程模式的操作系統,就能最大化地利用多核,允許某個內核上的應用程序透明地與另一個內核上的應用/系統服務(如設備驅動、協議堆棧)進行通信,但不會有傳統IPC機制所造成的高CPU佔有率。

異構環境的要求有些不同。在這種環境下,開發人員要麼執行專有的通信協議,要麼選擇可供IPC共享相同架構(如基於IP)的兩個操作系統。爲了避免資源衝突,兩個操作系統還需要通過一個標準機制來訪問被共享的硬件。

圖2 使用同構AMP控制輸入和輸出流量

 

在如圖2所示的同構環境中,一個內核處理來自某硬件接口的輸入流量(ingress traffic),而另一個內核處理輸出流量(egress traffic)。由於這兩種流量彼此獨立,因此,兩內核之間無須進行通信或共享數據,操作系統也就不用提供內核間的IPC。但是,操作系統必須擁有足夠的效率來進行實時流量的管理。

圖3 使用同構AMP執行分佈式控制面板

 

圖3所示的則是另一個同構例子。在這種情況下,兩個內核基於分佈式控制面板(distributed control plane),每個內核要處理數據面板(data plane)的不同方面。爲了正確地控制數據面板,運行在不同內核上的應用程序之間必須相互協調。而爲了實行這種協調,操作系統需要提供足夠強大的IPC支持,比如擁有共享內存來存儲路由信息。

在圖4所示的異構環境中。一個內核運行控制面板(control plane),另一個內核處理所有的數據面板流量,並實時監控。在這種環境下,運行在兩個內核上的不同操作系統需要提供一致的IPC機制,以允許兩個內核可以高效的通信,抑或通過共享數據結構來實現。

圖4 基於異構AMP的控制面板和數據面板

實際上,在所有上述情況中,操作系統對易用的通信協議的支持都會大大地增強內核間的操作。特別是,基於分佈式編程的操作系統還能最大化地利用多核所具有的並行處理機制。

資源分配

使用AMP,應用開發人員就可以決定不同內核上的應用以何種方式共享硬件資源。通常情況下,資源分配是在系統啓動時靜態地實現的,包括物理內存分配、外設調用和中斷處理。當然,系統也可以動態地分配資源,但內核與內核之間的協調也會變得更加複雜。

在AMP系統中,一個進程(process)總是運行在同一個內核中,即使其他內核處於空閒狀態。結果會導致一個內核要麼沒有被充分利用,要麼被利用過度。爲了解決這個問題,系統會允許應用程序在內核間動態遷移。然而,這樣就需要對狀系統信息進行相當複雜的檢測。或者,當應用在內核間遷移的過程中,可能會導致服務中斷。還有,如果核心運行不同的操作系統,這種遷移是相當困難的。

爲了支持AMP,多核CPU必須執行一個抽象層(abstraction layer),以使得某種資源看起來是被每個內核所獨佔。目前一個較好的例子就是基於X86多核CPU的虛擬化概念。

對稱多處理(Symmetric multiprocessing,SMP)

在多核系統中分配資源是很困難的,特別是在多個軟件之間不知道對方正佔用哪些資源的情況下。SMP通過以下方法來解決這一問題:讓所有內核都運行同一個操作系統的拷貝。由於操作系統每時每刻都監控着系統的運行狀態,因此可以在多核之間分配資源,而無需應用開發人員的干預。另外,操作系統可以提供內嵌的標準化原語(primitives),如pthread_mutex_lock、pthread_mutex_unlock、pthread_spin_lock和pthread_spin_unlock,從而讓多個應用可以安全和容易地共享這些資源。

由於僅僅是運行操作系統的一個拷貝,SMP可以動態地向指定應用分配資源,從而提高硬件資源的利用率。另外也可以讓系統跟蹤工具完整地收集各種有價值的信息,如操作統計、多核芯片上的應用交互等,以幫助開發人員對應用進行優化和調試。比如,QNX Momentics開發套件中的system profiler可以實時跟蹤線程在內核與內核之間的遷移,跟蹤操作系統原語使用、計劃任務、應用間通信以及其他事件。由於開發人員使用標準的操作系統原語,而不是複雜的IPC機制,這也使得應用同步變得更加容易。

SMP上的操作系統提供上述功能而無須開發人員使用特別的API或編程語言。實際上,在高端SMP環境中,開發人員已經多年成功地使用了POSIX標準(特別是pthreads API),可以寫出能同時運行在單核CPU和多核CPU上的POSIX代碼。一些操作系統也允許在這兩類CPU上運行相同的二進制代碼。

兩個核心共享內存中的單一操作系統映像。在極少數情況下,兩個內核在試圖訪問操作系統資源時,會使用處理機間中斷(interprocessor interrupt)和自旋鎖(spinlock)來預防衝突。爲最大程度地減少延遲,微內核(microkernel )操作系統架構是最好的選擇,這種架構在kernel上實際花費的時間很少。

一個設計良好的SMP 操作系統允許多個應用線程協同地運行在任何一個內核上。這種協同性使得應用程序任何時候都可以利用芯片的整體計算能力。如果操作系統能提供適當的優先權和線程優先排序能力,就能幫助應用開發人員確保CPU爲最需要的應用服務。

圖5 基於SMP模式的控制面板

在圖5所示的控制面板中,SMP允許各種程序中的所有線程運行在任何一個內核上。比如,在CLI(命令行界面,command-line interface)進程運行的同時,路由應用程序也正在進行密集計算。

混合多處理(Bound multiprocessing,BMP)

由QNX倡導的BMP結合了SMP高級資源管理和AMP應用控制的混合功能。BMP跟SMP一樣具有透明資源管理功能,不同的是,可以讓開發人員將軟件任務鎖定在指定的內核上。而在SMP中,操作系統拷貝可以管理所有的系統資源,允許資源在應用程序間動態地分配和共享。

跟SMP相比,BMP帶來了幾大優勢。它允許共享同一個數據集(data set)的應用獨立地運行在同一個內核上,從而消除了SMP系統中會降低性能的快取置換(cache thrashing)。另外,由於一個應用中的所有執行線程可以運行在一個內核上,所以BMP可以提供比SMP更簡單的應用調試。BMP還可以讓爲單核環境編寫的傳統程序正確地運行在多核環境,即讓這些應用運行在某一個內核上。

在BMP系統中,鎖定於一個內核的應用無法利用其他內核,即使其他內核處於空閒狀態。這意味着,操作系統廠商可以提供工具來分析應用對CPU等資源的使用率,從而在內核之間分配應用來獲得最大的性能。如果操作系統還能支持動態改變所指定的CPU核心,那麼用戶就可以更自由的讓應用程序從一個核心轉到另一個,不必爲了要檢查、停止和重新啓動應用程序而擔心。

圖6所示的是運行在半雙工模式下的BMP 系統。在Core 0和Core 1核心上分別運行着多線程的接收/傳送進程。與SMP類似,操作系統完全清楚所有的內核在做什麼,可以完整地看到系統的操作信息和性能信息,這有助於減輕開發人員

圖6 BMP的半雙工模式

 

在圖7所示的控制面板/數據面板中。控制面板應用(CLI,操作、管理和維護,數據面板管理)運行在core 0上,而數據面板ingress和egress應用一起運行在core 1上。使用本地操作系統機制或同步受保護的共享內存結構,開發人員可以容易地實現進程間通信(IPC)。

圖7 基於BMP的控制面板和數據面板

作爲界於AMP和SMP之間的中間路線,BMP爲用戶提供了一種可行的遷移策略。這些用戶可能想向全SMP遷移,又擔心現有的代碼在真實的並行模式下無法正確運行。而在BMP中,用戶可以先將以前的代碼綁定在一個內核上以保證正確執行,然後逐漸向多核環境轉移。

通過把應用(或線程)綁定在指定的內核上,設計人員從而把潛在的並行問題控制在應用和線程層面。解決這些問題將允許應用完全並行地運行,因而最大化地發揮多核CPU帶來的強大性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章