很容易忘記的是,嵌入式Linux無法為所有嵌入式開發(fā)人員做任何事。雖然它適合于內(nèi)存和強大處理器很多的應用程序,但嵌入式Linux和類似操作系統(tǒng)的開銷對決定性和內(nèi)存消耗造成負面影響的使用案例越來越多。
細胞調(diào)制解調(diào)器、高性能視頻處理和復雜的汽車控制器只是在小型、低功率多核平臺上運行的對稱多處理(SMP)架構(gòu)下高度確定性應用的幾個例子。這些系統(tǒng)需要從底層操作系統(tǒng)獲得核心分配和任務安排支持,以滿足嚴格的實時要求,同時又不影響資源的使用。
嵌入式Linux對于資源受限平臺上的SMP來說并不是一個可行的選擇,而且很少有實時操作系統(tǒng)支持SMP。因此,開發(fā)人員必須創(chuàng)建自己的跨多個核心調(diào)度和管理任務的方法。
由于更多的嵌入式設備需要跨多個核心部署確定性工作負載,在RTOS級別上動態(tài)負載平衡的需求只會增加。
對稱多重處理與不對稱多重處理
SMP和不對稱多處理(AMP)是兩個或多個處理器一起工作以安排和運行工作負載的體系結(jié)構(gòu)模型。盡管SMP系統(tǒng)具有相同的核心,可以運行分配給他們的任何任務,但是AMP系統(tǒng)通常依靠一個主核心來根據(jù)可用性和優(yōu)先級來安排和分配任務。在AMP下,核心本身不需要是相同的類型或體系結(jié)構(gòu)(例如。,一個MPU可以與一個GPU一起工作),任務通常是針對核心類型的。
如果開發(fā)人員能夠依賴穩(wěn)定和可預測的環(huán)境,這樣操作系統(tǒng)就可以有效地分配工作負載,而不需要花費大量的開銷,那么AMP模型的工作效果最好。相比之下,對于在事件不斷變化且需要動態(tài)地將工作負載從核心轉(zhuǎn)移到核心的環(huán)境中運行的應用程序,SMP模型通常最有效。例如,許多手機都使用SMP,例如那些在ARM-A53平臺上實現(xiàn)細胞調(diào)制解調(diào)器功能的手機。
為了有效地跨多個核心分配應用線程,嵌入式軟件開發(fā)人員使用動態(tài)負載平衡技術(shù)。主要目標是確保應用程序在運行時在核心之間平均分配計算工作負載,并保證最高優(yōu)先級線程不會被較低優(yōu)先級線程取代。
動態(tài)負載平衡背后的原則
動態(tài)負載平衡中的"動態(tài)"是指在運行時對線程調(diào)度的連續(xù)評價,這使應用程序能夠適應不斷變化的任務需求和系統(tǒng)條件。動態(tài)負載平衡對于:
· 改進利用:通過在多個核心之間分配任務,開發(fā)人員可以充分利用每個核心的計算能力,提高整體系統(tǒng)利用率。
· 減少響應時間:適當?shù)呢撦d平衡確保將關鍵任務分配給最少爭用的核心,減少響應時間并提高任務執(zhí)行的可預測性。
· 容錯:負載平衡可以通過將任務重新分配到非故障核心,確保持續(xù)的系統(tǒng)功能,幫助減輕軟件故障和硬件故障的影響。
· 可伸縮性:隨著系統(tǒng)需求的增加和更多的核心被添加,均勻分配任務對于擴展容量是必不可少的,而不會引入瓶頸。
嵌入式Linux有負載平衡機制,但也有一個缺點:操作系統(tǒng)會帶來高昂的管理費用,這可能會對決定論產(chǎn)生顯著影響。由于大多數(shù)硬實時rtos不支持SMP體系結(jié)構(gòu)上的負載平衡,開發(fā)人員經(jīng)常求助于構(gòu)建自己的支持。這項努力本身也帶來了挑戰(zhàn):
· 資源使用:由于每個核心都有自己的緩存、寄存器和其他獨特的特性,開發(fā)人員必須投入時間來深入了解平臺,以便在沒有性能影響或資源爭奪的情況下有效地分配任務。
· 內(nèi)存訪問:如果開發(fā)人員將具有共同內(nèi)存池的任務分配給不同的核心,那么如果應用程序的控制和數(shù)據(jù)流沒有得到充分的說明,內(nèi)存訪問可能會出現(xiàn)爭用問題。
· 任務優(yōu)先級:開發(fā)人員必須了解所有任務的優(yōu)先級和最后期限,以確保分配足夠的資源和時間來避免延誤。
· 動態(tài)適應:由于負載平衡是一個適應系統(tǒng)條件變化的過程,開發(fā)人員必須實現(xiàn)某種反饋循環(huán)或控制機制,以便在運行時持續(xù)地重新評估線程分配和調(diào)整策略。
· 同步開銷:開發(fā)人員必須最大限度地減少核心之間任務切換所需的開銷,以減少延遲并維護系統(tǒng)的實時響應性。
實時操作系統(tǒng)層面的負載平衡
像?PX5 RTOS 這些設計用于基于多數(shù)據(jù)映射p的應用程序提供了內(nèi)置的負載平衡,可以滿足硬的實時決定性,與嵌入式Linux和其他操作系統(tǒng)相比,開銷要小得多。?本地POSIX線程API 而運行px5rtos所需的時間不到10kb,它是非??梢浦埠唾Y源高效的,并且使開發(fā)人員不必建立自己的負載平衡器。
這種固有的負載平衡器的工作方式與許多流行的負載平衡技術(shù)相同:
1. 給定任意數(shù)目的核心,rtos跟蹤每個核心上運行的線程。當一個核心變得自由,并且一個線程可以用于調(diào)度時,RTOS將安排線程在該核心上運行。
2. 如果沒有自由的內(nèi)核,而且一個新線程已經(jīng)準備好了,那么RTOS將使用該線程的優(yōu)先級進行調(diào)度:如果它的優(yōu)先級高于當前運行的任何其他線程,那么ros將安排新線程以預先選擇一個正在運行的線程。如果它的優(yōu)先級低于當前運行的任何線程的優(yōu)先級,那么RTOS將等待下一個可用的核心運行。
這種方法使用與嵌入式Linux相同的處理器親和力API,使開發(fā)人員很容易將線程分配給特定的核心,并依靠rtos來執(zhí)行這些任務。就像大多數(shù)rto一樣,開發(fā)人員必須確保共享資源的適當管理,以避免爭用問題。
不是所有的線索都是平等的
在一個典型的單核心、基于優(yōu)先級的先發(fā)制人的調(diào)度環(huán)境中,開發(fā)人員可以一次只依賴一個線程運行。在SMP環(huán)境中,這個條件無法保證,因為多個線程可以在任意數(shù)目的內(nèi)核上并行運行。為了避免這種行為對系統(tǒng)的潛在負面影響,即只需要在給定時間內(nèi)運行最高優(yōu)先級的線程,PX5RTOS允許開發(fā)人員配置只允許具有同等優(yōu)先級的線程在所有核心中并行運行的調(diào)度。這種方法強制執(zhí)行更嚴格的并行性,使開發(fā)人員對其系統(tǒng)的可預測性有更大的信心。
結(jié)論
實現(xiàn)動態(tài)負載平衡是開發(fā)人員在小型、低功率多核平臺上實現(xiàn)硬實時性能和響應所必需的。就像?PX5 RTOS 負載平衡功能支持隨時可用的應用程序線程與可用核心的動態(tài)配對,所有這些線程都在超小(小于10kb)、超便攜(帶有完全兼容的P線程API)和嚴格測試(100%c語句和每個發(fā)布的分支決策覆蓋)的包中。
RTO-固有負載平衡使開發(fā)人員能夠?qū)W⒂趹贸绦蜻壿嫼蜏y試,而不是不得不構(gòu)建自己的方法,在多個處理器之間分配工作負載。