《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 實時控制系統中優先級反轉問題的解決方法
實時控制系統中優先級反轉問題的解決方法
唐宇翔,胡景春
南昌航空大學 信息工程學院,江西 南昌330063
摘要: 以實時操作系統μC/OS-II為例,分析了產生優先級反轉的原因,提出了解決該問題的2種方法,即互斥信號量(Mutex)和實現時間片輪番調度法。在保證共享資源互斥訪問的前提下,將優先級反轉的發生有效地限制在一個層次上,降解了優先級反轉現象的發生。
中圖分類號: TP316.2
文獻標識碼: A
Research on reducing priority inversion problem in real-time control systems
TANG Yu Xiang,HU Jing Chun
School of Computer, Nanchang Hangkong University, Nanchang 330063,China
Abstract: Bases on the real-time operating system μC/OS-II, this paper analyses the reason that priority inversion bechanced and then gives exposition how to adjust this problem by mutual exclusive semaphores and time slice. On the precondition, of ensuring mutex visiting of the shared resources, the proposed approach limits the occurrence of priority inversion on one level, and alleviates the priority inversion phenomenon occurrence in μC/OS-II.
Key words : real-time system;priority inversion;priority inheritance

   μC/OS-II是由Jean Labrosse編寫的具有高度可移植性且源碼公開的嵌入式實時操作系統內核,可用于8 bit、16 bit、32 bit嵌入式微處理器或DSP中。μC/OS-II可以管理64個任務,各任務有自己單獨的棧,采用基于優先級的可搶占式PBP(Priority Based Preemptive)調度策略,絕大多數服務的執行時間具有確定性μC/OS-II已被成功地應用于各種系統,在眾多領域中,多種基于μC/OS-II設計的產品已經證明了μC/OS-II內核的穩定性,其安全性和穩定性已通過美國FAA認證。
    μC/OS-II操作系統同時也是可剝奪型內核,以保證最重要的進程(通常是優先級最高的進程)能夠及時得到運行。但是如果用傳統的信號量等機制對共享資源進行互斥操作,在某些時間里會出現高優先級進程被低優先級進程堵塞的現象,這種現象稱為優先級反轉。本文討論優先級反轉現象的原因,并給出2種抑制優先級反轉現象的具體方法。
1 優先級反轉現象
    使用實時內核,優先級反轉問題是實時系統中出現最多的問題。優先級反轉發生在一個高優先級的任務被迫等待一段不確定時間的過程中[1]。優先級反轉現象示意圖如圖1。


    圖1中,空白框為任務正常運行過程;陰影框為任務取得信號量后的運行過程。在圖中3個任務優先級的高低為T1>T2>T3,T1和T3在運行過程中都需要使用同一資源,T2不需要使用該資源。當T3先占用該資源,T1任務需要等待,直到T3任務釋放占用的共享資源。由于T2的優先級比T3高,所以剝奪了T3的CPU使用權,使得T3釋放信號量的時間向后拖延,所以T1的運行情況更加惡化,T1取得信號量的時間隨之推遲。這樣,原本優先級最高的T1任務,在經過以上過程后,優先級反而降到了最低。這時,系統中就發生了優先級反轉的現象。
    優先級反轉原因可歸納為:高優先級的任務由于要等待被低優先級任務占有的臨界資源而被中優先級任務阻塞,而此時具有中優先級的任務搶占了低優先級任務的CPU時間,導致具有中優先級的任務先于高優先級任務而執行。
2 優先級反轉的解決方案
    優先級反轉問題的解決辦法有優先級置頂和優先級繼承2種[2]。
    采用優先級置頂的方案,首先在創建互斥信號量時就應同時設置一個相應的置頂優先級,當首先申請到該資源的任務a未釋放而又有一個更高優先級的任務b試圖申請時,內核會將任務a的優先級提升到置頂優先級,該置頂優先級高于任何可能申請該資源任務的高優先級。優先級置頂的意義在于使占有資源的低優先級任務盡快完成,讓高優先級任務的等待不至過長。
    而優先級繼承的思想是:在出現上述情況時,提高低優先級任務的優先級使其與高優先級任務的優先級等同。而μC/OS-II卻不支持這種方法[3],需要通過修改μC/OS-II內核來實現優先級繼承。
