劉宇帥 蘇 宇 王金波 吳晨陽(yáng)
1. 中國(guó)科學(xué)院大學(xué),北京 100049 2.中國(guó)科學(xué)院空間應(yīng)用工程與技術(shù)中心,北京 100094
為了適應(yīng)更為復(fù)雜的空間環(huán)境并完成繁雜的空間任務(wù),近些年來(lái)航天領(lǐng)域的嵌入式軟件系統(tǒng)從應(yīng)用規(guī)模、復(fù)雜度及重要性程度都保持持續(xù)上升態(tài)勢(shì)。相較于UC/OS難以滿(mǎn)足復(fù)雜的多接口通信需求,VxWorks價(jià)格昂貴且不公開(kāi)源碼的問(wèn)題,Linux以其穩(wěn)定、開(kāi)源以及容易移植等優(yōu)勢(shì),逐漸應(yīng)用在國(guó)外航空航天領(lǐng)域。2014年1月,日本宇宙航空研究開(kāi)發(fā)機(jī)構(gòu)JAXA將太陽(yáng)觀測(cè)衛(wèi)星“日出”(SOLAR-B),以及觀測(cè)衛(wèi)星GEOTAIL的衛(wèi)星管制功能轉(zhuǎn)移至Linux平臺(tái)上;Space X已將Linux廣泛應(yīng)用于航天器中,且好奇號(hào)火星探測(cè)器部分控制已由Linux實(shí)現(xiàn)。而國(guó)內(nèi)在該領(lǐng)域的研究和應(yīng)用尚屬空白。
隨著我國(guó)載人航天工程邁入載人空間站階段,載荷種類(lèi)、數(shù)量和復(fù)雜度均成倍增長(zhǎng),在未來(lái)航天器的建設(shè)中,需要利用實(shí)時(shí)操作系統(tǒng)在機(jī)制上給予保障,以保證系統(tǒng)的穩(wěn)定、可靠與高質(zhì)量,并提高軟件的開(kāi)發(fā)效率。Linux作為一個(gè)通用操作系統(tǒng),雖然有許多優(yōu)越的特性[1],但其實(shí)時(shí)性能有限[2],切換時(shí)間的不確定性對(duì)系統(tǒng)安全性造成嚴(yán)重威脅,甚至有可能造成災(zāi)難性事故,如1996年阿麗亞娜V運(yùn)載火箭失事。優(yōu)先級(jí)反轉(zhuǎn)對(duì)系統(tǒng)有致命危害,會(huì)導(dǎo)致任務(wù)錯(cuò)亂、邏輯錯(cuò)亂,造成任務(wù)調(diào)度時(shí)時(shí)間的不確定性,甚至有可能致使系統(tǒng)崩潰。例如火星探路者號(hào)(Mars Pathfinder),曾由于優(yōu)先級(jí)反轉(zhuǎn),導(dǎo)致內(nèi)部執(zhí)行邏輯出現(xiàn)bug,系統(tǒng)無(wú)故重啟。因此,針對(duì)空間站下一階段有效載荷多線程、高并發(fā)的特點(diǎn),提出采用基于Preempt RT補(bǔ)丁的Linux系統(tǒng)作為有效載荷的控制系統(tǒng),為保證在空間站階段操作系統(tǒng)的穩(wěn)定性和可靠性要求,將與空間站密切相關(guān)的任務(wù)切換時(shí)間、優(yōu)先級(jí)反轉(zhuǎn)作為重點(diǎn)進(jìn)行分析研究。
標(biāo)準(zhǔn)Linux是一款優(yōu)秀的分時(shí)操作系統(tǒng),追求的是高的系統(tǒng)吞吐率和公平性[3],但實(shí)時(shí)性不佳,主要體現(xiàn)在以下幾個(gè)方面:
1)內(nèi)核不完全可搶占,相比2.4版本的內(nèi)核,2.6版本開(kāi)始引入了內(nèi)核搶占機(jī)制,但內(nèi)核對(duì)關(guān)鍵代碼進(jìn)行保護(hù),仍然有相當(dāng)一部分區(qū)域禁止搶占,大大增加任務(wù)切換時(shí)間的不確定性;
2)時(shí)鐘顆粒度粗糙,2.6版本內(nèi)核時(shí)鐘精度可達(dá)1000Hz,但過(guò)度提高內(nèi)核時(shí)鐘精度又會(huì)犧牲系統(tǒng)的吞吐率;
3)關(guān)中斷問(wèn)題,內(nèi)核在接收到外部中斷進(jìn)入中斷處理程序后,會(huì)暫時(shí)關(guān)閉系統(tǒng)中斷;
4)優(yōu)先級(jí)翻轉(zhuǎn)問(wèn)題,標(biāo)準(zhǔn)Linux內(nèi)核并未對(duì)優(yōu)先級(jí)翻轉(zhuǎn)問(wèn)題采取保護(hù)措施,導(dǎo)致低優(yōu)先級(jí)任務(wù)搶占高優(yōu)先級(jí)任務(wù),造成不可預(yù)知的后果。
以上特性對(duì)于有實(shí)時(shí)性要求的系統(tǒng)來(lái)說(shuō)是不可容忍的,有可能給空間站系統(tǒng)帶來(lái)巨大的不確定性。因此非常有必要提升Linux的實(shí)時(shí)性能。
標(biāo)準(zhǔn)的Linux 并未提供實(shí)時(shí)的操作系統(tǒng)內(nèi)核[4],但其開(kāi)源特性讓我們可以通過(guò)改造實(shí)現(xiàn)實(shí)時(shí)性需求。目前主要有以下2種方式:①直接對(duì)標(biāo)準(zhǔn)的Linux內(nèi)核進(jìn)行修改,增強(qiáng)其實(shí)施性能;②采用雙內(nèi)核方案,對(duì)標(biāo)準(zhǔn)的Linux內(nèi)核進(jìn)行外部實(shí)時(shí)性擴(kuò)展,以?xún)?nèi)核可加載模塊的方式實(shí)現(xiàn)一個(gè)實(shí)時(shí)微內(nèi)核,將所有實(shí)時(shí)任務(wù)都交由實(shí)時(shí)內(nèi)核來(lái)處理[5]。與對(duì)Linux內(nèi)核進(jìn)行外部實(shí)時(shí)擴(kuò)展相比,對(duì)內(nèi)核修改使其應(yīng)用程序的開(kāi)發(fā)與標(biāo)準(zhǔn)毫無(wú)區(qū)別,可以充分利用Linux內(nèi)的各種系統(tǒng)調(diào)用,更適合在現(xiàn)有平臺(tái)上進(jìn)行Linux實(shí)時(shí)性的測(cè)試和研發(fā)。綜上,本文提出對(duì)標(biāo)準(zhǔn)Linux內(nèi)核實(shí)時(shí)化的優(yōu)化方案:重寫(xiě)實(shí)時(shí)互斥鎖、改變優(yōu)先級(jí)調(diào)度策略、增加可搶占點(diǎn)及為提高中斷響應(yīng)使其線程化等方面進(jìn)行優(yōu)化,如圖1所示。因此,本文通過(guò)選取Preempt RT補(bǔ)丁的方案來(lái)提升Linux內(nèi)核實(shí)時(shí)性。
圖1 Linux內(nèi)核優(yōu)化示意圖
實(shí)時(shí)搶占補(bǔ)丁(Realtime Preemption Patch,Preempt RT)由Ingo Molnar 和 Thomas Gleixner更新維護(hù)[6],并且由開(kāi)源自動(dòng)化實(shí)驗(yàn)室(OSADL)測(cè)試其穩(wěn)定性。核心思想是提高內(nèi)核本身的可搶占性,即讓盡可能多的代碼能夠被搶占。其實(shí)現(xiàn)方法和原有的增加實(shí)施搶占方法不同,它是在原有低延遲補(bǔ)丁和搶占補(bǔ)丁的基礎(chǔ)上加入中斷線程化、高精度時(shí)鐘、優(yōu)先級(jí)繼承等新特性,將Linux內(nèi)核修改成完全可搶占式內(nèi)核,使其具有硬實(shí)時(shí)能力[7]。實(shí)時(shí)搶占補(bǔ)丁最小化了內(nèi)核中不可搶占部分的代碼,同時(shí)也最小化了為支持搶占性所必須要修改的代碼量[8]。
可搶占內(nèi)核的實(shí)現(xiàn)對(duì)Linux具有非比尋常的意義。首先,這是將Linux應(yīng)用于實(shí)時(shí)系統(tǒng)所必需的。嚴(yán)苛的響應(yīng)時(shí)間限制是實(shí)時(shí)系統(tǒng)的特性之一,設(shè)備發(fā)生中斷后會(huì)喚醒實(shí)時(shí)進(jìn)程,該進(jìn)程需要在規(guī)定時(shí)間內(nèi)調(diào)度執(zhí)行。但現(xiàn)有內(nèi)核是不可搶占的,無(wú)法實(shí)現(xiàn)該要求,且內(nèi)核中的響應(yīng)時(shí)間不可控。在實(shí)際運(yùn)行過(guò)程中,當(dāng)較長(zhǎng)的系統(tǒng)調(diào)用被執(zhí)行時(shí),實(shí)時(shí)進(jìn)程只有在當(dāng)前內(nèi)核運(yùn)行進(jìn)程完全退出時(shí)才能執(zhí)行,現(xiàn)有環(huán)境條件下的延遲時(shí)間達(dá)到100ms的數(shù)量級(jí),對(duì)于有高實(shí)時(shí)響應(yīng)要求的系統(tǒng)來(lái)說(shuō)是不能容忍的。因此可搶占內(nèi)核不僅對(duì)Linux實(shí)現(xiàn)實(shí)時(shí)性意義非凡,也改善了Linux對(duì)某些低延遲應(yīng)用不能有效支持的問(wèn)題。
補(bǔ)丁引入了一組正交機(jī)制,減少內(nèi)核延遲并使內(nèi)核更具確定性。其中一些機(jī)制(例如高分辨率計(jì)時(shí)器和優(yōu)先級(jí)繼承)已經(jīng)被合并到了主線內(nèi)核[9]。補(bǔ)丁對(duì)內(nèi)核的提升是多方面的,本文將與空間站密切相關(guān)的任務(wù)切換時(shí)間、優(yōu)先級(jí)反轉(zhuǎn)作為重點(diǎn)進(jìn)行分析。
2.2.1 上下文切換時(shí)間
進(jìn)程運(yùn)行過(guò)程中CPU所包含的信息,包括寄存器值、進(jìn)程狀態(tài)和堆棧內(nèi)容被稱(chēng)為該進(jìn)程的上下文。當(dāng)進(jìn)程被其他進(jìn)程搶占發(fā)生中斷時(shí),系統(tǒng)會(huì)將CPU中包含的信息保存,并將搶占了CPU活動(dòng)進(jìn)程的上下文信息加載入CPU,整個(gè)過(guò)程稱(chēng)為上下文切換。而當(dāng)被搶占進(jìn)程重新獲得CPU等資源再次執(zhí)行時(shí),它能恢復(fù)自己的上下文信息并從中斷時(shí)刻重新開(kāi)始執(zhí)行,其實(shí)質(zhì)就是被中斷運(yùn)行的進(jìn)程與準(zhǔn)備運(yùn)行的進(jìn)程實(shí)現(xiàn)在CPU中上下文的切換。切換時(shí)間就是計(jì)算從保存被搶占進(jìn)程的上下文、到恢復(fù)某一原先被搶占進(jìn)程中被保存的上下文信息、最后將控制傳遞給這個(gè)新恢復(fù)的進(jìn)程整個(gè)過(guò)程的時(shí)間就是切換時(shí)間。
標(biāo)準(zhǔn)Linux內(nèi)核采用spin_lock(自旋鎖)保護(hù)臨界資源,spin_lock的一個(gè)特點(diǎn)是進(jìn)入臨界區(qū)時(shí)禁用搶占;而Preempt-rt補(bǔ)丁通過(guò)采用rt_mutex代替?zhèn)鹘y(tǒng)的禁用搶占的spin_lock,并定義了新的數(shù)據(jù)類(lèi)型:spin_lock_t,即凡是使用了該數(shù)據(jù)類(lèi)型的spin_lock不會(huì)禁用內(nèi)核搶占。因此內(nèi)核中不可搶占區(qū)域進(jìn)一步減少,增加了內(nèi)核的搶占點(diǎn),降低了上下文切換時(shí)間不確定性。
2.2.2 優(yōu)先級(jí)反轉(zhuǎn)
優(yōu)先級(jí)反轉(zhuǎn)指具有較低優(yōu)先級(jí)任務(wù)占有較高優(yōu)先級(jí)任務(wù)所需的共享資源,高優(yōu)先任務(wù)因資源無(wú)法獲得而被迫掛起,直至較低優(yōu)先級(jí)任務(wù)釋放該資源為止。由于低優(yōu)先級(jí)得到CPU時(shí)間短,若該時(shí)刻有優(yōu)先級(jí)處于高低優(yōu)先級(jí)之間的任務(wù)就緒,且不用該共享資源,則該中優(yōu)先級(jí)任務(wù)將獲得CPU時(shí)間。
如圖2所示,假設(shè)此時(shí)系統(tǒng)中有A,B,C三個(gè)線程,優(yōu)先級(jí)依次降低,其中線程A和線程C在運(yùn)行過(guò)程中都需同一共享資源。程序開(kāi)始執(zhí)行,線程C獲得資源開(kāi)始運(yùn)行,線程A由于優(yōu)先級(jí)最高在T1時(shí)刻搶占CPU并運(yùn)行。線程A需要的資源正被線程C占用,因此在T2時(shí)刻讓出CPU,與此同時(shí)優(yōu)先級(jí)較高的線程B獲得調(diào)度搶占了CPU,直至T3時(shí)刻運(yùn)行完成讓出CPU。線程B運(yùn)行結(jié)束后線程C繼續(xù)執(zhí)行。T4時(shí)刻,線程C運(yùn)行結(jié)束釋放共享資源,線程A獲得資源最后運(yùn)行。由此發(fā)現(xiàn),線程A雖然具有最高優(yōu)先級(jí)卻最后才得到運(yùn)行。
圖2 優(yōu)先級(jí)翻轉(zhuǎn)示意圖
Linux進(jìn)程調(diào)度采用動(dòng)態(tài)優(yōu)先級(jí)調(diào)度方式。系統(tǒng)會(huì)根據(jù)每個(gè)進(jìn)程的優(yōu)先級(jí)和它所采用的調(diào)度策略[10]計(jì)算權(quán)值,并以此進(jìn)行調(diào)度,簡(jiǎn)單而有效。
優(yōu)先級(jí)反轉(zhuǎn)解決方案主要有:(1)設(shè)置優(yōu)先級(jí)的上限,為臨界區(qū)設(shè)定某個(gè)高優(yōu)先級(jí),進(jìn)入該臨界區(qū)的每個(gè)進(jìn)程,如果優(yōu)先級(jí)低于設(shè)定的上線,就會(huì)獲得這一優(yōu)先級(jí);(2)優(yōu)先級(jí)繼承,如果較高優(yōu)先級(jí)進(jìn)程正在等待某一較低優(yōu)先級(jí)進(jìn)程正在占用的資源時(shí),則低優(yōu)先級(jí)進(jìn)程優(yōu)先級(jí)會(huì)提升到和高優(yōu)先級(jí)進(jìn)程一樣的優(yōu)先級(jí),在釋放共享資源后,進(jìn)程優(yōu)先級(jí)能恢復(fù)到原有優(yōu)先級(jí)狀態(tài);(3)采用中斷禁止,以禁止中斷的方法保護(hù)臨界區(qū)。在該方法下系統(tǒng)只存在2種優(yōu)先級(jí):1)可搶占優(yōu)先級(jí),是進(jìn)程一般運(yùn)行過(guò)程中所擁有的優(yōu)先級(jí);2)中斷禁止優(yōu)先級(jí),在臨界區(qū)運(yùn)行時(shí)擁有的優(yōu)先級(jí)。
Preempt RT補(bǔ)丁中采用優(yōu)先級(jí)繼承協(xié)議的方法解決此問(wèn)題。Preempt RT補(bǔ)丁為實(shí)現(xiàn)優(yōu)先級(jí)繼承,在內(nèi)核中增加了名為rt_mutex的互斥鎖。在具有補(bǔ)丁Preempt RT的Linux內(nèi)核中,自旋鎖和互斥體將轉(zhuǎn)換為實(shí)時(shí)互斥體。旋轉(zhuǎn)鎖轉(zhuǎn)換為實(shí)時(shí)自旋鎖,使用rt_mutex實(shí)現(xiàn)互斥[11]。
rt_mutex是互斥鎖結(jié)構(gòu),包含3個(gè)元素。
struct rt_mutex {
raw_spinlock_t wait_lock; /* 保護(hù)自旋鎖 */
struct plist_head wait_list; /* 等待所有waiter鏈表 */
struct task_struct *owner; /* 獲得鎖的task,沒(méi)有為NULL */
}
rt_mutex_waiter結(jié)構(gòu)是作為task在rt_mutex上掛起時(shí)的連接件而存在的,其實(shí)它邏輯上應(yīng)該是task_struct的一部分。rt_mutex waiter的數(shù)據(jù)結(jié)構(gòu)如下,用于記錄等待互斥鎖的結(jié)構(gòu):
struct rt_mutex_waiter {
struct plist_node list_entry;/* 用于將此結(jié)構(gòu)連接到對(duì)應(yīng)的互斥鎖上 */
struct plist_node pi_list_entry;/*連接到互斥鎖所有者上等待鏈表 */
struct task_struct *task; /* 此waiter所屬的task,等待此mutex的task */
struct rt_mutex *lock;/* 此waiter等待的mutex */
};
pi_waiters是進(jìn)程描述符 task_struct中用來(lái)鏈入等待該進(jìn)程持有的資源的等待者中優(yōu)先級(jí)最高的rt_mutex_waiter。task通過(guò)pi_waiters遍歷到在它持有的每個(gè)rt_mutex上掛起的最高優(yōu)先級(jí)的task(稱(chēng)作top waiter)。整個(gè)遍歷方式都由plist提供,與其相應(yīng)的不同task優(yōu)先級(jí)將作為掛起的rt_mutex_waiter排序的依據(jù)。這樣,一個(gè)task能繼承到的優(yōu)先級(jí)就是通過(guò)pi_waiters取到的第一個(gè)rt_mutex_waiter所對(duì)應(yīng)的task的優(yōu)先級(jí)。rt_mutex則通過(guò)wait_list遍歷在它身上掛起的rt_mutex_waiter,從而遍歷到掛起的task。在此需要注意的是rt_mutex.wait_list中進(jìn)程優(yōu)先級(jí)的變化會(huì)引起top waiter優(yōu)先級(jí)的改變,此時(shí)需要將原來(lái)的top waiter從task_struct的pi_waiters里面移出,再把新的top waiter加進(jìn)去,為確保這一流程有序?qū)崿F(xiàn),rt_mutex.wait_list也應(yīng)該是一個(gè)優(yōu)先級(jí)已經(jīng)排序的plist。綜上所述,preempt RT通過(guò)優(yōu)先級(jí)的繼承解決了優(yōu)先級(jí)反轉(zhuǎn)的問(wèn)題。
實(shí)時(shí)操作系統(tǒng)是一個(gè)按照時(shí)序方式調(diào)度和執(zhí)行任務(wù)、保證任務(wù)時(shí)間需求和管理系統(tǒng)資源的系統(tǒng)程序,其主要特點(diǎn)是響應(yīng)及時(shí)和可靠性高[12]。因此,在闡述了Linux內(nèi)核實(shí)時(shí)性能差的問(wèn)題,并對(duì)Preempt RT進(jìn)行分析后,下面對(duì)基于Preempt RT補(bǔ)丁的Linux的實(shí)時(shí)性從任務(wù)切換時(shí)間、優(yōu)先級(jí)反轉(zhuǎn)方面的問(wèn)題進(jìn)行測(cè)試驗(yàn)證。
接口隨著嵌入式系統(tǒng)越來(lái)越復(fù)雜,功能越來(lái)越強(qiáng)大,在設(shè)計(jì)中既需要非常靈活的FPGA,又需要處理器去做一些控制,以及配合操作系統(tǒng)使用。因此本次實(shí)驗(yàn)基于Xilinx公司ZYNQ7000系列ZC7045處理器。
ZYNQ-7000是第一代可擴(kuò)展處理平臺(tái)(Extensible Processing Platform,EPP),同時(shí)具有軟件、硬件和IO均可編程的特性。傳統(tǒng)模式中,F(xiàn)PGA和ARM之間的通信經(jīng)常成為系統(tǒng)的瓶頸。在ZYNQ7000平臺(tái)系列中,將FPGA和ARM集成在一個(gè)芯片內(nèi)部,兩者之間的通信使用AXI_HP、AXI_GP、AXI_ACP三種接口通信,帶寬可達(dá)吉比特,解決了二者通信帶寬不足的問(wèn)題。
3.2.1 測(cè)試設(shè)計(jì)
創(chuàng)建兩個(gè)或多個(gè)進(jìn)程,某個(gè)進(jìn)程在執(zhí)行過(guò)程中被其他進(jìn)程搶占或自動(dòng)掛起而讓出CPU,同時(shí)新進(jìn)程開(kāi)始執(zhí)行,進(jìn)而完成進(jìn)程間的切換,通過(guò)多次循環(huán)切換來(lái)統(tǒng)計(jì)進(jìn)程間切換時(shí)間。在本設(shè)計(jì)中以父子進(jìn)程之間通過(guò)管道通信完成上下文切換為例。
在進(jìn)程中創(chuàng)建子進(jìn)程,同時(shí)創(chuàng)建2個(gè)管道并在管道中存放定量數(shù)據(jù),管道A被用于子進(jìn)程的讀操作和父進(jìn)程的寫(xiě)操作,管道B被用于父進(jìn)程的讀操作和子進(jìn)程寫(xiě)操作。
程序運(yùn)行時(shí),子進(jìn)程循環(huán)先讀取管道A中數(shù)據(jù)并將其寫(xiě)入管道B中,當(dāng)沒(méi)有數(shù)據(jù)讀入時(shí)被阻塞,而后跳轉(zhuǎn)入父進(jìn)程。父進(jìn)程循環(huán)讀取管道B數(shù)據(jù)并寫(xiě)入管道A,當(dāng)沒(méi)有數(shù)據(jù)讀入時(shí)被阻塞再次跳轉(zhuǎn)回子進(jìn)程,這就完成一組父子進(jìn)程切換。在最初進(jìn)入子進(jìn)程時(shí)和最后退出父進(jìn)程時(shí)分別獲取時(shí)間。在父子進(jìn)程執(zhí)行過(guò)程中為確保不被其他進(jìn)程搶占CPU,在其執(zhí)行時(shí)優(yōu)先級(jí)設(shè)置為最高。將上述過(guò)程進(jìn)行5000次循環(huán)獲取10000次上下文切換的平均時(shí)間,測(cè)試流程如圖3所示。
圖3 上下文切換測(cè)試流程圖
3.2.2 實(shí)驗(yàn)結(jié)果及分析
首先在標(biāo)準(zhǔn)Linux內(nèi)核中進(jìn)行測(cè)試,得到的結(jié)果如圖4所示;再將標(biāo)準(zhǔn)內(nèi)核打入PREEMPT RT補(bǔ)丁,重新配置內(nèi)核,選擇Fully Preemptible Kernel (RT)選項(xiàng),編譯內(nèi)核并將其移植到ZC7045處理器平臺(tái)測(cè)試,結(jié)果如圖5所示,在程序執(zhí)行過(guò)程中,增加CPU的負(fù)載壓力,結(jié)果如圖6所示:
圖4 標(biāo)準(zhǔn)內(nèi)核上下文切換時(shí)間測(cè)試結(jié)果
圖5 補(bǔ)丁內(nèi)核無(wú)負(fù)載切換時(shí)間
圖6 補(bǔ)丁內(nèi)核有負(fù)載切換時(shí)間
將上述實(shí)驗(yàn)數(shù)據(jù)進(jìn)行對(duì)比分析可得:對(duì)比圖4和5不難看出,Preempt RT補(bǔ)丁可以使內(nèi)核上下文切換10000次的平均時(shí)間范圍更加集中,補(bǔ)丁內(nèi)核的切換時(shí)間平均值為15.9μs,方差為0.88,均小于標(biāo)準(zhǔn)內(nèi)核16.6μs的平均時(shí)間和1.36的方差,Preempt RT補(bǔ)丁內(nèi)核在一定程度上提高了內(nèi)核的穩(wěn)定性;同時(shí)對(duì)比圖5和6,在系統(tǒng)負(fù)載增加時(shí),上下文切換的平均值的最大值略有增加,但基本滿(mǎn)足軟實(shí)時(shí)系統(tǒng)的要求。
運(yùn)用相關(guān)工具對(duì)切換時(shí)間進(jìn)行上萬(wàn)次實(shí)驗(yàn),結(jié)果如表1所示,補(bǔ)丁內(nèi)核的最大值為167μs,滿(mǎn)足航天領(lǐng)域期望的最大值不超過(guò)200μs的要求,而標(biāo)準(zhǔn)內(nèi)核峰值達(dá)到500μs以上,甚至達(dá)到9166μs,切換時(shí)間極不穩(wěn)定。
表1 切換時(shí)間/μs
3.3.1 測(cè)試設(shè)計(jì)
通過(guò)程序捕獲優(yōu)先級(jí)反轉(zhuǎn):模擬優(yōu)先級(jí)反轉(zhuǎn)的過(guò)程,在程序中設(shè)置標(biāo)記位,分別標(biāo)記高中低3個(gè)進(jìn)程占用資源的情況和是否開(kāi)始運(yùn)行,中優(yōu)先級(jí)進(jìn)程運(yùn)行時(shí)進(jìn)行標(biāo)記置1,在高優(yōu)先級(jí)進(jìn)程執(zhí)行時(shí),通過(guò)對(duì)標(biāo)識(shí)位判定確定是否發(fā)生優(yōu)先級(jí)反轉(zhuǎn),如果標(biāo)記中優(yōu)先級(jí)進(jìn)程已經(jīng)執(zhí)行,則表明發(fā)生反轉(zhuǎn),反之,則表明通過(guò)優(yōu)先級(jí)繼承解決了反轉(zhuǎn)問(wèn)題。
實(shí)現(xiàn)方案:模擬優(yōu)先級(jí)反轉(zhuǎn)的過(guò)程,在程序運(yùn)行過(guò)程中通過(guò)捕獲優(yōu)先級(jí)反轉(zhuǎn)判斷是否發(fā)生反轉(zhuǎn),程序流程圖如圖7所示:
圖7 優(yōu)先級(jí)反轉(zhuǎn)程序流程圖
3.3.2 測(cè)試及結(jié)果分析
通過(guò)5000次試驗(yàn)可知,在Preempt RT補(bǔ)丁內(nèi)核上未捕捉到優(yōu)先級(jí)反轉(zhuǎn),而標(biāo)準(zhǔn)內(nèi)核則全部捕捉到優(yōu)先級(jí)翻轉(zhuǎn),由此得出,Preempt RT補(bǔ)丁解決了優(yōu)先級(jí)反轉(zhuǎn)的問(wèn)題。
分析研究了Linux操作系統(tǒng)在實(shí)時(shí)性方面的問(wèn)題,并通過(guò)增加PREEMPT RT搶占補(bǔ)丁提高其實(shí)時(shí)性能,在基于ZYNQ-7000處理器的平臺(tái)上對(duì)其進(jìn)行了測(cè)試。實(shí)驗(yàn)結(jié)果顯示實(shí)時(shí)可搶占補(bǔ)丁對(duì)Linux的實(shí)時(shí)性具有較好的提升,達(dá)到軟實(shí)時(shí)操作系統(tǒng)的性能要求。綜上, 基于PREEMPT RT補(bǔ)丁內(nèi)核滿(mǎn)足載人航天應(yīng)用領(lǐng)域中對(duì)非硬實(shí)時(shí)嵌入式操作系統(tǒng)的要求,大大降低了載人航天工程的成本和開(kāi)發(fā)難度,同時(shí)加快了我國(guó)載人航天技術(shù)向民用方向發(fā)展的步伐。
參 考 文 獻(xiàn)
[1] Fayyad-Kazan H, Perneel L, Timmerman M. Linux PREEMPT-RT v2.6.33 Versus v3.6.6:Better or Worse for Real-time Applications?[J]. Acm Sigbed Review, 2014, 11(1):26-31.
[2] 祁磊. 基于ARM的嵌入式系統(tǒng)內(nèi)核移植及實(shí)時(shí)性研究[D].蘭州:蘭州交通大學(xué), 2016.
[3] 蘇宇, 張濤, 孫黎. 基于Xenomai的實(shí)時(shí)Linux系統(tǒng)的研究[J]. 計(jì)算機(jī)技術(shù)與發(fā)展, 2013(10):1-5. (Su Yu,Zhang Tao,Sun Li. Research on Real-time Linux System Based on Xenomai[J]. Computer Technology and Development, 2013(10):1-5.)
[4] 介龍梅, 徐有軍, 邵國(guó)強(qiáng). 嵌入式Linux內(nèi)核實(shí)時(shí)性測(cè)試研究[J]. 智能計(jì)算機(jī)與應(yīng)用, 2016, 6(3):105-107.(Jie Longmei,Xu Youjun,Shao Guoqiang. The Research on the Real-time Performance Test of Embedded Linux Kernel[J].Intelligent Computer and Applications, 2016, 6(3):105-107.)
[5] 劉勝, 王麗芳, 蔣澤軍. 基于多核 PC 的 Linux 系統(tǒng)實(shí)時(shí)性改造[J]. 微電子學(xué)與計(jì)算機(jī), 2013(8):120-123. (Liu Sheng,Wang Lifang,Jiang Zejun. Resconstruct Real-time of Linux Based on Multicore Computer[J]. Microelectronics & Computer, 2013(8):120-123.)
[6] Fayyad-Kazan H, Perneel L, Timmerman M. Linux PREEMPT-RT vs. Commercial RTOSs: How Big is The Performance Gap?[J]. Gstf Journal on Computing, 2014.
[7] 張曉龍, 郭銳鋒, 陶耀東,等. Linux實(shí)時(shí)搶占補(bǔ)丁研究及實(shí)時(shí)性能測(cè)試[J]. 計(jì)算機(jī)工程, 2014, 40(10):304-307.(Zhang Xiaolong, Guo Ruifeng,Tao Yaodong,Liu Sheng. Research of Linux Real-time Preemption Patch and Real-time Performance Measure[J]. Computer Engineering, 2014, 40(10):304-307.)
[8] 董艷雪, 韓衛(wèi)光. 基于多核ARM的Linux操作系統(tǒng)的實(shí)時(shí)性研究[J]. 小型微型計(jì)算機(jī)系統(tǒng), 2017, 38(6):1262-1266.(Dong Yanxue,Han Weiguang. Real-time Research of Linux System Based on the Multi-core ARM Platform[J]. Journal of Chinese Computer Systems, 2017, 38(6):1262-1266.)
[9] Scordino C, Scordino C, Abeni L, et al. Deadline Scheduling in the Linux Kernel[J]. Software—practice & Experience, 2016, 46(6):821-839.
[10] Oliveira D B, Oliveira R S. Timing Analysis of the PREEMPT RT Linux Kernel[J]. Software Practice & Experience, 2016, 46(6):789-819.
[11] 黃芳. 基于ARM和RTAI的嵌入式實(shí)時(shí)平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 沈陽(yáng):中國(guó)科學(xué)院研究生院(沈陽(yáng)計(jì)算技術(shù)研究所), 2014.
[12] 鄭祥. 淺析Linux進(jìn)程調(diào)度策略[J]. 科技致富向?qū)? 2013(12):22.