新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 有效利用RTOS編程概念支持先進(jìn)的多線(xiàn)程架構(gòu)

有效利用RTOS編程概念支持先進(jìn)的多線(xiàn)程架構(gòu)

作者: 時(shí)間:2017-06-04 來(lái)源:網(wǎng)絡(luò) 收藏

像MIPS技術(shù)公司最新的MIPS32 34K內(nèi)核這樣的架構(gòu)正吸引著越來(lái)越多的關(guān)注,這是因?yàn)檫@種架構(gòu)無(wú)需增加太多的芯片資源或功耗即可獲得可觀的性能增益。這種硬件的關(guān)鍵優(yōu)勢(shì)是,它能使用處理器在等待緩沖回填的空閑周期處理其它線(xiàn)程的指令。

使消費(fèi)類(lèi)設(shè)備應(yīng)用程序適應(yīng)環(huán)境的代價(jià)一般很小,因?yàn)榇蠖鄶?shù)程序已經(jīng)設(shè)計(jì)為成組的半獨(dú)立線(xiàn)程。應(yīng)用程序線(xiàn)程可以分配給處理器中用于處理單線(xiàn)程的專(zhuān)用硬件資源。多個(gè)線(xiàn)程可以被同時(shí)分配給這樣的硬件,并通過(guò)共享CPU周期獲得最大的效率。

嵌入式運(yùn)算面臨性能障礙

消費(fèi)類(lèi)設(shè)備和其它嵌入式計(jì)算產(chǎn)品的制造商正在增加Wi-Fi、VoIP、藍(lán)牙、視頻等各種新的功能,以往功能的增加都要靠大幅提升處理器的時(shí)鐘速度來(lái)實(shí)現(xiàn)。臺(tái)式機(jī)的時(shí)鐘速度目前已經(jīng)增加到3GHz以上,即使嵌入式設(shè)備也接近GHz級(jí)。

但在嵌入式應(yīng)用領(lǐng)域,這種方法很快就失去了可行性,因?yàn)榇蠖鄶?shù)設(shè)備的運(yùn)行收到功耗和資源的約束,這些都限制了處理器速度的進(jìn)一步提高。時(shí)鐘周期速度的提高將顯著地增大功耗,因此對(duì)越來(lái)越多的嵌入式設(shè)備來(lái)說(shuō)高周期速度將不大可行。另外,處理器速度的進(jìn)一步提高并不能帶來(lái)相應(yīng)的性能改善,因?yàn)榇鎯?chǔ)器性能的提高跟不上處理器速度提高的步伐,如上圖1所示。

處理器速度已經(jīng)比存儲(chǔ)器快很多,在許多應(yīng)用場(chǎng)合處理器有一半以上的時(shí)間在等待緩存行(cache line)回填數(shù)據(jù)。每當(dāng)緩存丟失(cache miss)或需要片外存儲(chǔ)器訪(fǎng)問(wèn)時(shí),處理器就需要從存儲(chǔ)器加載緩存行,將這些字寫(xiě)進(jìn)緩存,再將舊的緩存行寫(xiě)進(jìn)存儲(chǔ)器,最后恢復(fù)線(xiàn)程。

MIPS公司指出,每千條指令接受25次緩存丟失(對(duì)多媒體代碼來(lái)說(shuō)是一個(gè)合理的值)的高端可綜合內(nèi)核如果必須等待50個(gè)緩存填充周期,那么將有50%以上的時(shí)間處于停止?fàn)顟B(tài)。由于處理器速度仍在不斷提高,而且比存儲(chǔ)器速度的提高幅度大得多,這類(lèi)問(wèn)題將變得越來(lái)越突出。

本文引用地址:http://butianyuan.cn/article/201706/348601.htm


圖1:處理器速度超過(guò)存儲(chǔ)器。

多線(xiàn)程技術(shù)

多線(xiàn)程技術(shù)解決了這一難題,它可以利用處理器原本用于等待存儲(chǔ)器訪(fǎng)問(wèn)的空閑時(shí)間處理多個(gè)并行程序執(zhí)行線(xiàn)程。當(dāng)一個(gè)線(xiàn)程停下來(lái)等待存儲(chǔ)器響應(yīng)時(shí),另外一個(gè)線(xiàn)程會(huì)馬上提交給處理器,從而保持運(yùn)算資源的充分利用。

值得注意的是,傳統(tǒng)處理器不能采用這種方法,因?yàn)樗枰罅恐噶钪芷诓拍芡瓿删€(xiàn)程之間的切換。要想使這種方法順利工作,多個(gè)應(yīng)用程序線(xiàn)程必須立即有效,并能逐周期運(yùn)行。

