嵌入式Linux實(shí)時(shí)性能提高方案
1 引言
本文引用地址:http://dyxdggzs.com/article/150766.htm分析了Linux的實(shí)時(shí)性,針對其在實(shí)時(shí)應用中的技術(shù)障礙,在參考了與此相關(guān)研究基礎上,從三方面提出了改善Linux實(shí)時(shí)性能的改進(jìn)措施。為提高嵌入式應用響應時(shí)間精度,提出兩種細化Linux時(shí)鐘粒度方法;為增強系統內核對實(shí)時(shí)任務(wù)的響應能力,采用插入搶占點(diǎn)和修改內核法增強Linux內核的可搶占性;為保證硬實(shí)時(shí)任務(wù)的時(shí)限要求,把原Linux的單運行隊列改為雙運行隊列,硬實(shí)時(shí)任務(wù)單獨被放在一個(gè)隊列中,并采用MLF調度算法代替原內核的FIFO調度算法。本文分析了標準Linux在實(shí)時(shí)應用中的技術(shù)障礙,參考了修改核方法的思想,從內核時(shí)鐘管理、內核的搶占性、內核調度算法三方面論述了改善標準Linux實(shí)時(shí)性能的方法。
2 Linux 在實(shí)時(shí)應用中的技術(shù)障礙
2.1 Linux的實(shí)時(shí)性分析
Linux作為一個(gè)通用操作系統,主要考慮的是調度的公平性和吞吐量等指標。然而,在實(shí)時(shí)方面它還不能很好地滿(mǎn)足實(shí)時(shí)系統方面的需要,其本身僅僅提供了一些實(shí)時(shí)處理的支持,這包括支持大部分POSIX標準中的實(shí)時(shí)功能,支持多任務(wù)、多線(xiàn)程,具有豐富的通信機制等;同時(shí)也提供了符合POSIX標準的調度策略,包括FIFO調度策略、時(shí)間片輪轉調度策略和靜態(tài)優(yōu)先級搶占式調度策略。Linux區分實(shí)時(shí)進(jìn)程和普通進(jìn)程,并采用不同的調度策略。
為了同時(shí)支持實(shí)時(shí)和非實(shí)時(shí)兩種進(jìn)程,Linux的調度策略簡(jiǎn)單講就是優(yōu)先級加上時(shí)間片。當系統中有實(shí)時(shí)進(jìn)程到來(lái)時(shí),系統賦予它最高的優(yōu)先級。體現在實(shí)時(shí)性上,Linux采用了兩種簡(jiǎn)單的調度策略,即先來(lái)先服務(wù)調度(SCHED-FIFO)和時(shí)間片輪轉調度(SCHED-RR)。具體是將所有處于運行狀態(tài)的任務(wù)掛接在一個(gè)run-queue 隊列中,并將任務(wù)分成實(shí)時(shí)和非實(shí)時(shí)任務(wù),對不同的任務(wù),在其任務(wù)控制塊task-struct中用一個(gè)policy屬性來(lái)確定其調度策略。對實(shí)時(shí)性要求較嚴的硬實(shí)時(shí)任務(wù)采用SCHED-FIFO調度,使之在一次調度后運行完畢。對普通非實(shí)時(shí)進(jìn)程,Linux采用基于優(yōu)先級的輪轉策略。
2.2 Linux在實(shí)時(shí)應用中的技術(shù)障礙
盡管Linux本身提供了一些支持實(shí)時(shí)性的機制,然而,由于Linux系統是以高的吞吐量和公平性為追求目標,基本上沒(méi)有考慮實(shí)時(shí)應用所要滿(mǎn)足的時(shí)間約束,它只是提供了一些相對簡(jiǎn)單的任務(wù)調度策略。因此,實(shí)時(shí)性問(wèn)題是將Linux應用于嵌入式系統開(kāi)發(fā)的一大障礙,無(wú)法在硬實(shí)時(shí)系統中得到應用。 Linux在實(shí)時(shí)應用中的技術(shù)障礙具體表現在:
(1)Linux系統時(shí)鐘精度太過(guò)粗糙,時(shí)鐘中斷周期為10ms,使得其時(shí)間粒度過(guò)大,加大了任務(wù)響應延遲。
(2) Linux的內核是不可搶占的, 當一個(gè)任務(wù)通過(guò)系統調用進(jìn)入內核態(tài)運行時(shí),一個(gè)具有更高優(yōu)先級的進(jìn)程,只有等待處于核心態(tài)的系統調用返回后方能執行,這將導致優(yōu)先級逆轉。實(shí)時(shí)任務(wù)執行時(shí)間的不確定性,顯然不能滿(mǎn)足硬實(shí)時(shí)應用的要求。
(3) Linux采用對臨界區操作時(shí)屏蔽中斷的方式,在中斷處理中是不允許進(jìn)行任務(wù)調度的,從而抑制了系統及時(shí)響應外部操作的能力。
(4) 缺乏有效的實(shí)時(shí)任務(wù)調度機制和調度算法。
針對這些問(wèn)題,利用Linux作為底層操作系統,必須增強其內核的實(shí)時(shí)性能,從而構建出一個(gè)具有實(shí)時(shí)處理能力的嵌入式系統,適應嵌入式領(lǐng)域應用的需要。2.3 當前增強Linux內核實(shí)時(shí)性的主流技術(shù)
近年來(lái),人們對于Linux內核實(shí)時(shí)性改造提出了一些方法和設想,它們采用了不同的思路和技術(shù)方案。歸納總結,支持Linux的硬實(shí)時(shí)性一般有兩種策略[5]:一種是直接修改Linux內核,重新編寫(xiě)一個(gè)由優(yōu)先級驅動(dòng)的實(shí)時(shí)調度器(Real-time Scheduler),替換原有內核中的進(jìn)程調度器sched.c,KURT是采用這一方案較為成功的實(shí)時(shí)Linux操作系統;另外一種是在Linux內核之外, 以可加載內核模塊(Loadable Kernel Module)的形式添加實(shí)時(shí)內核,確保其高響應特性,實(shí)時(shí)內核接管來(lái)自硬件的所有中斷,并依據是否是實(shí)時(shí)任務(wù)決定是否直接響應。新墨西哥科技大學(xué)的 RT-Linux,就是基于這種策略而開(kāi)發(fā)的。以上兩種策略有其借鑒之處,但如果綜合考慮任務(wù)響應、內核搶占性、實(shí)時(shí)調度策略等幾個(gè)影響操作系統實(shí)時(shí)性能的重要方面,它們還不能很好的滿(mǎn)足實(shí)時(shí)性問(wèn)題。為了增強嵌入式Linux實(shí)時(shí)性能,下文將就內核時(shí)鐘精度、內核的搶占性以及內核調度算法等相關(guān)問(wèn)題重點(diǎn)研究相應的解決方法。
3 改善嵌入式Linux實(shí)時(shí)性能的方法
針對Linux在實(shí)時(shí)應用中的技術(shù)障礙,將Linux改造成為支持實(shí)時(shí)任務(wù)的嵌入式操作系統, 主要從下面三個(gè)方面進(jìn)行著(zhù)手。
3.1細化時(shí)鐘粒度
精確的計時(shí)是實(shí)時(shí)調度器正確操作所必須的,調度器通常要求在一個(gè)特定的時(shí)刻進(jìn)行任務(wù)切換,計時(shí)的錯誤將導致背離計劃的調度,引起任務(wù)釋放抖動(dòng)。標準 Linux系統時(shí)鐘精度太過(guò)粗糙,時(shí)鐘中斷周期為10ms,不能滿(mǎn)足特定嵌入式應用領(lǐng)域中對于響應時(shí)間精度的要求。因此,在實(shí)時(shí)Linux應用中,需要細化其時(shí)鐘粒度,具體有兩種方式可以解決時(shí)鐘粒度問(wèn)題:一是通過(guò)直接修改內核定時(shí)參數HZ的初值來(lái)細化時(shí)鐘粒度,如將標準Linux中內核定時(shí)參數HZ改為10000, 則時(shí)鐘粒度可以達到100us,這種方式雖然會(huì )增加一些系統開(kāi)銷(xiāo),但在強周期性環(huán)境下,對定時(shí)器的設置只需初始化一次,在一定程度上保證了處理效率;二是通過(guò)對可編程中斷定時(shí)器8254或先進(jìn)的可編程中斷控制器進(jìn)行編程來(lái)改進(jìn)Linux時(shí)鐘機制,以提高其時(shí)鐘的分辨率,使毫秒級的粗粒度定時(shí)器變成微秒級的細粒度定時(shí)器。
3.2 增強Linux內核的搶占性
標準Linux內核是不可搶占的,導致較大的延遲,增強內核的可搶占性能,可提高系統內核對實(shí)時(shí)任務(wù)的響應能力。目前,有兩種方法修改Linux內核以提高實(shí)時(shí)任務(wù)搶占非實(shí)時(shí)任務(wù)的能力:一是在內核中增加搶占點(diǎn)的方法;二是直接將Linux內核改造成可搶占式內核。插入搶占點(diǎn)方法是在Linux內核中插入一些搶占點(diǎn),當一個(gè)系統調用執行到搶占點(diǎn)時(shí),如果有更高優(yōu)先級的實(shí)時(shí)進(jìn)程正在等待運行,那么正在執行系統調用的內核進(jìn)程將會(huì )把CPU的控制權轉交給等待運行的實(shí)時(shí)進(jìn)程;如果沒(méi)有更高優(yōu)先級的實(shí)時(shí)進(jìn)程等待,則當前進(jìn)程將繼續執行,此時(shí)系統增加的開(kāi)銷(xiāo)僅僅是檢測一下調度標志。將Linux內核改造成可搶占式內核方法的基本思想是產(chǎn)生運行調度器的機會(huì ),縮短任務(wù)發(fā)生到調度函數運行的時(shí)間間隔。這種方法修改了Linux源代碼中的自旋鎖宏以避免競爭,并在其中引入一個(gè)稱(chēng)作搶占鎖計數器(PLC)的新的計數信號允許內核代碼搶占,當它為0時(shí),允許搶占;當其為大于0的任何值時(shí),禁止搶占。目前,針對這兩種修改 Linux內核的方法,已經(jīng)有兩種比較成熟的Linux內核補丁被研制出來(lái):搶占式補丁和低時(shí)延補丁。其中,搶占式補丁是Monta Vista開(kāi)發(fā)的,它修改了內核代碼中的spinlock宏和中斷返回代碼,使得當前進(jìn)程可被安全搶占,當自旋鎖釋放或者中斷線(xiàn)程完成時(shí),調度器就有機會(huì )執行調度;低時(shí)延補丁是由Ingo Malnor提出,該方法只是在執行時(shí)間長(cháng)的代碼塊上搶占,不采用強制式搶占,因此,如何找到延時(shí)長(cháng)的代碼塊是解決問(wèn)題的關(guān)鍵。
3.3 改善Linux內核實(shí)時(shí)調度器的調度策略
將進(jìn)入系統的所有任務(wù)按實(shí)時(shí)性分成三類(lèi):硬實(shí)時(shí)、軟實(shí)時(shí)、非實(shí)時(shí)任務(wù)[6]。硬實(shí)時(shí)要求系統確保任務(wù)執行最壞情況下的執行時(shí)間,即必須滿(mǎn)足實(shí)時(shí)事件的響應時(shí)間的截止期限,否則,將引發(fā)致命的錯誤;軟實(shí)時(shí)是指統計意義上的實(shí)時(shí),一般整體吞吐量大或整體響應速度快,但不能保證特定任務(wù)在指定時(shí)期內完成。針對不同的實(shí)時(shí)性任務(wù),分別采用不同的調度方法進(jìn)行處理。
為了嚴格保證硬實(shí)時(shí)任務(wù)的時(shí)限要求,改善的Linux內核實(shí)時(shí)調度器采用了優(yōu)先級調度算法,目前最小松弛時(shí)間優(yōu)先調度算法MLF(Minimum- Laxity-First Scheduling Algorithm)是動(dòng)態(tài)優(yōu)先級調度最常見(jiàn)的實(shí)時(shí)調度策略。它在系統中為每一個(gè)任務(wù)設定松弛時(shí)間(任務(wù)的松弛時(shí)間等于任務(wù)的截止期減去任務(wù)執行時(shí)間、當前時(shí)間)即: laxity= deadlineDcurrent_timeDCPU_time_needed,系統優(yōu)先執行具有最小松弛時(shí)間的任務(wù)。根據就緒隊列的各任務(wù)的松弛時(shí)間來(lái)分配優(yōu)先級,松弛時(shí)間最小的任務(wù)具有最高的優(yōu)先級。為了提高Linux的實(shí)時(shí)性,我們設計了MLF調度器,并把它作為可加載模塊加入Linux內核中,在實(shí)現中需對內核進(jìn)行相應的修改。為了區分任務(wù)的類(lèi)型,對基本Linux的task_struct屬性進(jìn)行改進(jìn),在其中增加SCHED_MLF調度策略,并按task_struct中的policy的取值來(lái)進(jìn)行區分, 分別用SCHED_MLF,SCHED_RR,SCHED_OTHER來(lái)標識硬實(shí)時(shí)、軟實(shí)時(shí)、非實(shí)時(shí)任務(wù)。將處于運行狀態(tài)的三類(lèi)任務(wù)放入兩個(gè)隊列,硬實(shí)時(shí)任務(wù)放入hard_real_queue隊列, 采用MLF調度算法,軟實(shí)時(shí)和非實(shí)時(shí)任務(wù)放入non_real_queue隊列(空閑任務(wù)也在其中),沿用原內核的RR調度算法。這兩個(gè)隊列可以用一個(gè) run_queue[2]的指針數組來(lái)指向,如圖1 所示。

