版權聲明:本文為本文為博主原創文章,轉載請注明出處。如有錯誤,歡迎指正。博客地址:https://www.cnblogs.com/wsg1100/
一、xenomai 資源管理簡要
同步:任務間的直接制約關系,A要繼續執行需要B完成某一個操作操作才能繼續進行。
互斥:任務間的間接制約關系,A訪問了資源B就不能去訪問,必須等A訪問完了才行。
操作系統提供了任務間的同步互斥機制,如信號量信號量(sem)、互斥鎖(mutex)、條件變量(cond)等,抽象來說這些同步互斥鎖本都是操作系統管理的一種資源,與消息隊列(mq)、xddp/bufp/iddp、信號(signal)、一個驅動設備等一樣。
對於每種資源,任務間資源管理要有兩個基本機制:訪問控制和資源的保存。
- 訪問控制。資源狀態與任務調度管理緊密相關,以實現對共享資源阻塞、強占、喚醒等。
- 資源的保存。各種資源在內核中的保存形式,內核必須提供一種機制,方便任務能快速查找訪問的共享資源,例如兩個任務件間通過命名信號量(sem)來進行同步時,需要能通過
name
(bind操作)快速定位到任務訪問的資源,並將其與任務聯系起來。
xenomai內核中將任務間的一切資源(包括xenomai內核態一些資源)使用內核對像xnobject
表示,內核中的所有內核對象使用xnregistry
來保存,由於xenomai內核工作過程中不能動態去申請內存,所以xnregistry
大小一般是內核配置時配置的,具體內存分配在xenomai初始化時調用xnregistry_init()
初始化xnregistry時分配。
內核對象管理xnregistry分析,詳見文章內核對象管理—xnregistry
xenomai內存管理,詳見文章xenomai實時系統內存池管理--xnheap
xenomai調度管理,請關注本博客后續文章xenomai任務管理系列
xenomai內核中,任務間共享資源(一切涉及任務間同步互斥的資源)抽象為對象xnsynch,這里的資源不僅限於信號量(sem)、互斥鎖(mutex)、xnpipe、消息隊列(mq)、事件(event)、條件(cond),還可以是一個驅動設備、以及內核中的資源管理器xnregister……,xnsynch與xenomai任務調度管理緊密結合,來實現上面所說的訪問控制,本文所說的優先級倒置問題在該模塊中實現。
xnregistry
:保存內核對象,提供內核對象存儲和快速檢索。
xnsynch
:資源抽象,提供線程與資源的同步互斥管理機制。
具體的線程間內核資源(對象):信號量(sem)、消息隊列(mq)、xddp/bufp/iddp、事件(event)、條件變量(cond)、一個驅動設備、xnregister(xnregister的訪問也互斥)…..。
二、優先級倒置
下面介紹優先級倒置也稱優先級反轉,會在下一篇文章分析xnsynch
,如何解決優先級倒置問題。
1. 什么是優先級倒置
在基於優先級調度下,會出現下面情況(例子中的信號量為二值信號量與互斥量等效).
圖中,三個任務t1、t2、t3的優先級分別是高、中、低。低優先級任務t3通過獲取信號量來獲取一些資源。t3運行一段時間后,t1就緒搶占t3得到運行,一段時間后t1需要相同信號量保護的資源時,t1由於獲取不到信號量而阻塞。被t1搶占的t3得到繼續運行。接着低優先級任務t3受到中優先級任務t2的搶占,t2的搶占導致t3遲遲無法釋放信號量,這種情況可能會持續存在,最終導致高優先級任務t1無限期阻塞。在這種情況下,優先級發生了翻轉,任務t2總是先於任務t1運行。(xenomai中優先級數值越大,優先級越高)
這就是優先級反轉轉問題(Priority Inversion and Priority Inheritance),即當一個高優先級任務通過信號量機制訪問共享資源時,該信號量已被一低優先級任務占有,而這個低優先級任務在訪問共享資源時可能又被其它一些中等優先級任務搶先,因此造成高優先級任務被許多具有較低優先級任務阻塞,實時性難以得到保證。
2. 優先級反轉解決辦法
通過上圖可知,只要t3不被中優先級任務搶占,盡快釋放信號量就行了,所以在t1阻塞期間需要給t3一個足夠高的優先級。避免優先級反轉有優先級天花板和優先級繼承兩種辦法。
優先級天花板是當任務申請某資源時, 把該任務的優先級提升到可訪問這個資源的所有任務中的最高優先級, 這個優先級稱為該資源的優先級天花板。
優先級繼承是當任務t1 申請共享資源S 時, 如果S正在被任務t3 使用,通過比較任務t3 與t1的優先級,如發現任務t3 的優先級小於t1的優先級, 則將任務t3的優先級提升到t1的優先級,等t3 釋放資源S 后,再恢復任務t3 的原優先級。xenomai內核使用該方式,優先級反轉后的示意圖如下。
如上圖所示,通過優先級繼承,在t1被阻止的時間內將t3的優先級提升到t1的優先級來解決優先級反轉,這樣可以保護t3和間接t1免受t2的搶占。
以上為單個互斥信號的情況,在真實環境中,往往是多個信號量、多個任務,下圖為多個任務與多個互斥信號量交互的示例:
① 低優先級為10的任務t3獲取信號量s1;
② 任務t3獲取信號量s2;
③ 任務t2搶占運行后嘗試獲取信號量s1時阻塞;
④ 任務t3繼承t2的優先級30繼續執行;
⑤ 優先級為90的t1搶占t3;
⑥ 任務t1嘗試獲取信號量s2阻塞;
⑦ 任務t3繼承t1的優先級90繼續執行;
⑧ 任務t3釋放信號量s1,優先級繼續保持為90;
⑨ 任務t3釋放信號量s2,並恢復優先級10;
⑩ 任務t1獲取信號量s2搶占運行。