34K處理器是來(lái)自面向消費(fèi)類(lèi)設(shè)備市場(chǎng)的嵌入式處理器主要提供商的首個(gè)多線(xiàn)程產(chǎn)品。每個(gè)軟件線(xiàn)程在線(xiàn)程環(huán)境(Thread Context, TC)上執(zhí)行,一個(gè)TC包括一整套通用寄存器和一個(gè)程序計(jì)數(shù)器(program counter)。

每個(gè)TC都有自己的指令預(yù)取隊(duì)列,所有隊(duì)列都完全獨(dú)立。這意味著內(nèi)核能在線(xiàn)程間逐周期地進(jìn)行切換,因此可以避免軟件中產(chǎn)生開(kāi)銷(xiāo)。增加更多的TC只需增加很少的額外硅片。TC共享大部分CPU硬件,包括執(zhí)行單元、ALU和緩存。而且,增加一個(gè)TC并不要求CPU擁有另外一個(gè)OS軟件運(yùn)行CPU所需的CP0寄存器拷貝。

一組共享CP0寄存器以及與之相關(guān)的TC即組成一個(gè)虛擬處理單元(VPE)。一個(gè)TC運(yùn)行一個(gè)線(xiàn)程,一個(gè)VPE管理一個(gè)操作系統(tǒng):如果有兩個(gè)VPE,那么就可以有兩個(gè)獨(dú)立的操作系統(tǒng),或一個(gè)SMP風(fēng)格的操作系統(tǒng)。帶一個(gè)TC的VPE看起來(lái)就像是傳統(tǒng)的MIPS32架構(gòu)CPU,并且完全兼容MIPS架構(gòu)規(guī)范-其實(shí)就是一個(gè)完整的虛擬處理器。

34K內(nèi)核最多可以有9個(gè)TC和2個(gè)VPE。TC到VPE的聯(lián)系取決于運(yùn)行時(shí)間。默認(rèn)情況下所有準(zhǔn)備執(zhí)行的TC都平等分享處理時(shí)間,但34K內(nèi)核也能在某個(gè)特殊要求線(xiàn)程可能會(huì)“挨餓”的情況下讓某個(gè)程序影響線(xiàn)程調(diào)度,也就是說(shuō)軟件可以控制每個(gè)線(xiàn)程的服務(wù)質(zhì)量(QoS)。應(yīng)用軟件與硬件策略管理器(Policy Manager)互動(dòng),策略管理器向各個(gè)TC分配動(dòng)態(tài)改變的優(yōu)先級(jí)。然后由硬件分發(fā)調(diào)度器將線(xiàn)程逐個(gè)周期地分配給執(zhí)行單元,從而滿(mǎn)足QoS要求。

在像34K這樣的多線(xiàn)程環(huán)境中,性能可以大大地提高,因?yàn)橹灰粋€(gè)線(xiàn)程處于等待存儲(chǔ)器訪(fǎng)問(wèn)狀態(tài),另外一個(gè)線(xiàn)程就會(huì)占用空閑下來(lái)的處理器周期。上圖2表明了多線(xiàn)程是如何加快程序執(zhí)行速度的。當(dāng)只有線(xiàn)程0運(yùn)行時(shí),13個(gè)處理器周期中只有5個(gè)用于指令執(zhí)行,剩下7個(gè)全部在等待緩存行的回填。在這種使用傳統(tǒng)處理方式的情況下效率只有38%。


圖2:多線(xiàn)程提高了管線(xiàn)效率。

增加線(xiàn)程1就可能使用上述5個(gè)用于等待的處理器周期?,F(xiàn)在13個(gè)處理器周期中用到了10個(gè),效率提高到77%,與最基本情況相比速度加快了一倍。增加線(xiàn)程2后可以完全加載處理器資源,13個(gè)執(zhí)行指令周期可以全部用上,效率達(dá)到100%。相比基本情況速度提高263%。

采用EEMBC性能基準(zhǔn)的測(cè)試表明,34K內(nèi)核與24KE系列產(chǎn)品相比,只用兩個(gè)線(xiàn)程就可以提速60%,而硅片尺寸只增加14%,如圖3所示。


圖3:EEMBC基準(zhǔn)性能例子表明只用兩個(gè)線(xiàn)程性能就有60%的提高。

使軟件適應(yīng)多線(xiàn)程

多線(xiàn)程方法的關(guān)鍵優(yōu)勢(shì)是在大多數(shù)情況下現(xiàn)有軟件只需做極少量的修改就能順利運(yùn)行。大多數(shù)消費(fèi)類(lèi)設(shè)備程序已經(jīng)寫(xiě)成一系列的半獨(dú)立線(xiàn)程。每個(gè)線(xiàn)程可以被自動(dòng)或人工地分配給專(zhuān)門(mén)的硬件TC。

