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