2.1 優先級置頂方案
    要在μC/OS-II實現優先級置頂[4],需要用到互斥信號量(Mutex)。
    互斥型信號量的創建是由函數OSMutexCreate( )完成的,它首先檢查PCP的優先級數值是否己經被其他任務使用,如果還沒有使用就占用這個優先級。然后得到一個新的事件控制塊ECB,OSMutexCreate( )置mutex的值為有效,同時將PCP保存起來。
    OSMutexPend( )函數在獲取互斥信號量Mutex時,如果Mutex可用,并且占有信號量任務的優先級不是最高,則提升此任務的優先級置PIP,即置頂優先級,使它盡快執行并退出臨界區從而釋放Mutex。釋放信號量函數OSMutexPost( )則是將當前任務的優先級恢復原值,并檢查是否有任務仍在申請該資源。
    利用優先級置頂解決前面提到的優先級反轉的過程如圖2所示。


    以開始系統初始化,直到T1任務開始請求信號量的時刻,系統運行情況和應用普通信號量時的情況是一致的。t2時刻,T1任務開始啟動,請求信號量,此時系統得知T1任務所需的信號量正在被T3任務所占據,故提高T3任務的優先級,使之高于請求該信號量的所有任務的優先級;t3時刻,T1任務由于得不到信號量而被掛起,此時由于T3任務的優先級高于T1和T2任務,所以系統讓T3任務先完成,從而釋放信號量。當T3任務釋放信號量的時候,系統得知T3任務的優先級是被暫時提高的,所以恢復T3任務的優先級,此時T1任務可以請求并得到信號量;t4時刻,T1任務由于得到信號量而開始運行;t5時刻,T1任務運行完畢,由系統切換任務,使T2任務開始運行。在一定程度上抑制了優先級反轉。在μC/OS-II系統中建立如上所述的3個任務,作用時分別輸出格式為“自己的任務名稱is running”的字符串。使用了互斥信號量后的實驗結果如圖3所示。

2.2 優先級繼承方案
    在μC/OS-II中,由于不同的任務不能對應同一個優先級,所以不支持上述方法。不過,可以通過修改操作系統的內核,使之成為可能,從而用優先級繼承的方案解決優先級反轉現象。這里采用類似于時間片輪番調度法的方案,在同一優先級上對不同任務進行調度。
    這種方法給處于同一優先級的不同任務都分配一個時間片,當內核運行到某一任務時,對同優先級且處于就緒態的任務依次進行調度,即當就緒態中先到的任務用完自己的時間片后,CPU控制權轉讓給就緒態中后一任務。該任務用完自己的時間片后,CPU控制權又轉讓給后一個就緒態任務。當就緒態的每一個任務都被調度一次之后將重新為它們分配時間片,然后又開始新周期的調度。在調度過程中如果有一個比當前任務優先級更高的任務由其他態變成了就緒態(被創建或獲取了一個信號量等等),當前任務的CPU控制權將被剝奪;空閑任務仍然是等到其他任務都退出就緒態才獲得CPU使用權。
    這種方法的優點不僅體現在可以讓同一優先級對應不同的任務,從而進行優先級繼承,還體現在可以增加操作系統調度任務的最大數目,這使應用系統的開發更加靈活。因為在不允許一個優先級對應不同任務的μC/OS-II中,用戶能夠自己創建的任務數目最多為56個。
    在μC/OS-II中,實現優先級繼承方案應該首先在任務控制塊(TCB)的結構體中添加構成雙向鏈表的前驅節點指針(變量名為OSMYnext)、后繼結點指針(變量名為OSMYprev)和2個用于指示時間的變量(OSMYtime和OSMYtimeremain)。指針的作用是用來查找同一優先級的不同任務,便于添加新任務和刪除已經釋放了信號量的任務。在沒有其他任務和自己處于同一優先級的狀態下,鏈表的前后指針均指向自己。變量OSMYtime的作用表示分給該任務的時間片長度,OSMYtimeremain表示當前時間片剩余時間。
    由于當前任務的時間片使用完時,就會被從就緒表OSRdyGrp以及OSRdyTbl[ ]中清除,這樣,正常的調度將被打亂,所以還需增加保存臨時OSRdyGrp和OSRdyTbl[ ]的變量OSTempGrp和OSTempTbl[ ]。由于在創建任務時μC/OS-II會比較該任務和已建立的任務的優先級是否相同,所以還需把任務創建函數中相應代碼進行屏蔽。
    時鐘節拍函數OSTimeTick( )在時間片調度過程中起到了修改時間片計數器的作用,每一次時鐘節拍的到來都會引起時間片的減少。在OSTimeTick( )函數中,主要完成以下工作:首先檢查同優先級的雙向鏈表指針是否指向自己。如果指向自己,則說明在這一優先級上,只有自己一個任務。如果指向其他的任務,則要通過遞減正在運行的任務的時間片來確定分給該任務的時間片是否用完。
    如果時間片沒有用完,則執行OS_Sched()函數,讓內核進行調度;如果時間片已經用完,則讓時間片重新賦值,然后同樣進行調度,在沒有更高優先級的任務處于就緒態時,系統將運行鏈表所指示的下一個任務。其主要步驟的流程圖如圖4所示。

    經過以上步驟,就可以在μC/OS-II系統中基本實現時間片輪番調度,不過要想解決優先級反轉的問題,還需要做以下工作。
    當一個任務進入等待互斥信號量OSMutexPend( )函數時,首先判斷當前任務的優先級是否高于已經得到并且還沒釋放該資源的任務優先級。如果當前的任務優先級高,則要將得到該資源的任務優先級提到當前任務的優先級水平,并且把當前任務加到自己的雙向鏈表中,再執行一次內核調度。
    當任務執行OSMutexPost( )釋放互斥信號量時,如果在其擁有信號量的過程中被提升過優先級,則將恢復之前的優先級。然后查看是否還有任務在等待該信號量,準備下一次調度。
    用優先級繼承的方法測試,同樣選取T1、T2、T3 3個任務,進行同優先級置頂方案相同的實驗,得到如圖5所示的結果。
    從圖5可以看出,用時間片解決優先級反轉的效果與優先級置頂大致相同,區別僅在于當T3任務取得資源運行時,時間片用完后,T1任務又開始申請該資源,而T3并未放棄,所以出現如圖5的結果。如果T3的時間片設置過小,這一過程就將頻繁發生,從而降低了效率。所以如果系統當前的任務集合相對簡單,則在發生優先級反轉時,把低優先級任務的時間片調大一些為好。


    運用時間片輪番調度法,解決了在μC/OS-II系統中實現優先級繼承的方案,在一定程度上抑制了優先級反轉現象,提高了系統的實時性,還增加了系統同時運行任務的最大數目,提高了系統的運行效率。
    優先級反轉是任何一個多任務實時操作系統都無法避免的問題。本文分析了該現象產生的原因,主要討論了μC/OS-II中運用mutex和時間片輪番調度解決該問題的方法并對其可行性進行了驗證。相對優先級繼承和優先級置頂策略,在可能出現優先級反轉的情況下,動態地改變任務優先級能夠保證高優先級任務的執行,有效提高了系統的實時性。
