嵌入式Linux實時效能優化

2021-09-24 22:51:57 字數 4476 閱讀 8701

1 引言

分析了linux的實時性,針對其在實時應用中的技術障礙,在參考了與此相關研究基礎上,從三方面提出了改善linux實時效能的改進措施。為提高嵌入式應用響應時間精度,提出兩種細化linux時鐘粒度方法;為增強系統核心對實時任務的響應能力,採用插入搶占點和修改核心法增強linux核心的可搶占性;為保證硬實時任務的時限要求,把原linux的單執行佇列改為雙執行佇列,硬實時任務單獨被放在乙個佇列中,並採用mlf排程演算法代替原核心的fifo排程演算法。本文分析了標準linux在實時應用中的技術障礙,參考了修改核方法的思想,從核心時鐘管理、核心的搶占性、核心排程演算法三方面論述了改善標準linux實時效能的方法。

2 linux 在實時應用中的技術障礙

2.1 linux的實時性分析

linux作為乙個通用作業系統,主要考慮的是排程的公平性和吞吐量等指標。然而,在實時方面它還不能很好地滿足實時系統方面的需要,其本身僅僅提供了一些實時處理的支援,這包括支援大部分posix標準中的實時功能,支援多工、多執行緒,具有豐富的通訊機制等;同時也提供了符合posix標準的排程策略,包括fifo排程策略、時間片輪轉排程策略和靜態優先順序搶占式排程策略。linux區分實時程序和普通程序,並採用不同的排程策略。

為了同時支援實時和非實時兩種程序,linux的排程策略簡單講就是優先順序加上時間片。當系統中有實時程序到來時,系統賦予它最高的優先順序。體現在實時性上,linux採用了兩種簡單的排程策略,即先來先服務排程(sched-fifo)和時間片輪轉排程(sched-rr)。具體是將所有處於執行狀態的任務掛接在乙個run-queue 佇列中,並將任務分成實時和非實時任務,對不同的任務,在其任務控制塊task-struct中用乙個policy屬性來確定其排程策略。對實時性要求較嚴的硬實時任務採用sched-fifo排程,使之在一次排程後執行完畢。對普通非實時程序,linux採用基於優先順序的輪轉策略。

2.2 linux在實時應用中的技術障礙

儘管linux本身提供了一些支援實時性的機制,然而,由於linux系統是以高的吞吐量和公平性為追求目標,基本上沒有考慮實時應用所要滿足的時間約束,它只是提供了一些相對簡單的任務排程策略。因此,實時性問題是將linux應用於嵌入式系統開發的一大障礙,無法在硬實時系統中得到應用。 linux在實時應用中的技術障礙具體表現在:

(1)linux系統時鐘精度太過粗糙,時鐘中斷週期為10ms,使得其時間粒度過大,加大了任務響應延遲。

(2) linux的核心是不可搶占的, 當乙個任務通過系統呼叫進入核心態執行時,乙個具有更高優先順序的程序,只有等待處於核心態的系統呼叫返回後方能執行,這將導致優先順序逆轉。實時任務執行時間的不確定性,顯然不能滿足硬實時應用的要求。

(3) linux採用對臨界區操作時遮蔽中斷的方式,在中斷處理中是不允許進行任務排程的,從而抑制了系統及時響應外部操作的能力。

(4) 缺乏有效的實時任務排程機制和排程演算法。

針對這些問題,利用linux作為底層作業系統,必須增強其核心的實時效能,從而構建出乙個具有實時處理能力的嵌入式系統,適應嵌入式領域應用的需要。2.3 當前增強linux核心實時性的主流技術

