Linux在嵌入式系統(tǒng)中有關(guān)進(jìn)程調(diào)度算法的實(shí)時(shí)性改進(jìn)
從上面的goodness() 函數(shù)可以看出普通Linux 內(nèi)核的進(jìn)程調(diào)度算法只是軟實(shí)時(shí)的,并不是硬實(shí)時(shí)的。 尤其不能作為硬實(shí)時(shí)應(yīng)用,主要有以下幾個(gè)原因:
(1) L INUX 內(nèi)核的實(shí)時(shí)進(jìn)程的調(diào)度算法當(dāng)中,SCHED RR 和SCHED RR 調(diào)度策略的主要不同點(diǎn)在于,SCHED RR 進(jìn)程在一個(gè)時(shí)間片運(yùn)行完以后被放到運(yùn)行隊(duì)列的最后。 L INUX的每一個(gè)進(jìn)程都有一個(gè)調(diào)度策略,在進(jìn)程描述結(jié)構(gòu)task struct 中規(guī)定policy 屬性。 所有的進(jìn)程不管采用哪一種調(diào)度策略,都放在同一個(gè)運(yùn)行隊(duì)列中。這樣做,就對(duì)實(shí)時(shí)進(jìn)程的響應(yīng)產(chǎn)生了影響。
(2) Linux 的內(nèi)核是非搶占式的( non-preemptive) 。
(3) Linux 的進(jìn)程調(diào)度策略不是完全搶占式的。
(4) Linux 的虛擬內(nèi)存技術(shù)(virtual memory)增加了系統(tǒng)的不確定性。
(5) Linux 采用的時(shí)鐘中斷的精度不高。
(6) Linux 系統(tǒng)的一些額外操作會(huì)延遲實(shí)時(shí)進(jìn)程的執(zhí)行。
綜上所述,不經(jīng)處理的Linux 是不適合做實(shí)時(shí)操作系統(tǒng)的,即便是軟實(shí)時(shí),在系統(tǒng)負(fù)荷重的情況下也不能保證其實(shí)時(shí)性。 但通過(guò)對(duì)Linux 內(nèi)核的改造完全可以提高Linux 的實(shí)時(shí)性,甚至可以滿(mǎn)足實(shí)時(shí)的要求。
LINUX 實(shí)時(shí)性改造的實(shí)現(xiàn)方法
實(shí)現(xiàn)LINUX 的實(shí)時(shí)性一般有兩種方法: 一種是對(duì)普通的LINUX 的內(nèi)核的數(shù)據(jù)結(jié)構(gòu)、調(diào)度函數(shù)、中斷方式等進(jìn)行修改使其能夠處理實(shí)時(shí)進(jìn)程。另一種是在LINUX 內(nèi)核之外,進(jìn)行實(shí)時(shí)性擴(kuò)展。 也就是在普通LINUX 的基礎(chǔ)之上再設(shè)計(jì)一個(gè)用于專(zhuān)門(mén)處理實(shí)時(shí)進(jìn)程的內(nèi)核。 為了提高LINUX 的實(shí)時(shí)性,并且使之能夠在嵌入式系統(tǒng)中更好地滿(mǎn)足硬實(shí)時(shí)系統(tǒng)的要求,采用上述兩種方法結(jié)合的兩種方式來(lái)提高系統(tǒng)的實(shí)時(shí)性。
外部實(shí)時(shí)性擴(kuò)展
對(duì)LINUX 做外部實(shí)時(shí)性擴(kuò)展最主要的思想是在硬件中斷與原來(lái)的LINUX 內(nèi)核之間增加一個(gè)實(shí)時(shí)內(nèi)核。 在原來(lái)的LINUX 內(nèi)核的基礎(chǔ)上,增加一個(gè)實(shí)時(shí)內(nèi)核可以解決LINUX 原有內(nèi)核的關(guān)中斷的問(wèn)題。
對(duì)于實(shí)時(shí)內(nèi)核來(lái)說(shuō),它始終不關(guān)閉硬件中斷,可以接受所有的中斷信號(hào)。 當(dāng)中斷信號(hào)需要實(shí)時(shí)進(jìn)程來(lái)處理時(shí),實(shí)時(shí)進(jìn)程將搶占LINUX 內(nèi)核,在RTLINUX中把原來(lái)的LINUX 內(nèi)核作為一個(gè)普通進(jìn)程來(lái)對(duì)待,并且它的優(yōu)先級(jí)是最低的。 如果中斷信號(hào)需要原來(lái)的LINUX 內(nèi)核來(lái)處理,則由實(shí)時(shí)內(nèi)核信號(hào)傳遞給LINUX 內(nèi)核。 同時(shí)內(nèi)核中提供一個(gè)標(biāo)志位用來(lái)模擬原來(lái)的LINUX 內(nèi)核的關(guān)中斷情況。這個(gè)標(biāo)志字在LINUX 打開(kāi)中斷的時(shí)候置1 ,關(guān)中斷的時(shí)候置0。 實(shí)時(shí)內(nèi)核在中斷到來(lái)的時(shí)候檢查這個(gè)標(biāo)志位,如果是置1 的,那立刻將中斷傳給LINUX 內(nèi)核,否則的話(huà),將所有待處理的中斷放入一個(gè)隊(duì)列中,一直到LINUX 打開(kāi)中斷時(shí)才將它們一起傳給內(nèi)核。
內(nèi)部實(shí)時(shí)性改造
對(duì)Linux 內(nèi)部實(shí)時(shí)性改造有兩個(gè)方面的工作: (1) 對(duì)時(shí)鐘機(jī)制的改造。 (2) 在內(nèi)核方面的搶占性改造。 改造的目的是為了縮短Linux 內(nèi)核的響應(yīng)延時(shí)。
(1) 在時(shí)鐘機(jī)制的改造方面,可以通過(guò)提高系統(tǒng)時(shí)鐘的精度來(lái)增強(qiáng)系統(tǒng)的實(shí)時(shí)性,特別是對(duì)外部中斷的響應(yīng)。因?yàn)榫_的時(shí)鐘是操作系統(tǒng)進(jìn)行準(zhǔn)確的調(diào)度工作的必不可少的條件。 執(zhí)行調(diào)度就要求在特定的時(shí)間進(jìn)行任務(wù)切換。不精確的時(shí)鐘會(huì)導(dǎo)致調(diào)度偏差,從而導(dǎo)致無(wú)法預(yù)計(jì)的結(jié)果。所以提高時(shí)鐘精度,減少調(diào)度偏差是非常重要的。在操作系統(tǒng)中,時(shí)鐘精度不高的原因之一是因?yàn)椋褐芷谛詴r(shí)鐘中斷的使用。操作系統(tǒng)不得不將大量的時(shí)間開(kāi)銷(xiāo)用于處理時(shí)鐘中斷。 Linux。 操作系統(tǒng)也是如此。 在Linux 中,它的中斷頻率被設(shè)為100Hz。即大約每10ms 產(chǎn)生一次定時(shí)中斷。
(2) 在內(nèi)核搶占性方面的改造有兩種方法:一種是搶占點(diǎn)的方法。另一種是搶占式內(nèi)核的設(shè)計(jì)。所謂搶占就是內(nèi)核在某個(gè)合適的地方調(diào)用schedule() 函數(shù)來(lái)檢查是否有高優(yōu)先級(jí)的任務(wù)已經(jīng)處于ready 狀態(tài)并讓這個(gè)高優(yōu)先級(jí)任務(wù)運(yùn)行。為了提高系統(tǒng)的實(shí)時(shí)性,搶占的選擇要合理,既不能時(shí)間間隔太短,也不能太長(zhǎng),因此,在設(shè)置搶占點(diǎn)的時(shí)候要測(cè)試內(nèi)核中的運(yùn)行路徑,在較長(zhǎng)的運(yùn)行路徑中插入schedule() 。 進(jìn)行調(diào)度,這個(gè)地方就是搶占點(diǎn)。
另一種是搶占式內(nèi)核的設(shè)計(jì),即允許處于系統(tǒng)調(diào)用狀態(tài)的用戶(hù)進(jìn)程被剛剛喚醒的高優(yōu)先級(jí)進(jìn)程所搶占。 但是這種搶占方式并不是在內(nèi)核代碼的所有地方都是安全的,如在臨界區(qū)就不能搶占。
結(jié)論
綜上所述,不經(jīng)改進(jìn)的Linux 操作系統(tǒng)是不適合做實(shí)時(shí)操作系統(tǒng)的,即便是軟實(shí)時(shí),在系統(tǒng)負(fù)荷重的情況下也不能保證其實(shí)時(shí)性。 但通過(guò)對(duì)Linux 的改造可以完全提高Linux 的實(shí)時(shí)性,甚至可以滿(mǎn)足硬實(shí)時(shí)的要求。
評(píng)論