如果當(dāng)前正在執(zhí)行的線(xiàn)程由于緩存丟失或其它原因引起的時(shí)延而無(wú)法繼續(xù)運(yùn)行,CPU執(zhí)行機(jī)制就會(huì)從那個(gè)TC切換到另外一個(gè)TC,該TC的線(xiàn)程可以在不浪費(fèi)CPU周期的情況下運(yùn)行。程序中線(xiàn)程越多,利用等待存儲(chǔ)器訪(fǎng)問(wèn)周期的可能性就越高。

多線(xiàn)程處理對(duì)使用或考慮使用的任何人來(lái)說(shuō)都是非常理想的,因?yàn)?a class="contentlabel" href="http://butianyuan.cn/news/listbylabel/label/RTOS">RTOS程序本身就具有多線(xiàn)程特性。無(wú)需為多線(xiàn)程重新編寫(xiě)程序,因?yàn)镽TOS可以在程序控制下自動(dòng)將程序線(xiàn)程映射為T(mén)C,其映射方式與將線(xiàn)程映射為傳統(tǒng)處理器的方式相同。

如果線(xiàn)程數(shù)比TC多,通常需要用到傳統(tǒng)的環(huán)境切換(context switch)。這些環(huán)境切換與傳統(tǒng)處理器中的是一樣的。RTOS保存當(dāng)前任務(wù)的狀態(tài),加載另外一個(gè)任務(wù)的環(huán)境并開(kāi)始執(zhí)行。多線(xiàn)程環(huán)境顯然要比傳統(tǒng)處理器更適合更多環(huán)境的切換,所實(shí)現(xiàn)的環(huán)境切換速度也更快。

Linux/Windows與RTOS的多線(xiàn)程比較

本節(jié)重點(diǎn)介紹相對(duì)Linux和嵌入式Windows版本等操作系統(tǒng)而言快速RTOS的優(yōu)勢(shì)。Linux的典型實(shí)時(shí)性能在數(shù)百微秒到數(shù)毫秒。但在最壞情況下Linux實(shí)時(shí)性能并不理想。而快速RTOS可以提供確定的實(shí)時(shí)性能,在單線(xiàn)程處理器上可以達(dá)1到2毫秒,在多線(xiàn)程處理器上還會(huì)更快。


圖4:將線(xiàn)程映射為T(mén)C

RTOS將唯一資源分配給唯一的TC。傳統(tǒng)的做法是將單浮點(diǎn)單元(FPU)分配給TC0。任何執(zhí)行硬件級(jí)浮點(diǎn)運(yùn)算的線(xiàn)程都需要被映射為T(mén)C0,因此所有這類(lèi)線(xiàn)程必須共享TC0。這就形成了多種有趣的編程選擇,特別是用硬件還是軟件實(shí)現(xiàn)浮點(diǎn)運(yùn)算的選擇。

用硬件實(shí)現(xiàn)浮點(diǎn)運(yùn)算顯然速度會(huì)更快,但另一方面需要共享FPU。如果線(xiàn)程只做少量的浮點(diǎn)運(yùn)算,那么用軟件實(shí)現(xiàn)將更有意義,而需要密集浮點(diǎn)運(yùn)算的線(xiàn)程通常要用硬件實(shí)現(xiàn),并被映射到TC0。值得注意的是,這個(gè)修改不需要記錄,因?yàn)槭欠裼糜布蜍浖↑c(diǎn)實(shí)現(xiàn)的決定可以由編譯器切換實(shí)現(xiàn)。

給線(xiàn)程分配權(quán)重

如果程序沒(méi)有給各個(gè)線(xiàn)程定義權(quán)重,那么程序調(diào)度器就會(huì)給所有線(xiàn)程分配相同的權(quán)重,另外也可以使用時(shí)間分段技術(shù)使線(xiàn)程依據(jù)用戶(hù)指定的權(quán)重共享CPU周期。分配權(quán)重相當(dāng)于將適當(dāng)比例的CPU周期分配給各個(gè)具體線(xiàn)程。線(xiàn)程權(quán)重由RTOS透明地映射為硬件TC。

一些現(xiàn)有程序是針對(duì)傳統(tǒng)處理器設(shè)計(jì)的,其前提條件是假設(shè)在有高優(yōu)先級(jí)的線(xiàn)程準(zhǔn)備好時(shí)低優(yōu)先級(jí)線(xiàn)程將被禁止運(yùn)行。在嵌入式編程環(huán)境中,準(zhǔn)備好的意思是線(xiàn)程運(yùn)行所必需的全部條件都得到了滿(mǎn)足,阻止它運(yùn)行的唯一因素是它的優(yōu)先級(jí)。