近年來,人們對於linux核心實時性改造提出了一些方法和設想,它們採用了不同的思路和技術方案。歸納總結,支援linux的硬實時性一般有兩種策略[5]:一種是直接修改linux核心,重新編寫乙個由優先順序驅動的實時排程器(real-time scheduler),替換原有核心中的程序排程器sched.c,kurt是採用這一方案較為成功的實時linux作業系統;另外一種是在linux核心之外, 以可載入核心模組(loadable kernel module)的形式新增實時核心,確保其高響應特性,實時核心接管來自硬體的所有中斷,並依據是否是實時任務決定是否直接響應。新墨西哥科技大學的 rt-linux,就是基於這種策略而開發的。以上兩種策略有其借鑑之處,但如果綜合考慮任務響應、核心搶占性、實時排程策略等幾個影響作業系統實時效能的重要方面,它們還不能很好的滿足實時性問題。為了增強嵌入式linux實時效能,下文將就核心時鐘精度、核心的搶占性以及核心排程演算法等相關問題重點研究相應的解決方法。

3 改善嵌入式linux實時效能的方法

針對linux在實時應用中的技術障礙,將linux改造成為支援實時任務的嵌入式作業系統, 主要從下面三個方面進行著手。

3.1細化時鐘粒度

精確的計時是實時排程器正確操作所必須的,排程器通常要求在乙個特定的時刻進行任務切換,計時的錯誤將導致背離計畫的排程,引起任務釋放抖動。標準 linux系統時鐘精度太過粗糙,時鐘中斷週期為10ms,不能滿足特定嵌入式應用領域中對於響應時間精度的要求。因此,在實時linux應用中,需要細化其時鐘粒度,具體有兩種方式可以解決時鐘粒度問題:一是通過直接修改核心定時引數hz的初值來細化時鐘粒度,如將標準linux中核心定時引數hz改為10000, 則時鐘粒度可以達到100us,這種方式雖然會增加一些系統開銷,但在強週期性環境下,對定時器的設定只需初始化一次,在一定程度上保證了處理效率;二是通過對可程式設計中斷定時器8254或先進的可程式設計中斷控制器進行程式設計來改進linux時鐘機制,以提高其時鐘的解析度,使毫秒級的粗粒度定時器變成微秒級的細粒度定時器。

3.2 增強linux核心的搶占性

標準linux核心是不可搶占的,導致較大的延遲,增強核心的可搶占效能,可提高系統核心對實時任務的響應能力。目前,有兩種方法修改linux核心以提高實時任務搶占非實時任務的能力:一是在核心中增加搶占點的方法;二是直接將linux核心改造成可搶占式核心。插入搶占點方法是在linux核心中插入一些搶占點,當乙個系統呼叫執行到搶占點時,如果有更高優先順序的實時程序正在等待執行,那麼正在執行系統呼叫的核心程序將會把cpu的控制權轉交給等待執行的實時程序;如果沒有更高優先順序的實時程序等待,則當前程序將繼續執行,此時系統增加的開銷僅僅是檢測一下排程標誌。將linux核心改造成可搶占式核心方法的基本思想是產生執行排程器的機會,縮短任務發生到排程函式執行的時間間隔。這種方法修改了linux源**中的自旋鎖巨集以避免競爭,並在其中引入乙個稱作搶占鎖計數器(plc)的新的計數訊號允許核心**搶占,當它為0時,允許搶占;當其為大於0的任何值時,禁止搶占。目前,針對這兩種修改 linux核心的方法,已經有兩種比較成熟的linux核心補丁被研製出來:搶占式補丁和低時延補丁。其中,搶占式補丁是monta vista開發的,它修改了核心**中的spinlock巨集和中斷返回**,使得當前程序可被安全搶占,當自旋鎖釋放或者中斷執行緒完成時,排程器就有機會執行排程;低時延補丁是由ingo malnor提出,該方法只是在執行時間長的**塊上搶占,不採用強制式搶占,因此,如何找到延時長的**塊是解決問題的關鍵。

3.3 改善linux核心實時排程器的排程策略

將進入系統的所有任務按實時性分成三類:硬實時、軟實時、非實時任務[6]。硬實時要求系統確保任務執行最壞情況下的執行時間,即必須滿足實時事件的響應時間的截止期限,否則,將引發致命的錯誤;軟實時是指統計意義上的實時,一般整體吞吐量大或整體響應速度快,但不能保證特定任務在指定時期內完成。針對不同的實時性任務,分別採用不同的排程方法進行處理。