圖1 雙對列任務(wù)運行
雙隊列任務(wù)運行過(guò)程與原內核的單運行隊列執行流程的主要區別在:首先,各硬實(shí)時(shí)任務(wù)采用了MLF調度算法代替原內核的FIFO調度,提高了 Linux系統的實(shí)時(shí)性能。其次,在判斷是否有軟中斷需要處理之前需判斷硬實(shí)時(shí)任務(wù)隊列是否為空,如果不為空,即使存在中斷的后半部分需要處理,也要先調度硬實(shí)時(shí)任務(wù)投入運行,在硬實(shí)時(shí)隊列為空的條件下才去處理中斷的后半部分(因為中斷的后半部分沒(méi)有硬實(shí)時(shí)任務(wù)緊急)。最后,如果沒(méi)有硬實(shí)時(shí)任務(wù)存在,則說(shuō)明只有run_queue [1]隊列中有軟實(shí)時(shí)或非實(shí)時(shí)任務(wù)存在,這時(shí)的處理方法和原內核對單運行隊列的處理方法相同。這樣改進(jìn)后,可以明顯提高硬實(shí)時(shí)任務(wù)的調度效率,而在沒(méi)有硬實(shí)時(shí)任務(wù)時(shí),系統性能沒(méi)有變化。
4 結束語(yǔ)
本文在分析Linux實(shí)時(shí)性的同時(shí),探討了其本身提供的一些支持實(shí)時(shí)性的機制以及在實(shí)時(shí)應用中的技術(shù)障礙。而后,基于增強Linux內核實(shí)時(shí)性的主流技術(shù),從細化時(shí)鐘粒度、增強內核搶占性及實(shí)時(shí)調度策略三方面入手,提出了改善Linux實(shí)時(shí)性能的優(yōu)化方法。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論