1 引言
嵌入式Linux(Embedded Linux)是指對桌面型 Linux經過小型化裁剪后,能夠固化在容量只有幾百K 字節(jié)或幾兆字節(jié)的存儲器芯片或單片機中,應用于特定嵌入式場合、為嵌入式應用程序提供操作系統(tǒng)服務的專用Linux 操作系統(tǒng)。
"實時性"是指計算機系統(tǒng)在確定的時間內完成規(guī)定的功能,并能夠對外部的異步事件做出正確響應的能力。實時性又可分為軟實時(Soft Real-time)和硬實時(Hard Real-time)兩種。軟實時是指統(tǒng)計意義上的實時,一般整體吞吐量大或整體響應速度快,但不能保證特定的任務在指定的時間內完成。硬實時則是指時間要求必須被嚴格保證的實時,對任務的執(zhí)行時限的要求非常嚴格,無論在什么情況下,任務的執(zhí)行實現必須得到絕對保證,否則將產生災難性后果。這才是真正意義上的實時 [1]。Linux有很好的"平均"性能,具有一定的軟實時性,但不是硬實時的操作系統(tǒng),因此要使Linux成為真正的實時操作系統(tǒng)必須對其作一些相關的改造。
2 標準Linux內核制約實時性的因素[2]
實時系統(tǒng)主要考慮任務的按時完成、盡量減少進程運行時的不可預測性等,而Linux 一開始并不是針對要求實時性非常強的嵌入式領域開發(fā)的,因此其實時性比較弱。過長的中斷禁止時間、非搶占式的內核以及耗盡式的、機會均等的進程調度策略是Linux 實時性不強的幾個主要原因。
2.1 不確定的任務切換時間
確定的任務切換時間和中斷延遲時間是實時操作系統(tǒng)區(qū)別于普通操作系統(tǒng)的一個重要標志,是衡量實時操作系統(tǒng)的實時性的重要標準。
任務切換時間包括保存目前任務的時間,新任務調入系統(tǒng)的時間和操作系統(tǒng)選擇下一個任務的調度時間,其中任務調度時間是決定任務切換時間長短的主要因素。而影響這一時間的因素主要是任務調度策略和被調度的任務數。調度策略越簡單,被調度的任務總數越少,調度時間就越短。對一個實時性能較強的操作系統(tǒng)而言,系統(tǒng)必須規(guī)定不同進程的優(yōu)先級,把不同類型的進程分成不同的隊列,并把優(yōu)先級作為唯一的進程調度標準,盡量縮短任務調度時間。
Linux 在內核1.3 版本之后加進了POSIX 實時擴展部分,引進了實時進程概念,允許將一個進程的屬性確定為實時進程。Linux 從調度策略上區(qū)分實時進程和普通進程,實時進程先于普通進程運行,并采用不同的調度策略。對實時進程,Linux 采用兩種調度策略,即先來先服務調度(SCHED_FIFO)和時間片輪轉調度(SCHED_RR)。SCHED_RR 任務最先被調度并擁有時間片,一旦時間片用完就被移動到優(yōu)先級隊列的隊尾,并允許同一優(yōu)先級的其他任務運行。如果同一優(yōu)先級沒有其他任務,該任務將繼續(xù)運行下一個時間片。SCHED_FIFO 是運行直至阻塞的策略。其任務按優(yōu)先級調度,一旦開始就一直運行到結束或者阻塞在某種資源上。它們不像SCHED_RR 任務那樣共享處理器。
2.2 中斷延遲時間
上面我們提到,中斷延遲時間也是實時操作系統(tǒng)區(qū)別于普通操作系統(tǒng)的一個重要標志。
中斷延遲時間是指系統(tǒng)確認中斷開始直到執(zhí)行中斷服務程序的第一條指令為止整個處理過程所需要的時間。操作系統(tǒng)的中斷延遲時間由下列三個因素決定:
?。?)處理器硬件電路的延遲時間,通常這個時間可以忽略。
?。?)操作系統(tǒng)處理中斷并將控制權轉移給相關處理程序所需要的時間。
?。?)操作系統(tǒng)的中斷禁止時間。
測試表明,產生中斷延遲的原因除了處理器響應時間外,更重要的是操作系統(tǒng)的一些操作會大大增加中斷被延遲的時間。在操作系統(tǒng)運行過程中,存在著一些關鍵的操作。這些操作在執(zhí)行時,操作系統(tǒng)會禁止在其間插入任何中斷。例如:ISR在執(zhí)行時候,外部中斷是被禁止的。因此如果一個中斷請求在操作系統(tǒng)禁止中斷的這段時間里產生,那么對它的處理就會始終保持在掛起狀態(tài),直到操作系統(tǒng)重新允許中斷插入。會有這樣的一種情況出現,即使Linux本身的中斷響應時間非常短,如果在一個ISR執(zhí)行期間某個外設也產生了一個中斷信號,因為正在執(zhí)行的ISR運行時間的不確定性和不可搶占性,也會產生Linux的中斷延時的不可預測性。
2.3 共享資源的互斥訪問
Linux操作系統(tǒng)一般采用信號量機制來解決共享資源的互斥訪問問題。如果任務調度采用基于優(yōu)先級的方式,則傳統(tǒng)的信號量機制在系統(tǒng)運行時很容易造成優(yōu)先級倒置問題,即當一個高優(yōu)先級任務通過信號量機制訪問共享資源時,該信號量已被一低優(yōu)先級任務占有,而這個低優(yōu)先級任務在訪問共享資源時可能又被其它一些中等優(yōu)先級的任務搶先,因此造成高優(yōu)先級任務被許多具有較低優(yōu)先級的任務阻塞,實時性難以得到保證。
3 嵌入式Linux的實時化方案[3] [5] [6]3.1 實時進程的調度
為實現Linux 的實時性,可以將內核中的進程調度遵循POSIX 標準進行改寫,在Linux 內核限定的范圍內,通過對源代碼的修改,盡可能地擴充其實時性,使Linux 變成一個真正的實時操作系統(tǒng)。
這需要精心選擇改動部分,一般要完全重新編寫一個由優(yōu)先級驅動的實時調度器,替換原有內核中的進程調度器。對于不同的進程,采用不同的調度策略,例如對實時進程實現搶占式的調度。我們可以找出Linux 所有系統(tǒng)調用中的關鍵代碼段,在執(zhí)行關鍵代碼段時,設置標志位來決定是否允許進行任務切換,并且可以在內核函數中增加搶占點的個數,在保證其操作互斥性的同時,增強內核的可搶占性,實現一種可搶占的內核。對于采用搶占式核心程序設計,系統(tǒng)可能出現的優(yōu)先級反轉問題,可以采用優(yōu)先級繼承或優(yōu)先級天花板的方式來解決。這種方案的最大優(yōu)點在于系統(tǒng)執(zhí)行效率高,可以獲得更好的性能。但是,它要求開發(fā)人員精通Linux 內核,并且開發(fā)難度大、開發(fā)周期長。
3.2 時鐘粒度的細化
通過將周期性的時鐘中斷改為非周期性的時鐘中斷這種簡單而且代價較小的方式,從而達到細化時鐘粒度的目標。提供與標準Linux核心時鐘并行運行的一個具有精密刻度的實時核心時鐘處理系統(tǒng),與原Linux 核心時鐘區(qū)別開來。不但提高了系統(tǒng)的穩(wěn)定性和效率,而且獨立的實時核心時鐘易于維護改進。所有實時定時器都是由堆的數據結構組織和管理的。在時鐘中斷的處理函數do_timer_interupt()(arch/386/kernel/Time.c)中,調用相應的函數處理實時定時器隊列。具體過程為判斷堆頂定時器是否到期,如果到期,則調用其服務函數。
3.3 中斷的實時性改進[4]
軟中斷運行的時機之一就是在中斷服務的末尾。Linux中斷服務函數中進行軟中斷處理的代碼如下[4] :
asmlinkage unsigned int do_IRQ(struct pt_regs regs)
{
……
if (softirq_active(cpu) &softirq_mask(cpu))
do_softirq();
return 1;
}
其中do_IRQ()是Linux中斷服務函數,此函數針對特定的中斷運行相應的上半部分。函數do_softirq()是軟中斷處理函數。在do_IRQ()處理完上半部分時,如果有等待的軟中斷需要處理,那么就會調用do_softirq(),處理待運行的軟中斷。如果中斷上半部分需要下半部分被處理,那么下半部分也會在do_softirq()中被運行。我們知道,Linux之所以將中斷分為兩個部分,就是為了將不著急的事務推遲處理從而減少中斷服務時間?,F在,如果do_IRQ()中軟中斷的處理時間過長,那么do_IRQ()的處理時間也會相應變長,從而增加了中斷服務時間。為了進一步減少中斷服務時間,我們可以考慮在中斷處理函數中對中斷進行區(qū)別對待。對于不頻繁的外部中斷,如鍵盤、時鐘等,保留軟中斷處理。而當系統(tǒng)需要處理某些頻率較高的外部中斷時,我們可以考慮繞過軟中斷的處理,只處理上半部分。由于軟中斷本身不是急需處理的,并且還可以在進程調度之前和系統(tǒng)調用結束時運行,因此,這里將它去掉對系統(tǒng)性能的影響不大。
4 結論
由于Linux本身基于通用目的操作系統(tǒng)的設計,其實時性能并不是很強。但通過一定的改進增強其實時性能,就可以用于實時的應用場合。本文在分析了標準Linux實時性的基礎上,并就實時進程的調度、中斷、時鐘三個方面提出了一些改進的方法,以進一步提高Linux操作系統(tǒng)的實時性能。
關鍵詞標簽:Linux
相關閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內存型號 linux tc實現ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關機、重啟、注銷 命令 查看linux服務器硬盤IO讀寫負載