Linux操作系統(tǒng)實(shí)時性分析及改進(jìn)策略
出處:tyw 發(fā)布于:2007-04-19 09:24:05
1 前言
實(shí)時系統(tǒng)可以定義為"一個能夠在事先指定或確定的時間內(nèi)完成系統(tǒng)功能和對外部或內(nèi)部、同步或異步事件作出響應(yīng)的系統(tǒng)"。實(shí)時操作系統(tǒng) (Realtime OS)是實(shí)時系統(tǒng)中使用的操作系統(tǒng)。實(shí)時操作系統(tǒng)的任務(wù)不只是要求完成每一個工作,并且要按照給定的時限按時完成每一個工作,所以實(shí)時操作系統(tǒng)必須能夠確保其任務(wù)對時間的要求。
實(shí)時有硬實(shí)時和軟實(shí)時之分。硬實(shí)時和軟實(shí)時的區(qū)別就在于對外界的事件做出反應(yīng)的時間。硬實(shí)時系統(tǒng)必須是及時對事件做出反應(yīng),不能錯過事件處理的deadline情況。在硬實(shí)時系統(tǒng)中如果出現(xiàn)了這樣的情況就意味著巨大的損失和災(zāi)難。比如說核電站中的堆芯溫度控制系統(tǒng),如果沒有對堆芯過熱做出及時的處理,后果不堪想象。軟實(shí)時系統(tǒng)是指,如果在系統(tǒng)負(fù)荷較重的時候,允許發(fā)生錯過deadline的情況而且不會造成太大的危害。比如說程控電話系統(tǒng)允許在105個電話中有一個接不通。
現(xiàn)有的Linux是一個通用的操作系統(tǒng),它是按照分時系統(tǒng)的目標(biāo)設(shè)計(jì)的,進(jìn)程調(diào)度強(qiáng)調(diào)平衡各進(jìn)程之間的響應(yīng)時間來保證公平的CPU時間占用。雖然采用了許多技術(shù)來加快系統(tǒng)運(yùn)行和反應(yīng)速度,但它本質(zhì)上不是一個實(shí)時操作系統(tǒng)。為了保證其實(shí)時性,必須采用一定的策略加以改進(jìn)。
2 影響Linux實(shí)時性能的主要因素
在Linux系統(tǒng)中,響應(yīng)中斷的過程如下:設(shè)備產(chǎn)生一個中斷、中斷處理函數(shù)開始執(zhí)行、喚醒任務(wù)并在運(yùn)行隊(duì)列排隊(duì)、任務(wù)獲取CPU并開始執(zhí)行、任務(wù)執(zhí)行完畢。為事件處理過程各個階段圖以及影響響應(yīng)時間的因素(每個階段下面的字母A~J表示這個階段中影響響應(yīng)時間的因素):
由圖中可以分析出導(dǎo)致Linux系統(tǒng)不能滿足實(shí)時系統(tǒng)短的響應(yīng)時間和確定的執(zhí)行行為的要求的主要因素有以下方面:
(1)Linux操作系統(tǒng)存在關(guān)中斷的機(jī)制。導(dǎo)致的結(jié)果是:如果低優(yōu)先級的進(jìn)程由于進(jìn)入臨界區(qū)或者為了盡快完成任務(wù)而關(guān)閉了中斷,那么即使有高優(yōu)先級實(shí)時進(jìn)程的中斷發(fā)生系統(tǒng)也無法響應(yīng)。這種情況在實(shí)時系統(tǒng)中是不允許發(fā)生的。
(2)Linux操作系統(tǒng)內(nèi)核是禁止搶占的。一個進(jìn)程一旦進(jìn)入內(nèi)核,它將運(yùn)行直到系統(tǒng)調(diào)用結(jié)束或進(jìn)程被阻塞。這時候一個高優(yōu)先級的實(shí)時進(jìn)程只能等待。這樣的設(shè)計(jì)是為了簡化任務(wù)調(diào)度,但對實(shí)時進(jìn)程來說這樣的時間等待是不允許的。
(3)Linux使用的是基于優(yōu)先級的任務(wù)調(diào)度策略。這種調(diào)度策略不能保證實(shí)時任務(wù)按時完成。Linux雖然給實(shí)時進(jìn)程提供了較高的優(yōu)先級,但是,并沒有加入時間限制。例如完成的期限、應(yīng)在多長時間內(nèi)完成、執(zhí)行周期等等。例如,Linux的基于時間片的調(diào)度策略可能使得一個實(shí)時進(jìn)程在一個時間片內(nèi)未完成,其優(yōu)先級將降低,從而可能造成到截止時間實(shí)時任務(wù)無法完成。
(4)其他方面
Linux利用交換空間讓進(jìn)程運(yùn)行在一個比實(shí)際內(nèi)存大的虛擬內(nèi)存空間中。當(dāng)進(jìn)程訪問的虛擬內(nèi)存的內(nèi)容在交換空間里時,Linux就要把在交換空間里的頁面交換到實(shí)際的內(nèi)存中,而這段時間是不可預(yù)測的,這造成了實(shí)時響應(yīng)時間的不確定性;
在Linux中,高優(yōu)先級的進(jìn)程不能搶占低優(yōu)先級進(jìn)程的資源。即如果高優(yōu)先級的進(jìn)程要使用低優(yōu)先級進(jìn)程正在使用的資源時,它必須等待低優(yōu)先級的進(jìn)程釋放資源,這樣容易產(chǎn)生優(yōu)先級倒置;
另外,Linux的周期模式定時器頻率僅為100Hz,遠(yuǎn)不能滿足多種實(shí)時應(yīng)用的要求。
Linux之所以有以上問題,是因?yàn)樗饕脑O(shè)計(jì)原則是限度的利用各種資源,力求公平的調(diào)度各個進(jìn)程,以獲得的整體性能,這也正是通用操作系統(tǒng)的設(shè)計(jì)原則。
3 Linux關(guān)中斷機(jī)制
Linux內(nèi)核可以看成是一個不斷對請求進(jìn)行響應(yīng)的服務(wù)器,這些請求可能來自正在cpu上執(zhí)行的進(jìn)程,也可能來自正在執(zhí)行中斷請求的外部設(shè)備。因此,內(nèi)核的各個部分并不是嚴(yán)格按照順序依次執(zhí)行的,而是采用交錯執(zhí)行的方式。內(nèi)核控制路徑是指內(nèi)核用來處理系統(tǒng)調(diào)用、異?;蛑袛嗨鶊?zhí)行的指令序列。在交錯執(zhí)行內(nèi)核控制路徑時,要避免可能帶來的數(shù)據(jù)混亂的危險,因此引入了臨界區(qū)的概念。臨界區(qū)是指一段代碼,在其他的內(nèi)核控制路徑能夠進(jìn)入臨界區(qū)前,進(jìn)入臨界區(qū)的每一內(nèi)核控制路徑都必須全部執(zhí)行完這段代碼。
另外,在Linux操作系統(tǒng)中,大部分外部中斷都是開啟的,中斷處理一般由設(shè)備驅(qū)動程序來完成。由于通用操作系統(tǒng)中的用戶進(jìn)程一般都沒有實(shí)時性要求,而中斷處理程序直接跟硬件設(shè)備交互,可能有實(shí)時性要求,因此中斷處理程序的優(yōu)先級被設(shè)定為高于任何用戶進(jìn)程。 但對于實(shí)時操作系統(tǒng)采用上述的中斷處理機(jī)制是不合適的。外部中斷是環(huán)境向?qū)崟r操作系統(tǒng)進(jìn)行的輸入,它的頻度是與環(huán)境變化的速率相關(guān)的,而與實(shí)時操作系統(tǒng)無關(guān)。如果外部中斷產(chǎn)生的頻度不可預(yù)測,則一個實(shí)時任務(wù)在運(yùn)行時被中斷處理程序阻塞的時間開銷也是不可預(yù)測的,從而使任務(wù)的實(shí)時性得不到保證。因此,Linux內(nèi)核的進(jìn)程經(jīng)常關(guān)閉中斷以盡快完成自己的任務(wù)。但同時也引入了問題:如果低優(yōu)先級的進(jìn)程關(guān)閉了中斷,那么即使有高優(yōu)先級實(shí)時進(jìn)程的中斷發(fā)生系統(tǒng)也無法響應(yīng)。這種情況在實(shí)時系統(tǒng)中也是不允許發(fā)生的。
4、RTLinux的雙內(nèi)核解決方案
4.1基本思想
針對Linux的關(guān)中斷機(jī)制,RTLinux提出了采用虛擬機(jī)技術(shù)模擬Linux關(guān)中斷的解決方法?;舅枷肴缦拢篖inux不直接與中斷控制硬件進(jìn)行聯(lián)系,而是在二者之間加入了一個中斷控制硬件的仿真層,這個仿真層只提供實(shí)時服務(wù),它使得Linux在不能禁止中斷的同時,還能對Linux內(nèi)核的同步需求提供支持。一旦中斷到來,就先由該仿真層處理,在仿真層完成了所有需要進(jìn)行的實(shí)時處理后,才會交給Linux進(jìn)行進(jìn)一步的處理。如果Linux已經(jīng)進(jìn)行了禁止中斷的操作,則仿真層只是將該中斷標(biāo)記為處于掛起狀態(tài)。當(dāng)Linux進(jìn)行了允許中斷的操作后,仿真層就會將控制切換到處于掛起狀態(tài)的、具有優(yōu)先級中斷的中斷處理程序。
4.2工作原理
將Linux操作系統(tǒng)內(nèi)核作為一個任務(wù)執(zhí)行在一個小的實(shí)時操作系統(tǒng)之上。事實(shí)上,Linux是這個實(shí)時操作系統(tǒng)的空閑的任務(wù),它僅在沒有實(shí)時任務(wù)運(yùn)行的情況下執(zhí)行。Linux作為一個任務(wù)本身不能禁止中斷。解決Linux禁止中斷的問題是通過在實(shí)時內(nèi)核中模擬Linux中斷例程完成的。當(dāng)Linux內(nèi)核執(zhí)行cli()禁止中斷時,一個軟中斷標(biāo)志被設(shè)置。當(dāng)一個中斷發(fā)生時,實(shí)時內(nèi)核將捕獲中斷并根據(jù)這個標(biāo)志和中斷掩碼來決定是否將該中斷交給Linux內(nèi)核處理。因此,雖然允許Linux禁止中斷,但中斷對實(shí)時內(nèi)核總是可見的。如果該中斷將引起一個實(shí)時任務(wù)的執(zhí)行,則實(shí)時內(nèi)核保存Linux的狀態(tài)并立即開始執(zhí)行實(shí)時任務(wù)。如果不是實(shí)時中斷,中斷就被掛起,之后查看Linux對該中斷的操作狀態(tài),如果Linux沒有禁止此中斷,就將該中斷交給Linux,由Linux執(zhí)行相應(yīng)的中斷處理函數(shù)。如果Linux禁止中斷,則在Linux重新開啟中斷時,實(shí)時內(nèi)核處理所有掛起的中斷交由Linux執(zhí)行相應(yīng)的中斷處理函數(shù)。
4.3具體實(shí)現(xiàn)
對于軟中斷,RT-Linux在初始化模塊Init_module()中首先調(diào)用結(jié)構(gòu)相關(guān)函數(shù)arch_takeover() 來覆蓋原來的關(guān)中斷相關(guān)的函數(shù),主要有:使用rtl_soft_cli替換__cli;使用rtl_soft_sti替換__sti;使用rtl_soft_save_flags替換__save_flags_ptr;使用rtl_soft_restore_flags替換__restore_flags。
處理中斷時,使用rtl_intercept()來代替do_IRQ(),用來執(zhí)行與一個中斷相關(guān)的所有中斷服務(wù)例程。這里主要做的修改是將實(shí)時中斷與普通Linux中斷分開處理。
1)它首先調(diào)用函數(shù)rtl_irq_controller_get_irq(regs)判斷是否獲取到中斷,
2)如果獲取到中斷,并且是實(shí)時irq請求,就調(diào)用dispatch_rtl_handler執(zhí)行實(shí)時irq對應(yīng)的中斷服務(wù)例程,然后,從中斷返回。
3)如果是非實(shí)時irq請求,就掛起irq請求G_PEND(irq),設(shè)置掛起標(biāo)志表明有掛起的irq請求G_SET(g_pend_since_sti)。
若Linux開啟了中斷,就解除irq掛起狀態(tài)G_UNPEND(irq),調(diào)用函數(shù)dispatch_Linux_irq執(zhí)行該irq對應(yīng)中斷服務(wù)程序,之后從中斷返回。
當(dāng)實(shí)時進(jìn)程與普通進(jìn)程進(jìn)行通信時使用實(shí)時FIFO技術(shù)。當(dāng)insmod將rtl_fifo.o驅(qū)動程序插入Linux內(nèi)核時,該驅(qū)動程序?qū)⒆约鹤詾镽TLinux的一部分,并成為Linux驅(qū)動程序。一旦插入Linux內(nèi)核,用戶空間進(jìn)程和實(shí)時任務(wù)都可使用實(shí)時FIFO,如所示。
任何硬實(shí)時任務(wù)都是在RTLinux的控制下運(yùn)行的,該任務(wù)一般可執(zhí)行周期性任務(wù)、處理中斷并與I/O設(shè)備驅(qū)動程序通信,以采集或輸出模擬和數(shù)字信息。當(dāng)實(shí)時任務(wù)需要告訴用戶進(jìn)程有一個事件將發(fā)生時,它便將這一消息送給實(shí)時FIFO。每一個FIFO都是在一個方向上傳送數(shù)據(jù):從實(shí)時任務(wù)到用戶空間,或反之。因此,雙向通信需要使用兩個FIFO。
下面說明實(shí)時FIFO的使用方法:
1)FIFO是在init_module()時調(diào)用rtf_create()創(chuàng)建的,在cleanup_module()中調(diào)用rtf_destroy()撤銷。
2)在創(chuàng)建FIFO時,可以調(diào)用rtf_create_handler()注冊該實(shí)時FIFO的處理程序。每次Linux進(jìn)程讀或?qū)懺揊IFO時,rtl_fifo驅(qū)動程序都要調(diào)用該處理程序。
3)對FIFO的寫入和讀出是通過函數(shù)rtf_put()和rtf_get()來實(shí)現(xiàn)的。任何讀出或?qū)懭雽?shí)時任務(wù)一側(cè)的操作都是非模塊操作,因此rtf_put()和rtf_get()都立即返回,而不管FIFO狀態(tài)是什么。
如上例數(shù)據(jù)采集,可以注冊一個FIFO。當(dāng)有中斷表明數(shù)據(jù)到來時,該中斷服務(wù)例程可以調(diào)用rtf_put()將數(shù)據(jù)寫入FIFO,而Linux進(jìn)程就可以使用rtf_get()從FIFO中讀出數(shù)據(jù)進(jìn)行處理。
5、結(jié)束語
RTLinux的雙內(nèi)核解決方案還可以結(jié)合實(shí)時內(nèi)核與非實(shí)時OS內(nèi)核的綜合優(yōu)勢,實(shí)時進(jìn)程與普通Linux進(jìn)程之間使用實(shí)時FIFO傳遞信息。即可以提高實(shí)時系統(tǒng)的可用性,也可以節(jié)省計(jì)算資源,同時將實(shí)時系統(tǒng)的一部分任務(wù)劃分出來,降低了實(shí)時內(nèi)核需要處理的復(fù)雜度,提高了實(shí)時的計(jì)算效率。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計(jì)實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識2025/7/14 16:59:04
- 高速PCB信號完整性(SI)設(shè)計(jì)核心實(shí)操規(guī)范
- 鎖相環(huán)(PLL)中的環(huán)路濾波器:參數(shù)計(jì)算與穩(wěn)定性分析
- MOSFET反向恢復(fù)特性對系統(tǒng)的影響
- 電源IC在惡劣環(huán)境中的防護(hù)設(shè)計(jì)
- 連接器耐腐蝕性能測試方法
- PCB電磁兼容(EMC)設(shè)計(jì)與干擾抑制核心實(shí)操規(guī)范
- 用于相位噪聲測量的低通濾波器設(shè)計(jì)與本振凈化技術(shù)
- MOSFET在高頻開關(guān)中的EMI問題
- 電源IC在便攜式設(shè)備中的設(shè)計(jì)要點(diǎn)
- 連接器結(jié)構(gòu)設(shè)計(jì)常見問題分析









