Linux 多重核心 MCU CPU 決策樹 SMP AMP VMM

利用決策樹判斷取捨 多核心軟體架構挑選更精準

2012-12-10
對於嵌入式系統(Embedded System)來說,無論是微控制器(MCU)或處理器,實現多重核心正是時候。從單一核心移轉至多重核心處理器的誘因,主要是源自於對於效能提升的需求、但又不願意耗費過多功耗所致。而軟體工程師就是要採取正確的做法來實現這件事。
第一步當然就是要能替應用選出正確的多重核心軟體架構。要獲得多重核心處理功能的助益有很幾種方式。而升級軟體時則多半從程式碼開始。因此,設計目標軟體時就要能找出符合升級需求的解決方案。影響多重核心升級有幾個因素。其中包括原始程式碼的起點(設計),以及升級的目標和限制等。每種方法都有自己的長處。

本文將探討多重核心的決策樹(圖1),以選出最適合特定應用需求的多重核心軟體架構。

決定採用SMP或AMP

第一個選擇就是要決定程式模型是要採用對稱式多重處理(Symmetric Multiprocessing, SMP)抑或非對稱式多重處理(Asymmetric Multiprocessing, AMP),請記住,應用程式是可分割以同時支援兩者。

如果僅須執行一種作業系統,那就選擇SMP,並將所有核心視為同等的處理資源,而能夠平行化的應用程式,就可以從SMP系統上獲益。SMP須進行應用程式分析,以便在程式碼中找出平行化的可能性,再改寫程式碼,透過多線緒來達成平行化的效果。對於需要強力中央處理器(CPU)的程式碼,就比較難改寫為以SMP和多線緒執行的平行化處理,這時選擇AMP解決方案可能較為理想。

AMP不須修正應用程式碼,就可以享受到多重核心的好處。AMP運用多重核心的方式,是在個別的分隔區內執行多個作業系統行程(Instances)和應用程式,每個分隔區都有專屬的核心、周邊及系統記憶體區域。如果某些核心需要提升安全等級,這種方式會更有益處。設備會被分派給核心,而輸入輸出(I/O)連結與安全應用則由MMU區隔,請注意,AMP須要能支援AMP的啟動程式(Boot Loader),而且要將硬體資源加以區隔,讓作業系統及應用程式可配置給這些分割區。作業系統本身必須是可以重新配置的,而且一定要能夠限制記憶體區域,並只在自己分配到的PCI裝置上運作。

決定作業系統架構

一旦選擇AMP,下一步就是決定要使用哪一種多重核心作業系統架構。無管理式AMP可在核心上執行多個作業系統。這種方式的優點是可在其中一個作業系統損毀時,還可讓系統保持運作。不過,在共用記憶體的單一處理器上分隔多個作業系統可能會導致問題。AMP的分隔方式可以解決SMP的延展性問題,但是只有在演算法已經恰當地平行化之後才有可能。這部分通常會留給系統整合人員去解決。

如果無管理式的AMP並不適合,那麼正如圖1所示,還有幾種管理式的AMP可供選擇。管理式的AMP主要有三種,都使用虛擬化技術。虛擬化提供軟體管理層,該層可在不同的分隔區之間提供軟體保護,以及核心管理,以便控制功率效益。CPU會以多個獨立分隔區的方式運作,每個分隔區執行自己的作業系統和應用程式。對於能夠運用多個各自獨立組件的應用程式,而CPU又不會彼此競爭共享資源時,這種方法就很合適。

圖1 抉擇多重核心軟體架構的決策樹

如果採用虛擬化分割多個作業系統,使其執行在虛擬機器內時,傳統軟體便不須變動。虛擬機器管理工具(Virtual Machine Manager, VMM)會負責管理配置及虛擬機器與平台資源之間的使用。在嵌入式系統裡,已經有幾種軟體技術可以達成虛擬化。