參考文獻
[1] 楊宗德,張兵μC/OS-II標準教程[M].北京:人民郵電出版社,2009:153-156.
[2] LABROSSE J.μC/OS-II the real-time kernel[M].Lawrence,R&D Books,2003:47-64.
[3] LABROSSE J J.嵌入式實時操作系統μC/OS-II(第2版) [M].北京:北京航空航天大學出版社,2003:44-46.
[4] 任哲.嵌入式實時操作系統μC/OS-II原理及應用[M].北京:北京航空航天大學出版社,2005:124-130

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲国产一二三| 亚洲欧美精品在线| 亚洲影院在线观看| 99视频一区| 亚洲精品一区在线观看| 亚洲高清不卡av| 伊人久久久大香线蕉综合直播| 国产亚洲精品自拍| 国产伦精品一区二区三区免费| 国产精品成人va在线观看| 欧美日韩在线一区| 欧美日韩一区在线视频| 欧美日韩卡一卡二| 欧美久久一区| 欧美日韩亚洲一区二| 欧美日韩性生活视频| 欧美日韩亚洲系列| 欧美视频中文在线看| 国产精品电影网站| 国产精品亚洲综合天堂夜夜| 国产精品私房写真福利视频| 国产精品久久久91| 国产精品一香蕉国产线看观看 | 亚洲在线中文字幕| 亚洲欧美日韩综合aⅴ视频| 午夜综合激情| 亚洲高清免费视频| 亚洲乱码国产乱码精品精| 99视频日韩| 亚洲一区二区三区涩| 亚洲欧美日韩在线一区| 久久国产一二区| 久久在线91| 在线亚洲免费| 亚洲另类在线视频| 在线综合+亚洲+欧美中文字幕| 亚洲一二三区精品| 欧美在线1区| 亚洲精品中文字幕女同| 一个色综合av| 欧美制服丝袜| 免费观看日韩| 欧美日韩一区二区视频在线观看| 国产精品美女| 极品中文字幕一区| 欧美成人久久| 久久国产精品久久w女人spa| 久久综合伊人77777| 欧美极品aⅴ影院| 国产精品久久久久久户外露出 | 国产免费成人| 黄色成人av网站| 欧美日韩成人精品| 国产精品丝袜白浆摸在线| 黑人巨大精品欧美一区二区小视频| 亚洲欧美日韩在线一区| 欧美日韩精品欧美日韩精品| 国产精品久久777777毛茸茸| 黄色精品免费| 99精品国产在热久久下载| 亚洲欧美在线磁力| 亚洲精品免费在线播放| 午夜伦理片一区| 欧美99在线视频观看| 欧美日韩视频一区二区三区| 国产视频精品网| 亚洲日韩欧美视频一区| 午夜精品久久久久影视| 日韩一级片网址| 久久久成人网| 欧美一二三区在线观看| 欧美激情视频一区二区三区不卡| 国产精品免费看久久久香蕉| 在线欧美日韩国产| 亚洲影院在线| 一区二区三区**美女毛片| 久久久久九九视频| 国产精品国产三级国产专区53| 国产精品日韩欧美综合| 国产精品成人免费视频| 亚洲国产欧美不卡在线观看| 午夜精品久久久久久久久| 亚洲视频在线二区| 欧美成人精品在线播放| 亚洲尤物精选| 午夜精品久久久久久久99樱桃 | 亚洲影视在线播放| 男男成人高潮片免费网站| 国产欧美一区二区三区视频| 亚洲最新色图| 亚洲免费成人av| 久热精品视频在线| 国产日韩欧美在线观看| 中文欧美字幕免费| 一本一本大道香蕉久在线精品| 欧美 日韩 国产一区二区在线视频| 国产精品一二三四| 一区二区三区视频在线观看| 日韩一本二本av| 欧美成人a视频| 国产亚洲制服色| 亚洲一本视频| 亚洲一区影音先锋| 欧美日韩国语| 亚洲美女中文字幕| 亚洲理伦电影| 欧美黄色片免费观看| 亚洲电影av在线| 亚洲国产中文字幕在线观看| 久久久久久9999| 国产原创一区二区| 欧美亚洲一区二区三区| 小嫩嫩精品导航| 国产精品乱码人人做人人爱| 一区二区三区高清视频在线观看| 一区二区激情小说| 欧美精品九九| 日韩视频免费在线观看| 9l视频自拍蝌蚪9l视频成人| 欧美精品色综合| 亚洲美女免费精品视频在线观看| 日韩午夜在线观看视频| 欧美黑人在线播放| 亚洲久久成人| 亚洲小说欧美另类婷婷| 欧美午夜精品伦理| 亚洲一二三区视频在线观看| 午夜精品一区二区三区电影天堂| 国产乱肥老妇国产一区二| 亚洲欧美日韩国产精品| 久久精品欧美日韩| 一区免费视频| 亚洲精品免费一二三区| 欧美日韩亚洲免费| 亚洲一区二区精品在线| 欧美在线综合| 亚洲第一精品电影| 一本大道av伊人久久综合| 国产精品久久久久aaaa| 午夜精品久久久久久久蜜桃app| 久久人人爽人人爽爽久久| 亚洲国产精品久久久久| 一本色道久久综合亚洲精品小说| 国产精品多人| 午夜久久久久久久久久一区二区| 久久久999国产| 亚洲电影毛片| 亚洲天堂激情| 国产日韩欧美精品一区| 亚洲电影免费在线| 欧美日本韩国一区| 亚洲香蕉成视频在线观看| 久久精品国产综合| 亚洲国产另类久久精品| 亚洲无限av看| 国产一区二区三区四区三区四| 亚洲国产婷婷香蕉久久久久久99 | 一区二区不卡在线视频 午夜欧美不卡在 | 欧美三区不卡| 性娇小13――14欧美| 老司机67194精品线观看| 亚洲美女黄色片| 欧美综合国产| 亚洲国产毛片完整版 | 国产精品国产三级国产普通话蜜臀| 亚洲男人影院| 猛男gaygay欧美视频| 日韩午夜免费| 久久精品2019中文字幕| 亚洲激情电影中文字幕| 欧美一级视频| 亚洲国产成人久久| 午夜精品影院| 亚洲国产精品久久久久秋霞影院 | 性久久久久久久| 亚洲风情在线资源站| 午夜精品一区二区三区电影天堂| 亚洲承认在线| 欧美在线日韩| 亚洲精品免费一区二区三区| 欧美中文字幕在线视频| 亚洲精品男同| 久久久久久一区二区| 9l视频自拍蝌蚪9l视频成人| 久久婷婷国产综合国色天香| 亚洲香蕉在线观看| 欧美精品自拍| 亚洲福利在线观看| 国产精品免费观看视频| 99国产精品| 精品99一区二区| 西瓜成人精品人成网站| 亚洲人成网在线播放| 久久久999精品| 亚洲少妇一区| 欧美伦理91| 91久久国产综合久久| 国产酒店精品激情| 亚洲一区二区三区激情| 亚洲电影在线观看|