多線(xiàn)程可破壞這種條件,因?yàn)闊o(wú)論高優(yōu)先級(jí)線(xiàn)程是否停止,低優(yōu)先級(jí)線(xiàn)程都能運(yùn)行。編寫(xiě)取消這種狀態(tài)的代碼可優(yōu)化性能。

另外一方面,根據(jù)這種條件編寫(xiě)的現(xiàn)有代碼無(wú)需修改就能運(yùn)行在多線(xiàn)程處理器上,只需簡(jiǎn)單地設(shè)置操作系統(tǒng)開(kāi)關(guān),使其只允許相同優(yōu)先級(jí)的線(xiàn)程同時(shí)被加載到TC。在設(shè)置這個(gè)開(kāi)關(guān)時(shí),需要確保給那些能夠并行運(yùn)行的線(xiàn)程盡量分配相同的優(yōu)先級(jí)。

可中斷的重要性

在傳統(tǒng)的嵌入式應(yīng)用中中斷是非常重要的,因?yàn)樗鼈兲峁┝酥饕摹⒃谠S多情況下也是唯一的線(xiàn)程間切換方式。中斷在多線(xiàn)程應(yīng)用中也起著相同的作用,但有一個(gè)重要的區(qū)別,即在多線(xiàn)程應(yīng)用中,線(xiàn)程間的切換不僅要通過(guò)中斷,還要使用空閑CPU周期。

需要盡量避免在修改關(guān)鍵數(shù)據(jù)結(jié)構(gòu)時(shí)中斷某個(gè)線(xiàn)程,同時(shí)起用另外一個(gè)線(xiàn)程對(duì)同一結(jié)構(gòu)作其它修改。這將導(dǎo)致數(shù)據(jù)結(jié)構(gòu)處于不一致的狀態(tài),極易引起災(zāi)難性后果。

大多數(shù)傳統(tǒng)應(yīng)用解決這個(gè)問(wèn)題的方法是,當(dāng)ISR或系統(tǒng)服務(wù)正在修改RTOS中關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)時(shí)暫時(shí)鎖住中斷。這種方法可靠地阻止了任何其它程序跳進(jìn)來(lái)對(duì)執(zhí)行代碼正在使用的關(guān)鍵區(qū)域做出不恰當(dāng)?shù)男薷摹?br />
然而在多線(xiàn)程環(huán)境中這種方法是不夠的,因?yàn)橛锌赡鼙磺袚Q到不受中斷鎖定控制的不同TC,從而可能對(duì)關(guān)鍵區(qū)域做出修改。該問(wèn)題可以利用34K架構(gòu)中的DMT指令解決,當(dāng)數(shù)據(jù)結(jié)構(gòu)在修改狀態(tài)時(shí)可禁止多線(xiàn)程功能。

除了這些相對(duì)簡(jiǎn)單的例外情況外,設(shè)備代碼在從傳統(tǒng)設(shè)備移植到多線(xiàn)程設(shè)備時(shí)無(wú)需修改就能直接運(yùn)行。因此,我們能夠利用以往被傳統(tǒng)RISC處理器浪費(fèi)的CPU周期,充分發(fā)揮多線(xiàn)程性能優(yōu)勢(shì)。多線(xiàn)程可以滿(mǎn)足當(dāng)前和未來(lái)需要高性能的消費(fèi)類(lèi)、網(wǎng)絡(luò)、存儲(chǔ)和工業(yè)設(shè)備應(yīng)用要求,而成本和功耗只有少許的增加。

與主要的競(jìng)爭(zhēng)技術(shù)--多內(nèi)核技術(shù)相比,多線(xiàn)程有更小的硅片面積和更低功耗的優(yōu)勢(shì),而且編程簡(jiǎn)單,現(xiàn)有程序只需做少量修改甚至不用修改就能運(yùn)行。多內(nèi)核方法也有它自己的優(yōu)勢(shì)和強(qiáng)項(xiàng),因此沒(méi)有理由證明這兩種方法不能融合出一種最佳方法。在要求高性能、低成本和最小功耗的應(yīng)用場(chǎng)合,多線(xiàn)程是一種極具競(jìng)爭(zhēng)力的方案。

作者:

John A. Carbone

產(chǎn)品行銷(xiāo)副總裁

Express Logic公司



關(guān)鍵詞: 多線(xiàn)程 RTOS

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