作業系統層級的虛擬化
  利用作業系統核心內的能力來啟用多個隔離行程的使用者空間。每個使用者空間行程都擁有自己隱密隔離的一組標準作業系統資源,而應用程式則是在這個隔離的容器內執行。Linux容器就是作業系統層級虛擬化的例子。容器通常運用在須要合併應用程式、沙盤模擬或是動態資源管理,而且所有牽涉到的軟體都是Linux應用程式,在容器裡無法啟動作業系統。

「Type 1」管理程序
  所謂Type 1的管理程序(Hypervisor),是直接執行在系統硬體上面,而非附屬於一般用途作業系統的Type 2 Hypervisor。這種Hypervisor非常小、效率亦佳,能夠安全地區隔系統資源。系統的CPU、記憶體及I/O裝置,全都是以靜態方式分隔,每個分隔區都可執行自己的附屬(Guest)作業系統。Hypervisor不使用排程器,僅僅以空間方式區隔CPU。

「Type 2」管理程序
  Type 2的Hypervisors必須寄居在作業系統上,作為虛擬層的基礎。虛擬機器執行時就如同作業系統上其他的應用程式。Type 2 Hypervisor的例子之一就是核心式虛擬機器(Kernel-based Virtual Machine, KVM)。KVM是一種開放程式碼的軟體虛擬化技術,同樣以Linux核心為基礎,且KVM只是以Linux作為虛擬機器的監控端。基本上KVM就是Linux的核心驅動程式,可以與QEMU的使用者空間(User Space)應用程式配合,以便創造與運作虛擬機器。

嵌入式系統中的虛擬化與分隔法,能夠從多重核心處理器中得到一些助益,但不需作業系統刻意支援。理想的做法是採用對稱式多重處理與非對稱式多重處理,包括虛擬化,再由你自己分配,這些主要的多重核心軟體組態摘要如圖2所示。

圖2 多重核心軟體的主要組態

控制面和資料面模型選定

若工程師順著決策樹中SMP的方向繼續走,接著就得決定SMP組態是要以「資料面」或是要以「控制面」為主。資料面組態比較注重吞吐量,如每秒的封包數目,而且通常需一套輕量型或即時式的作業系統,或是另一組輕量型的程式模型,以便處理資料面的吞吐量需求。

對於比較注重效能的應用,吞吐量至關緊要時,有一個在多重核心領域逐漸受到歡迎的方法,就是使用者空間應用程式的開發。其為一種Framework of Linux使用者空間驅動程式的架構,讓客戶可以自行研發高效能的解決方案(圖3)。它的高效能可以繞過Linux核心處理I/O,因此毋須動用系統呼叫。另一個優點就是讓應用軟體與核心分開,這樣可避免涉及GPL授權的爭議。

圖3 使用者空間應用程式與I/O

控制面/資料面所需作業系統不同

在大部分案例中,資料面處理並不須採用作業系統,因此通常毋須提供服務給使用者,也不需要透過特定的一組應用程式介面(API)限制存取底層硬體。此外,快速途徑處理並不需使用者直接介入,因為封包處理都是自動完成的。許多其他功能通常都由作業系統負責,像是程序管理(通常每個核心只有一項作業)、記憶體管理(採用預先配置緩衝)、檔案管理(根本沒有檔案系統),以及裝置管理(採用低階存取功能及API)。資料面的作業系統通常用來支援傳統程式碼,或是在需要時負責執行一些基本的排程,必要時應選擇一種簡單的、執行後即結束的模型,或是即時作業系統。

將多重核心應用分派給控制面層,並在作業系統的控制下執行很常見。這些應用通常不具備任何即時延遲性或是吞吐限制,因為僅須處理封包。控制面所需的大多數複雜處理,以及重新運用既有程式碼的需求,使得與作業系統的互動變成首要條件。Linux是最常用在控制面處理的作業系統,因為其具備對於SMP處理的支援。部分的改良包括調整核心支援檔案系統的方式、若干路由與裝置處理的最佳化、去除原本應該提升Linux在大型SMP架構系統效能的核心大鎖(Big Kernel Lock, BKL)、調節輸入輸出、改良功率管理、並升級CPU排程器。