為了嚴格保證硬實時任務的時限要求,改善的linux核心實時排程器採用了優先順序排程演算法,目前最小鬆弛時間優先排程演算法mlf(minimum- laxity-first scheduling algorithm)是動態優先順序排程最常見的實時排程策略。它在系統中為每乙個任務設定鬆弛時間(任務的鬆弛時間等於任務的截止期減去任務執行時間、當前時間)即: laxity= deadline―current_time―cpu_time_needed,系統優先執行具有最小鬆弛時間的任務。根據就緒佇列的各任務的鬆弛時間來分配優先順序,鬆弛時間最小的任務具有最高的優先順序。為了提高linux的實時性,我們設計了mlf排程器,並把它作為可載入模組加入linux核心中,在實現中需對核心進行相應的修改。為了區分任務的型別,對基本linux的task_struct屬性進行改進,在其中增加sched_mlf排程策略,並按task_struct中的policy的取值來進行區分, 分別用sched_mlf,sched_rr,sched_other來標識硬實時、軟實時、非實時任務。將處於執行狀態的三類任務放入兩個佇列,硬實時任務放入hard_real_queue佇列, 採用mlf排程演算法,軟實時和非實時任務放入non_real_queue佇列(空閒任務也在其中),沿用原核心的rr排程演算法。這兩個佇列可以用乙個 run_queue[2]的指標陣列來指向,如圖1 所示。

圖1 雙對列任務執行

雙佇列任務執行過程與原核心的單執行佇列執行流程的主要區別在:首先,各硬實時任務採用了mlf排程演算法代替原核心的fifo排程,提高了 linux系統的實時效能。其次,在判斷是否有軟中斷需要處理之前需判斷硬實時任務佇列是否為空,如果不為空,即使存在中斷的後半部分需要處理,也要先排程硬實時任務投入執行,在硬實時隊列為空的條件下才去處理中斷的後半部分(因為中斷的後半部分沒有硬實時任務緊急)。最後,如果沒有硬實時任務存在,則說明只有run_queue [1]佇列中有軟實時或非實時任務存在,這時的處理方法和原核心對單執行佇列的處理方法相同。這樣改進後,可以明顯提高硬實時任務的排程效率,而在沒有硬實時任務時,系統效能沒有變化。

4 結束語

本文在分析linux實時性的同時,**了其本身提供的一些支援實時性的機制以及在實時應用中的技術障礙。而後,基於增強linux核心實時性的主流技術,從細化時鐘粒度、增強核心搶占性及實時排程策略三方面入手,提出了改善linux實時效能的優化方法。

嵌入式系統的效能優化

嵌入式系統的啟動速度因裝置的效能和 的質量而異,但總體而言,從消費者的角度考慮,系統的啟動速度肯定是越快越好。因此,對嵌入式系統進行效能優化,加快裝置的啟動時間為專案後期必須進行的一項工作。需要注意的是 嵌入式linux裝置的優化不是一蹴而就的,而是乙個不斷優化,不斷改進的過程。現將自己掌握的嵌入式...

嵌入式Linux 系統優化

1.嵌入式linux介紹 嵌入式系統的關鍵特性是處理特定的任務,因此工程師能對其進行優化,以降低產品的體積和成本,提公升可靠性和效能。比起發行版的linux 系統,嵌入式linux 以linux 為藍本,進行了大規模的裁剪,只保留目標平台需要用到的東西。其保留了linux 的開放性,並且也具體嵌入式...

嵌入式 Linux 實時化之路 總覽

引子 最近做了linux的實時方面的一些摸索,從xenomai rt patch都進行了應用,花了不少功夫,也走了不少彎路。特在此記錄下,既給自己做個記錄總結,如能給任然針扎在linux 實時性方面探索的一些參考也算善莫大焉。使用linux已經不是啥新鮮事了,但一遇到效能問題總拿linux實時性說事...