改善嵌入式Linux實(shí)時(shí)性能的方法研究
摘要:分析了Linux的實(shí)時(shí)性,針對(duì)其在實(shí)時(shí)應(yīng)用中的技術(shù)障礙,在參考了與此相關(guān)研究基礎(chǔ)上,從三方面提出了改善Linux實(shí)時(shí)性能的改進(jìn)措施。為提高嵌入式應(yīng)用響應(yīng)時(shí)間精度,提出兩種細(xì)化Linux時(shí)鐘粒度方法;為增強(qiáng)系統(tǒng)內(nèi)核對(duì)實(shí)時(shí)任務(wù)的響應(yīng)能力,采用插入搶占點(diǎn)和修改內(nèi)核法增強(qiáng)Linux內(nèi)核的可搶占性;為保證硬實(shí)時(shí)任務(wù)的時(shí)限要求,把原Linux的單運(yùn)行隊(duì)列改為雙運(yùn)行隊(duì)列,硬實(shí)時(shí)任務(wù)單獨(dú)被放在一個(gè)隊(duì)列中,并采用MLF調(diào)度算法代替原內(nèi)核的FIFO調(diào)度算法。關(guān)鍵詞:Linux;實(shí)時(shí)性;調(diào)度策略;搶占
1 引言
目前,無(wú)論是在日常生活,還是在工業(yè)控制,航空航天,軍事等方面,嵌入式系統(tǒng)都有著非常廣泛的應(yīng)用。嵌入式系統(tǒng)目前主要有:Windows CE、VxWorks、QNX等,它們都具有較好的實(shí)時(shí)性、系統(tǒng)可靠性、任務(wù)處理隨機(jī)性等優(yōu)點(diǎn),但是它們的價(jià)格普遍偏高。而嵌入式Linux以其非常低廉的價(jià)格,可以大大的降低成本,逐漸成為嵌入式操作系統(tǒng)的首選。但是,作為通用操作系統(tǒng)的Linux,由于其在實(shí)時(shí)應(yīng)用領(lǐng)域的技術(shù)障礙,要應(yīng)用在嵌入式領(lǐng)域,還必須對(duì)Linux內(nèi)核作必要的改進(jìn)。許多嵌入式設(shè)備都要求與外部環(huán)境有硬實(shí)時(shí)的交互能力,將最初按照分時(shí)系統(tǒng)目標(biāo)設(shè)計(jì)的Linux 改造成能支持硬實(shí)時(shí)性的操作系統(tǒng)顯得十分重要。幸運(yùn)的是, Linux 及其相關(guān)項(xiàng)目的開(kāi)放源碼特征為深入研究其內(nèi)核并加以改造提供了可行性, 可以修改Linux 內(nèi)核中的各個(gè)模塊以達(dá)到滿足嵌入式應(yīng)用的需求,提高軟件方面的開(kāi)發(fā)速度。目前,改善Linux內(nèi)核的設(shè)計(jì)與實(shí)現(xiàn),使其適用于實(shí)時(shí)領(lǐng)域吸引了許多研究和開(kāi)發(fā)人員的注意力[1-4]。常用的實(shí)時(shí)性改造方法是采用雙核方法,這種方法的弊端在于實(shí)時(shí)任務(wù)的開(kāi)發(fā)是直接面向提供精確實(shí)時(shí)服務(wù)的小實(shí)時(shí)核心的,而不是功能強(qiáng)大的常規(guī)Linux核心。基于此,近年來(lái)修改核的方法越來(lái)越受到科研人員的重視,這種方法是基于已有Linux系統(tǒng)對(duì)于軟件開(kāi)發(fā)的支持,進(jìn)行源代碼級(jí)修改而使Linux變成一個(gè)真正的實(shí)時(shí)操作系統(tǒng)。本文分析了標(biāo)準(zhǔn)Linux在實(shí)時(shí)應(yīng)用中的技術(shù)障礙,參考了修改核方法的思想,從內(nèi)核時(shí)鐘管理、內(nèi)核的搶占性、內(nèi)核調(diào)度算法三方面論述了改善標(biāo)準(zhǔn)Linux實(shí)時(shí)性能的方法。
2 Linux 在實(shí)時(shí)應(yīng)用中的技術(shù)障礙
2.1 Linux的實(shí)時(shí)性分析
Linux作為一個(gè)通用操作系統(tǒng),主要考慮的是調(diào)度的公平性和吞吐量等指標(biāo)。然而,在實(shí)時(shí)方面它還不能很好地滿足實(shí)時(shí)系統(tǒng)方面的需要,其本身僅僅提供了一些實(shí)時(shí)處理的支持,這包括支持大部分POSIX標(biāo)準(zhǔn)中的實(shí)時(shí)功能,支持多任務(wù)、多線程,具有豐富的通信機(jī)制等;同時(shí)也提供了符合POSIX標(biāo)準(zhǔn)的調(diào)度策略,包括FIFO調(diào)度策略、時(shí)間片輪轉(zhuǎn)調(diào)度策略和靜態(tài)優(yōu)先級(jí)搶占式調(diào)度策略。Linux區(qū)分實(shí)時(shí)進(jìn)程和普通進(jìn)程,并采用不同的調(diào)度策略。 為了同時(shí)支持實(shí)時(shí)和非實(shí)時(shí)兩種進(jìn)程,Linux的調(diào)度策略簡(jiǎn)單講就是優(yōu)先級(jí)加上時(shí)間片。當(dāng)系統(tǒng)中有實(shí)時(shí)進(jìn)程到來(lái)時(shí),系統(tǒng)賦予它最高的優(yōu)先級(jí)。體現(xiàn)在實(shí)時(shí)性上,Linux采用了兩種簡(jiǎn)單的調(diào)度策略,即先來(lái)先服務(wù)調(diào)度(SCHED-FIFO)和時(shí)間片輪轉(zhuǎn)調(diào)度(SCHED-RR)。具體是將所有處于運(yùn)行狀態(tài)的任務(wù)掛接在一個(gè)run-queue 隊(duì)列中,并將任務(wù)分成實(shí)時(shí)和非實(shí)時(shí)任務(wù),對(duì)不同的任務(wù),在其任務(wù)控制塊task-struct中用一個(gè)policy屬性來(lái)確定其調(diào)度策略。對(duì)實(shí)時(shí)性要求較嚴(yán)的硬實(shí)時(shí)任務(wù)采用SCHED-FIFO調(diào)度,使之在一次調(diào)度后運(yùn)行完畢。對(duì)普通非實(shí)時(shí)進(jìn)程,Linux采用基于優(yōu)先級(jí)的輪轉(zhuǎn)策略。 2.2 Linux在實(shí)時(shí)應(yīng)用中的技術(shù)障礙
盡管Linux本身提供了一些支持實(shí)時(shí)性的機(jī)制,然而,由于Linux系統(tǒng)是以高的吞吐量和公平性為追求目標(biāo),基本上沒(méi)有考慮實(shí)時(shí)應(yīng)用所要滿足的時(shí)間約束,它只是提供了一些相對(duì)簡(jiǎn)單的任務(wù)調(diào)度策略。因此,實(shí)時(shí)性問(wèn)題是將Linux應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā)的一大障礙,無(wú)法在硬實(shí)時(shí)系統(tǒng)中得到應(yīng)用。Linux在實(shí)時(shí)應(yīng)用中的技術(shù)障礙具體表現(xiàn)在: (1)Linux系統(tǒng)時(shí)鐘精度太過(guò)粗糙,時(shí)鐘中斷周期為10ms,使得其時(shí)間粒度過(guò)大,加大了任務(wù)響應(yīng)延遲。 (2) Linux的內(nèi)核是不可搶占的, 當(dāng)一個(gè)任務(wù)通過(guò)系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài)運(yùn)行時(shí),一個(gè)具有更高優(yōu)先級(jí)的進(jìn)程,只有等待處于核心態(tài)的系統(tǒng)調(diào)用返回后方能執(zhí)行,這將導(dǎo)致優(yōu)先級(jí)逆轉(zhuǎn)。實(shí)時(shí)任務(wù)執(zhí)行時(shí)間的不確定性,顯然不能滿足硬實(shí)時(shí)應(yīng)用的要求。 (3) Linux采用對(duì)臨界區(qū)操作時(shí)屏蔽中斷的方式,在中斷處理中是不允許進(jìn)行任務(wù)調(diào)度的,從而抑制了系統(tǒng)及時(shí)響應(yīng)外部操作的能力。 (4) 缺乏有效的實(shí)時(shí)任務(wù)調(diào)度機(jī)制和調(diào)度算法。 針對(duì)這些問(wèn)題,利用Linux作為底層操作系統(tǒng),必須增強(qiáng)其內(nèi)核的實(shí)時(shí)性能,從而構(gòu)建出一個(gè)具有實(shí)時(shí)處理能力的嵌入式系統(tǒng),適應(yīng)嵌入式領(lǐng)域應(yīng)用的需要。 2.3 當(dāng)前增強(qiáng)Linux內(nèi)核實(shí)時(shí)性的主流技術(shù)
近年來(lái),人們對(duì)于Linux內(nèi)核實(shí)時(shí)性改造提出了一些方法和設(shè)想,它們采用了不同的思路和技術(shù)方案。歸納總結(jié),支持Linux的硬實(shí)時(shí)性一般有兩種策略[5]:一種是直接修改Linux內(nèi)核,重新編寫一個(gè)由優(yōu)先級(jí)驅(qū)動(dòng)的實(shí)時(shí)調(diào)度器(Real-time Scheduler),替換原有內(nèi)核中的進(jìn)程調(diào)度器sched.c,KURT是采用這一方案較為成功的實(shí)時(shí)Linux操作系統(tǒng);另外一種是在Linux內(nèi)核之外, 以可加載內(nèi)核模塊(Loadable Kernel Module)的形式添加實(shí)時(shí)內(nèi)核,確保其高響應(yīng)特性,實(shí)時(shí)內(nèi)核接管來(lái)自硬件的所有中斷,并依據(jù)是否是實(shí)時(shí)任務(wù)決定是否直接響應(yīng)。新墨西哥科技大學(xué)的RT-Linux,就是基于這種策略而開(kāi)發(fā)的。以上兩種策略有其借鑒之處,但如果綜合考慮任務(wù)響應(yīng)、內(nèi)核搶占性、實(shí)時(shí)調(diào)度策略等幾個(gè)影響操作系統(tǒng)實(shí)時(shí)性能的重要方面,它們還不能很好的滿足實(shí)時(shí)性問(wèn)題。為了增強(qiáng)嵌入式Linux實(shí)時(shí)性能,下文將就內(nèi)核時(shí)鐘精度、內(nèi)核的搶占性以及內(nèi)核調(diào)度算法等相關(guān)問(wèn)題重點(diǎn)研究相應(yīng)的解決方法。 3 改善嵌入式Linux實(shí)時(shí)性能的方法
針對(duì)Linux在實(shí)時(shí)應(yīng)用中的技術(shù)障礙,將Linux改造成為支持實(shí)時(shí)任務(wù)的嵌入式操作系統(tǒng), 主要從下面三個(gè)方面進(jìn)行著手。
3.1細(xì)化時(shí)鐘粒度
精確的計(jì)時(shí)是實(shí)時(shí)調(diào)度器正確操作所必須的,調(diào)度器通常要求在一個(gè)特定的時(shí)刻進(jìn)行任務(wù)切換,計(jì)時(shí)的錯(cuò)誤將導(dǎo)致背離計(jì)劃的調(diào)度,引起任務(wù)釋放抖動(dòng)。標(biāo)準(zhǔn)Linux系統(tǒng)時(shí)鐘精度太過(guò)粗糙,時(shí)鐘中斷周期為10ms,不能滿足特定嵌入式應(yīng)用領(lǐng)域中對(duì)于響應(yīng)時(shí)間精度的要求。因此,在實(shí)時(shí)Linux應(yīng)用中,需要細(xì)化其時(shí)鐘粒度,具體有兩種方式可以解決時(shí)鐘粒度問(wèn)題:一是通過(guò)直接修改內(nèi)核定時(shí)參數(shù)HZ的初值來(lái)細(xì)化時(shí)鐘粒度,如將標(biāo)準(zhǔn)Linux中內(nèi)核定時(shí)參數(shù)HZ改為10000, 則時(shí)鐘粒度可以達(dá)到100us,這種方式雖然會(huì)增加一些系統(tǒng)開(kāi)銷,但在強(qiáng)周期性環(huán)境下,對(duì)定時(shí)器的設(shè)置只需初始化一次,在一定程度上保證了處理效率;二是通過(guò)對(duì)可編程中斷定時(shí)器8254或先進(jìn)的可編程中斷控制器進(jìn)行編程來(lái)改進(jìn)Linux時(shí)鐘機(jī)制,以提高其時(shí)鐘的分辨率,使毫秒級(jí)的粗粒度定時(shí)器變成微秒級(jí)的細(xì)粒度定時(shí)器。
3.2 增強(qiáng)Linux內(nèi)核的搶占性
標(biāo)準(zhǔn)Linux內(nèi)核是不可搶占的,導(dǎo)致較大的延遲,增強(qiáng)內(nèi)核的可搶占性能,可提高系統(tǒng)內(nèi)核對(duì)實(shí)時(shí)任務(wù)的響應(yīng)能力。目前,有兩種方法修改Linux內(nèi)核以提高實(shí)時(shí)任務(wù)搶占非實(shí)時(shí)任務(wù)的能力:一是在內(nèi)核中增加搶占點(diǎn)的方法;二是直接將Linux內(nèi)核改造成可搶占式內(nèi)核。插入搶占點(diǎn)方法是在Linux內(nèi)核中插入一些搶占點(diǎn),當(dāng)一個(gè)系統(tǒng)調(diào)用執(zhí)行到搶占點(diǎn)時(shí),如果有更高優(yōu)先級(jí)的實(shí)時(shí)進(jìn)程正在等待運(yùn)行,那么正在執(zhí)行系統(tǒng)調(diào)用的內(nèi)核進(jìn)程將會(huì)把CPU的控制權(quán)轉(zhuǎn)交給等待運(yùn)行的實(shí)時(shí)進(jìn)程;如果沒(méi)有更高優(yōu)先級(jí)的實(shí)時(shí)進(jìn)程等待,則當(dāng)前進(jìn)程將繼續(xù)執(zhí)行,此時(shí)系統(tǒng)增加的開(kāi)銷僅僅是檢測(cè)一下調(diào)度標(biāo)志。將Linux內(nèi)核改造成可搶占式內(nèi)核方法的基本思想是產(chǎn)生運(yùn)行調(diào)度器的機(jī)會(huì),縮短任務(wù)發(fā)生到調(diào)度函數(shù)運(yùn)行的時(shí)間間隔。這種方法修改了Linux源代碼中的自旋鎖宏以避免競(jìng)爭(zhēng),并在其中引入一個(gè)稱作搶占鎖計(jì)數(shù)器(PLC)的新的計(jì)數(shù)信號(hào)允許內(nèi)核代碼搶占,當(dāng)它為0時(shí),允許搶占;當(dāng)其為大于0的任何值時(shí),禁止搶占。目前,針對(duì)這兩種修改Linux內(nèi)核的方法,已經(jīng)有兩種比較成熟的Linux內(nèi)核補(bǔ)丁被研制出來(lái):搶占式補(bǔ)丁和低時(shí)延補(bǔ)丁。其中,搶占式補(bǔ)丁是Monta Vista開(kāi)發(fā)的,它修改了內(nèi)核代碼中的spinlock宏和中斷返回代碼,使得當(dāng)前進(jìn)程可被安全搶占,當(dāng)自旋鎖釋放或者中斷線程完成時(shí),調(diào)度器就有機(jī)會(huì)執(zhí)行調(diào)度;低時(shí)延補(bǔ)丁是由Ingo Malnor提出,該方法只是在執(zhí)行時(shí)間長(zhǎng)的代碼塊上搶占,不采用強(qiáng)制式搶占,因此,如何找到延時(shí)長(zhǎng)的代碼塊是解決問(wèn)題的關(guān)鍵。 3.3 改善Linux內(nèi)核實(shí)時(shí)調(diào)度器的調(diào)度策略
將進(jìn)入系統(tǒng)的所有任務(wù)按實(shí)時(shí)性分成三類:硬實(shí)時(shí)、軟實(shí)時(shí)、非實(shí)時(shí)任務(wù)[6]。硬實(shí)時(shí)要求系統(tǒng)確保任務(wù)執(zhí)行最壞情況下的'執(zhí)行時(shí)間,即必須滿足實(shí)時(shí)事件的響應(yīng)時(shí)間的截止期限,否則,將引發(fā)致命的錯(cuò)誤;軟實(shí)時(shí)是指統(tǒng)計(jì)意義上的實(shí)時(shí),一般整體吞吐量大或整體響應(yīng)速度快,但不能保證特定任務(wù)在指定時(shí)期內(nèi)完成。針對(duì)不同的實(shí)時(shí)性任務(wù),分別采用不同的調(diào)度方法進(jìn)行處理。 為了嚴(yán)格保證硬實(shí)時(shí)任務(wù)的時(shí)限要求,改善的Linux內(nèi)核實(shí)時(shí)調(diào)度器采用了優(yōu)先級(jí)調(diào)度算法,目前最小松弛時(shí)間優(yōu)先調(diào)度算法MLF(Minimum-Laxity-First Scheduling Algorithm)是動(dòng)態(tài)優(yōu)先級(jí)調(diào)度最常見(jiàn)的實(shí)時(shí)調(diào)度策略。它在系統(tǒng)中為每一個(gè)任務(wù)設(shè)定松弛時(shí)間(任務(wù)的松弛時(shí)間等于任務(wù)的截止期減去任務(wù)執(zhí)行時(shí)間、當(dāng)前時(shí)間)即: laxity= deadline―current_time―CPU_time_needed,系統(tǒng)優(yōu)先執(zhí)行具有最小松弛時(shí)間的任務(wù)。根據(jù)就緒隊(duì)列的各任務(wù)的松弛時(shí)間來(lái)分配優(yōu)先級(jí),松弛時(shí)間最小的任務(wù)具有最高的優(yōu)先級(jí)。為了提高Linux的實(shí)時(shí)性,我們?cè)O(shè)計(jì)了MLF調(diào)度器,并把它作為可加載模塊加入Linux內(nèi)核中,在實(shí)現(xiàn)中需對(duì)內(nèi)核進(jìn)行相應(yīng)的修改。為了區(qū)分任務(wù)的類型,對(duì)基本Linux的task_struct屬性進(jìn)行改進(jìn),在其中增加SCHED_MLF調(diào)度策略,并按task_struct中的policy的取值來(lái)進(jìn)行區(qū)分, 分別用SCHED_MLF,SCHED_RR,SCHED_OTHER來(lái)標(biāo)識(shí)硬實(shí)時(shí)、軟實(shí)時(shí)、非實(shí)時(shí)任務(wù)。將處于運(yùn)行狀態(tài)的三類任務(wù)放入兩個(gè)隊(duì)列,硬實(shí)時(shí)任務(wù)放入hard_real_queue隊(duì)列, 采用MLF調(diào)度算法,軟實(shí)時(shí)和非實(shí)時(shí)任務(wù)放入non_real_queue隊(duì)列(空閑任務(wù)也在其中),沿用原內(nèi)核的RR調(diào)度算法。這兩個(gè)隊(duì)列可以用一個(gè)run_queue[2]的指針數(shù)組來(lái)指向,如圖1 所示。 圖1 雙對(duì)列任務(wù)運(yùn)行 雙隊(duì)列任務(wù)運(yùn)行過(guò)程與原內(nèi)核的單運(yùn)行隊(duì)列執(zhí)行流程的主要區(qū)別在:首先,各硬實(shí)時(shí)任務(wù)采用了MLF調(diào)度算法代替原內(nèi)核的FIFO調(diào)度,提高了Linux系統(tǒng)的實(shí)時(shí)性能。其次,在判斷是否有軟中斷需要處理之前需判斷硬實(shí)時(shí)任務(wù)隊(duì)列是否為空,如果不為空,即使存在中斷的后半部分需要處理,也要先調(diào)度硬實(shí)時(shí)任務(wù)投入運(yùn)行,在硬實(shí)時(shí)隊(duì)列為空的條件下才去處理中斷的后半部分(因?yàn)橹袛嗟暮蟀氩糠譀](méi)有硬實(shí)時(shí)任務(wù)緊急)。最后,如果沒(méi)有硬實(shí)時(shí)任務(wù)存在,則說(shuō)明只有run_queue [1]隊(duì)列中有軟實(shí)時(shí)或非實(shí)時(shí)任務(wù)存在,這時(shí)的處理方法和原內(nèi)核對(duì)單運(yùn)行隊(duì)列的處理方法相同。這樣改進(jìn)后,可以明顯提高硬實(shí)時(shí)任務(wù)的調(diào)度效率,而在沒(méi)有硬實(shí)時(shí)任務(wù)時(shí),系統(tǒng)性能沒(méi)有變化。 4 結(jié)束語(yǔ)
嵌入式技術(shù)具有廣闊的應(yīng)用前景,滲透于社會(huì)生活的諸多領(lǐng)域,把Linux應(yīng)用于嵌入式系統(tǒng),把Linux自身固有的優(yōu)越性融入嵌入式技術(shù),是嵌入式技術(shù)發(fā)展的一個(gè)重要方向。然而,由于Linux在實(shí)時(shí)應(yīng)用領(lǐng)域的技術(shù)障礙,要將其應(yīng)用在嵌入式領(lǐng)域還必須修改Linux 內(nèi)核中的各個(gè)模塊以達(dá)到滿足嵌入式實(shí)時(shí)應(yīng)用的需求。本文在分析Linux實(shí)時(shí)性的同時(shí),探討了其本身提供的一些支持實(shí)時(shí)性的機(jī)制以及在實(shí)時(shí)應(yīng)用中的技術(shù)障礙。而后,基于增強(qiáng)Linux內(nèi)核實(shí)時(shí)性的主流技術(shù),從細(xì)化時(shí)鐘粒度、增強(qiáng)內(nèi)核搶占性及實(shí)時(shí)調(diào)度策略三方面入手,提出了改善Linux實(shí)時(shí)性能的優(yōu)化方法。 參考文獻(xiàn):
[1] 趙慧斌, 李小群, 孫玉芳. 改善Linux核心可搶占性方法的研究與實(shí)現(xiàn). 計(jì)算機(jī)學(xué)報(bào), 2004, 27(2): 244-251 [2] 蔣溢, 李琳皓, 陳龍. Linux系統(tǒng)實(shí)時(shí)性探討. 重慶大學(xué)學(xué)報(bào), 2005, 28(3): 61-64 [3] 董曉峰, 顧新. 關(guān)于Linux內(nèi)核可搶占性的研究. 計(jì)算機(jī)工程, 2005, 31(1): 82-84 [4] 陳敏, 周興社. 基于嵌入式Linux的實(shí)時(shí)優(yōu)化方案. 計(jì)算機(jī)應(yīng)用研究, 2005, 22(3): 235-237 [5] 齊俊生, 崔杜武, 黑新洪. 嵌入式Linux 硬實(shí)時(shí)性的研究與實(shí)現(xiàn). 計(jì)算機(jī)應(yīng)用, 2003, 23(6): 34-36 [6] 李凡, 盧杜階, 邱鵬. 在嵌入式應(yīng)用中增強(qiáng)Linux實(shí)時(shí)性的方法研究. 華中科技大學(xué)學(xué)報(bào), 2005, 33(2)
【改善嵌入式Linux實(shí)時(shí)性能的方法研究】相關(guān)文章:
1.2017最新優(yōu)化Linux系統(tǒng)硬盤性能方法