決定所需的加速類型

處理封包時必須要有多重核心網路加速的協助。這是因為TCP/IP堆疊並非為配合多重核心系統運作而設計。大部分的網路封包處理協定都可以拆解成兩大途徑:無狀態途徑與有狀態途徑。其中,無狀態途徑又稱為資料途徑,需要迅速有效地交換/繞送封包,又可拆解為封包識別(分類)和轉送兩大部分。

圖4 系統CPU的週期配置
有狀態途徑,又稱為控制途徑,需要較多的處理,因此在本質上就會比資料途徑來得慢。有狀態控制途徑需要90%的程式碼,但僅需10%的時間執行。無狀態途徑則恰恰相反,它只需10%的程式碼,卻需要90%執行的時間(圖4)。

此外,快速途徑技術是用來加速10%的程式碼,以便讓無狀態途徑能提升封包處理的效能。特定應用快速途徑(Specific Fast Path, ASF)是一種軟體式的解決方案,會將僅需簡單決策就可處理的資料流存在暫存區內。ASF會辨識暫存區中的資料流,再以特殊方式處理封包(圖5)。

圖5 特定應用快速途徑

ASF可以加快網路裝置的資料吞吐量。軟體中的ASF則是以針對需要讓特定應用達到更高資料吞吐量而特製的資料途徑處理平台。ASF利用的硬體功能包括雜湊(Hashing)、查核值(Checksum)計算、加密、分類、排程等等,以便提升吞吐量。ASF的目標在於加快許多相關應用的處理速度。

圖6 以Linux做為即時作業系統
另一種替代的加速技術就是採用Linux做為即時作業系統(圖6)。所謂即時系統,是指運算正確性不僅要看運算邏輯的正確性,也要看結果產生的時間而定。如果無法滿足系統的時間限制,就算失敗。許多嵌入式系統現在都會同時在作業系統上進行即時和非即時的作業。

要設計出兼顧延遲時間短而又效能高超的系統相當困難。然而,在即時世界裡的系統,如多媒體、eNodeB等都有延遲時間及吞吐量的需求。舉例來說,eNodeB基地台就擁有1毫秒(ms)的嚴格即時處理極限,以便處理傳輸時間區隔(Transmission Time Interval, TTI),以及下載100Mbit/s及上傳50Mbit/s的吞吐量需求。這就必須將系統調節到適當的平衡,才能兼顧延遲時間與效能。

現在Linux已可透過簡單的核心組態提供軟體層級的即時效能,讓核心變成完全先占式。在標準的Linux核心當中,若使用者空間程序對核心發出系統呼叫,這是完全無法以先占式手法處理。亦即當低優先程度的程序發出系統呼叫時,高優先程度的程序必須等到該呼叫完成動作,才能再度使用CPU。Linux組態選項CONFIG_PREEMPT會改變這種核心動作模式,變成如果有高優先程度的作業存在時,即使程序正在處理系統呼叫,也要讓Linux的程序變為先占式多工。

RT-Linux同時也會讓系統變為先占式,包括更細緻的spin-locks,讓中斷處理器預定處理核心線緒,即使是高優先度作業處於使用者空間內,也可以隨時以先占方式超過低優先度作業。

在沿著多重核心決策樹一路前進之後,可得出一組代表結論的葉節點,可描述出用來實作高階多重核心系統軟體需求所需的參考軟體架構(順著決策樹路徑)。

本文已探討數種多重核心軟體架構部件,以便組成設計工程師所需的多重核心參考架構。事實上,可將這些架構部件視為建築零件或樂高積木,可以用各種方式加以組合,以產生出多重核心的軟體參考架構。這種方式能夠創造出具備延展性的解決方案,適應開發者對於各種多重核心解決方案的需求。

(本文作者為飛思卡爾網路系統事業群軟體研發主管)

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!