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