㈠ 如何防止優先順序反轉及其繼承 - 如何為遠程醫療設備選擇合適的實時操作系統
防止優先順序反轉 操作系統中最令人頭疼的錯誤是優先順序反轉。它是指低優先順序任務阻止高優先順序任務完成運行的狀態。例如,在報警控制、數據記錄儀和數據聚合器共享資源的病人監控系統里,優先順序高的任務(報警控制器)必須等待優先順序低的任務(數據記錄器)結束才能繼續運行。第三項任務(數據聚合器)的優先順序比報警控制器的低,但比數據記錄器的高。數據聚合器會搶占數據記錄器的優先順序,進而搶占報警控制器的優先順序,這就無法滿足實時提交的要求。 優先順序繼承 優先順序繼承是指將被阻止的高優先順序任務的優先順序分配給阻止任務的低優先順序線程,直至完成被阻止的任務,以此防止優先順序反轉。例如,數據記錄器可繼承報警控制器的優先順序,這樣它就不會被數據聚合器搶占。當任務結束後,它會恢復最初的優先順序,報警控制器會解除阻止並繼續運行。
圖4 優先順序繼承防止優先順序反轉 確保可用性 對許多系統來說,資源的可用性至關重要。假如某一子系統出現CPU周期匱乏,會導致十分嚴重的後果。例如,如果心臟監護儀的連接中斷可能導致中心監護系統誤認為出現報警情況並派出急救人員,或當病人真出現危急狀況時,系統卻無法發出報警信息。 根據以往經驗,解決這一問題的途徑是更新硬體或重新設計軟體。雖然將新設計的軟體發送到聯網的醫療設備上是一個可行方案,但這不僅使成本高昂,而且還可能導致該設備已有的產品認證失效。 分區分區技術通過執行CPU預算並防止進程獨佔CPU周期,使資源匱乏的問題迎刃而解。可選擇兩種類型的分區:固定式和自適應式。 採用固定分區,系統設計人員為每個任務指定分配的CPU時間。分區內的任務消耗的CPU時間都不能超過分區時已分配的時間比例,以便於其他分區內的進程保持隨時可用,進而保證所有關鍵進程隨時可用。 遺憾的是,採用固定分區時,即使分配到其他地方的周期未被使用,另一個分區內的進程也無法使用,因為它不能使用超出其所在分區預先分配的CPU周期,固定分區雖然能防止系統出現資源匱乏,但它卻浪費了CPU周期,而且削弱了系統應對高峰需求的能力。 與固定分區類似,自適應分區也能防止資源匱乏。然而,自適應分區採用一種動態調度演算法將一個分區內閑置的CPU周期重新分配到另一個需要更多處理時間的分區內。當多個分區內的進程爭奪CPU周期時,自適應分區會執行資源分配。這樣,設計人員就能充分依賴系統資源保證,不必再為固定分區造成的處理能力降低而尋找良策了。 監視、停止或重啟進程 防止整個系統的進程發生連鎖故障和自我修復功能對可信賴的操作系統至關重要。需確保系統可用性的設備可採用面向硬體的高可用性解決方案和軟體監視程序。 監視程序監視系統並進行多級恢復或按要求平穩關機。根據執行方式的不同,當出現故障時它應:先終止然後重啟出現故障的進程而無需重啟系統,或者,終止故障進程和相關進程,初始化硬體使其進入「安全」狀態,然後以協調方式重啟終止的進程,或者,如故障比較嚴重或危及安全,能以受控方式關機或使整個系統復位,並向系統操作員發出報警。 在所有情況下,監視程序都必須能自我監控並靈活響應內部故障。如果監視程序意外停止,它必須通過一個鏡像進程復制本身的狀態。 最後,軟體監視程序能監視傳統硬體監視程序看不到的系統事件。例如,硬體監視程序能確保驅動程序為硬體服務,但卻很難檢測到其他程序是否正與該驅動程序正確通話。軟體監視程序能彌補這一不足,它會在驅動程序本身出現問題前採取行動。 結論 發達國家的人口老齡化趨勢和健康預算緊縮都促使醫療服務方式由常規醫院模式向遠程醫療和家庭自助模式轉變。這些變化和最新技術推動遠程醫療設備的市場不斷擴大,其發展速度之快在十年前是難以想像的。 設備製造商通過認真分析所選操作系統的性能特徵,從而降低成本並提升其產品順利通過行業認證而在市場上大獲成功的機會。
㈡ 優先順序反轉有什麼危害
簡答:
優先順序反轉的危害:
由於優先順序反轉,造成任務調度時,時間的不確定性。
時間不確定,破壞了實時系統的實時性
嚴重時可能導致系統崩潰
由於本身基於優先順序設計的任務,每個優先順序不同的任務,往往對應著實際的現實中的執行的任務
其優先順序反轉,導致低優先順序比高優先順序先執行了
直接就導致任務錯亂,邏輯錯亂了
程序也就異常了?(待確定此部分的理解是否有誤)
詳解:
【整理】什麼是優先順序反轉+有何危害+如何避免和解決
(此處無法貼地址,請自行google搜標題即可找到)
㈢ 優先順序的優先順序反轉的發生的防止
ucos中可以利用互斥型信號量解決上述問題。互斥型信號量創建函數申請一個比使用某共享資源的所有進程中比最高優先順序更高的優先順序作為預留。當某個進程調用pend函數申請使用該共享資源,同時該資源已經被佔用時,pend函數會判斷是否需要提升佔用該資源進程的優先順序,以使其盡快釋放所佔用的資源,從而防止優先順序反轉的發生 。
㈣ 請教下面的數據結構程序
1 讀程序段,回答問題
int main(int argc,char *argv[])
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
return 0;
}
a) 寫出程序輸出
b) 在一個可移植的系統中這種表達式是否存在風險?why?
#include "stdio.h"
int a=0;
int b;
static char c;
int main(int argc,char *argv[])
{
char d=4;
static short e;
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}
a) 寫出程序輸出
b) 編譯器如果安排各個變數(a,b,c,d)在內存中的布局(eg. stack,heap,data section,bss section),最好用圖形方式描述。
2 中斷是嵌入式系統中重要的組成部分,這導致了許多編譯開發商提供一種擴展:讓標准C支持中斷,產生了一個新的關鍵字__interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一個中斷服務子程序(ISR),請評論以下這段代碼。
__interrupt double compute_area(double radius)
{
double area = PI * radius *radius;
printf("nArea = %f", area);
return area;
}
3 C/C++基礎知識問題
a) 關鍵字volatile在編譯時有什麼含義?並給出三個不同使用場景的例子(可以偽代碼或者文字描述)。
b) C語言中static關鍵字的具體作用有哪些 ?
c) 請問下面三種變數聲明有何區別?請給出具體含義
int const *p;
int* const p;
int const* const p;
4 嵌入式系統相關問題
a) 對於整形變數A=0x12345678,請畫出在little endian及big endian的方式下在內存中是如何存儲的。
b) 在ARM系統中,函數調用的時候,參數是通過哪種方式傳遞的?
c) 中斷(interrupt,如鍵盤中斷)與異常(exception,如除零異常)有何區別?
5 設周期性任務P1,P2,P3的周期為T1,T2,T3分別為100,150,400;執行時間分別為20,40,100。請設計一種調度演算法進行任務調度,滿足任務執行周期及任務周期。
6 優先順序反轉問題在嵌入式系統中是一中嚴重的問題,必須給與足夠重視。
a) 首先請解釋優先順序反轉問題
b) 很多RTOS提供優先順序繼承策略(Priority inheritance)和優先順序天花板策略(Priority ceilings)用來解決優先順序反轉問題,請討論這兩種策略。
參考答案:
1 5
存在風險,因為c=c++%5;這個表達式對c有兩次修改,行為未定義,c的值不確定
int a=0; // data section
int b; // data section
static char c; // BSS
int main(int argc,char *argv[])
{
char d=4; // stack
static short e; // BSS
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}
a=2,b=100,c=2,d=6,e=5
2 a)ISR不能返回一個值;
b)ISR不能傳遞參數;
c)浮點一般都是不可重入的;
d)printf函數有重入和性能上的問題。
3 a) 用volatile關鍵字定義變數,相當於告訴編譯器,這個變數的值會隨時發生變化,每次使用時都需要去內存里
重新讀取它的值,並不要隨意針對它作優化。
建議使用volatile變數的場所:
(1) 並行設備的硬體寄存器
(2) 一個中斷服務子程序中會訪問到的非自動變數(全局變數)
(3) 多線程應用中被幾個任務共享的變數
b) 在函數體,一個被聲明為靜態的變數在這一函數被調用過程中維持其值不變。
在模塊內(但在函數體外),一個被聲明為靜態的變數可以被模塊內所用函數訪問,但不能被模塊外其它函數
訪問。它是一個本地的全局變數。
在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的
模塊的本地范圍內使用。
static全局變數與普通的全局變數有什麼區別:static全局變數只初使化一次,防止在其他文件單元中被引用;
static局部變數和普通局部變數有什麼區別:static局部變數只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
c) 一個指向常整型數的指針
一個指向整型數的常指針
一個指向常整型數的常指針
4
a) 0x12345678
little endian big endian 剛好反過來
高地址--〉 0x12 低地址--〉 0x12
0x34 0x34
0x56 0x56
低地址--〉 0x78 高地址--〉 0x78
b)參數<=4時候,通過R0~R3傳遞,>4的通過壓棧方式傳遞
c) 異常:在產生時必須考慮與處理器的時鍾同步,實踐上,異常也稱為同步中斷。在處理器執行到由於編程失誤而導致的錯誤指令時,或者在執行期間出現特殊情況(如缺頁),必須靠內核處理的時候,處理器就會產生一個異常。
所謂中斷應該是指外部硬體產生的一個電信號,從cpu的中斷引腳進入,打斷cpu當前的運行;
所謂異常,是指軟體運行中發生了一些必須作出處理的事件,cpu自動產生一個陷入來打斷當前運行,轉入異常處理流程。
非同步與同步的區別`
5
6 高優先順序任務需要等待低優先順序任務釋放資源,而低優先順序任務又正在等待中等優先順序任務的現象叫做優先順序反轉
優先順序繼承策略(Priority inheritance):繼承現有被阻塞任務的最高優先順序作為其優先順序,任務退出臨界區,恢
復初始優先順序。
優先順序天花板策略(Priority ceilings):控制訪問臨界資源的信號量的優先順序天花板。
優先順序繼承策略對任務執行流程的影響相對教小,因為只有當高優先順序任務申請已被低優先順序任務佔有的臨界資源
這一事實發生時,才抬升低優先順序任務的優先順序
㈤ 在嵌入式實時操作中優先順序反轉,死鎖會給系統帶來什麼後果
死鎖
在多道程序系統中,多個進程序並發執行,共享系統資源,從而提高了資源利用率和系統吞吐量,但可能發生一種危險----死鎖。所謂死鎖,是指多個進程因競爭資源而形成的一種僵局,若無外力作用,這些進程都將永遠不能再向前推進。
(1)產生死鎖的原因和必要條件
A、產生死鎖的原因
產生死渙的主要原因可歸結為以下兩點
(1)競爭資源
(2)進程推進順序不當。
B、產生死鎖的必要條件
(1)互斥條件
一個資源在一段時間內只能被一個進程所使用,具有排它性。
(2)請求和保持條件
一個進程在請求新資源而阻塞時,對已獲得資源又保持不放。
(3)不剝奪條件
進程已獲得的資源,在未使用完之前不能被剝奪,只能在使用完時由自己釋放。
(4)環路等待條件
在發生死鎖時,必然存在一個進程--------資源的環形鏈.即進程集合{P1,p2,....,Pn}中的P1正在等待P2佔用的資源,P2正在等待P3佔用的資源,....,Pn正在等待P1佔用的資源.
只要同時具備上述4個必要條件,系統就會發生死鎖,只要上述條件之不一滿足,系統就不會發生死鎖.
C、處理死鎖的方法
由於死鎖狀態的出現會給整個系統帶來嚴重的後果,所以如何解決死鎖問題引起了人們的普遍關注。目前常用的方法有以下三種:
(1)預防死鎖
為了使系統中不發生死鎖現象,在系統設計初期即選取擇一些限制條件,來破壞產生死鎖的四個必要條件之一或其中幾個。這樣,系統中就不會出現死鎖現象。這種方法對預防死鎖的發生非常有效,但有可能降低系統資源的利用率。
(2)避免死鎖
由於一方面預防死鎖的方法會降低系統資源利用率,另一方面死鎖的必要條件是存在示必就一定會使系統發生死鎖,因此為提高系統資源的利用率,可採用避免死鎖。避免死鎖並不嚴格限制死鎖必要條件的存在,而是在資源的動態分配過程中,使用某種方法去防止系統進入不安全狀態,從而避免死鎖的緊終出現。
(3)檢測和解除死鎖
由於死鎖產生的概率總是比較小的,所以在一些相對簡單的系統中,為節省預防或避免死鎖中所增加的系統開銷,系統中允許出現死鎖狀態。在這種系統中,專門設置了一個檢測機構,可以隨時檢測出死鎖的發生,並能確定與死鎖有關的進程和資源,然後採用適當的方法解除系統中的死鎖狀態。
常用的解除死鎖的方法有兩種:一是強制性地撤銷一些死鎖進程,並剝奪它們的資源給其他的時程;另一種是使用一個有效的掛起和解除掛起機構來掛起一些進程,以便從被掛起進程中剝奪一些資源,用來解除死鎖。
預防死鎖
(1)打破「請求和保持」條件
打破「請求和保持」條件,即把進程運行中所要求的所有資源在進程開始動行之前,一次性地分配給進程,只要有一種資源不能滿足,該進程就必須等待。這樣,進程在運行過程中就不再需要新的資源,這種方法又稱為預先靜態分配法。
(2)打破「不剝奪」條件
打破「不剝奪」條件,即強迫那些請求新資源而沒有立即得到滿足的進程釋放它已保持的其他資源。這意味著一個進程在運行過程可以暫時釋放已佔有的資源,即允許其他進程剝奪使用該資源,從而破壞了「不剝奪」條件的出現。
(3)打破「環路等待」條件
死鎖產生時,一定存在一種進程和資源的循環鏈。打破「環路等待」條件就是在資源的分配過程中,對資源的請求做出某種限制,使環路不可能出現。
㈥ 優先順序反轉問題在嵌入式系統中是一中嚴重的問題,必須給與足夠重視。請解釋何種情況下需要優先順序反轉。
優先順序翻轉 (網路詞條http://ke..com/view/2422471.htm 解釋的非常到位,摘錄如下)更詳細請查看:參考視頻 http://v.youku.com/v_show/id_XMTAyODU1OTc2.html 第27分30秒左右的視頻段。
所謂優先順序翻轉問題(priority inversion)即當一個高優先順序任務通過信號量機制訪問共享資源時,該信號量已被一低優先順序任務佔有,而這個低優先順序任務在訪問共享資源時可能又被其它一些中等優先順序任務搶先,因此造成高優先順序任務被許多具有較低優先順序任務阻塞,實時性難以得到保證。
例如:有優先順序為A、B和C三個任務,優先順序A>B>C,任務A,B處於掛起狀態,等待某一事件發生,任務C正在運行,此時任務C開始使用某一共享資源S。在使用中,任務A等待事件到來,任務A轉為就緒態,因為它比任務C優先順序高,所以立即執行。當任務A要使用共享資源S時,由於其正在被任務C使用,因此任務A被掛起,任務C開始運行。如果此時任務B等待事件到來,則任務B轉為就緒態。由於任務B優先順序比任務C高,因此任務B開始運行,直到其運行完畢,任務C才開始運行。直到任務C釋放共享資源S後,任務A才得以執行。在這種情況下,優先順序發生了翻轉,任務B先於任務A運行。
解決優先順序翻轉問題有優先順序天花板(priority
ceiling)和優先順序繼承(priority inheritance)兩種辦法。
優先順序天花板是當任務申請某資源時, 把該任務的優先順序提升到可訪問這個資源的所有任務中的最高優先順序,
這個優先順序稱為該資源的優先順序天花板。這種方法簡單易行, 不必進行復雜的判斷, 不管任務是否阻塞了高優先順序任務的運行, 只要任務訪問共享資源都會提升任務的優先順序。
優先順序繼承是當任務A 申請共享資源S 時,
如果S正在被任務C 使用,通過比較任務C 與自身的優先順序,如發現任務C 的優先順序小於自身的優先順序, 則將任務C的優先順序提升到自身的優先順序, 任務C 釋放資源S 後,再恢復任務C 的原優先順序。這種方法只在佔有資源的低優先順序任務阻塞了高優先順序任務時才動態的改變任務的優先順序,如果過程較復雜,則需要進行判斷。
㈦ 什麼是優先順序反轉+有何危害+如何避免和解決
什麼是優先順序反轉
優先順序反轉,英文是priority inversion,也有其他叫法:
優先順序倒置
優先順序逆轉
優先順序翻轉
任務之間誰可以得到執行,是通過任務調度來完成的
2.任務調度有多種方法(演算法)
羅賓環調度演算法:Round-robin scheling algorithm
基於優先順序的調度演算法:Priority-controlled scheling algorithm
3.任務調度的一種常見調度演算法就是
根據優先順序高低去調度,優先讓高優先順序的任務去執行的
任務調度器,總是去激活某個,在所有任務中優先順序是最高的,且處於就緒狀態的,任務,即讓其去執行
4.任務有多種狀態:就緒,掛起,等等
當然,任何任務,都可能由於,需要某種資源,而該資源被別人(別的任務)佔用,而無法繼續運行下去
此時就變成:掛起 –> 等待其所需要的資源被釋放
然後才可以繼續變成,就緒,等待下次調度時,就可以繼續執行了。
5.任務一般被稱為:進程,或更小粒度的線程
此處,均以進程為例來說明
任務調度器,總是去激活某個,在所有任務中優先順序是最高的,且處於就緒狀態的,任務,即讓其去執行
但是,當某個最高優先順序的任務A,由於其所需要的某個資源被某個低優先順序的任務C佔用了(還沒使用完,還沒釋放),所以高優先順序任務A就被阻塞了。
此高優先順序的任務A,必須等到低優先順序任務C,把其所佔用的資源釋放掉後,才能繼續運行。
但是要等到低優先順序任務C釋放其所佔用的資源的話,則很明顯,必須要先讓低優先順序的任務C去執行,等低優先順序任務C執行完畢後,才能去釋放,高優先順序任務A所希望得到的那個資源。
所以,任務調度去,就去調度,讓低優先順序任務C去執行了。
但是,此時,的問題就來了:
在高優先順序任務A執行的這段時間內,某個中優先順序的任務B,已經處於就緒狀態了。
當高優先順序的任務A,由於所需資源被佔用而掛起,然後中優先順序的任務B,由於比(本來打算去調度執行的)低優先順序任務C的優先順序高,所以被調度執行,然後B去一直執行,直到結束。
一個具有中等優先順序的任務(B),卻比一個更高優先順序的任務(A)先執行
本來應該是優先順序最高的任務A先執行的,結果卻變成了,比優先順序最高的任務A,的優先順序低一些,中等優先順序任務B,先執行了。
好像是:高優先順序任務A和中優先順序任務B,兩者之間的優先順序調換了,反轉了一樣。
優先順序反轉有何危害?
說實話,很久之前,對於:
計算機的概念,都完全只是概念到時候
完全不懂相關技術和概念背後的邏輯的時候
像對於此處的優先順序反轉,也無法完全理解的時候,自然也不會去考慮此概念背後的含義。
而實際上,不對一個問題背後的現象,原因,去搞清楚的話,自然也是無法理解相關的概念的
(對於,對現實世界中的應用情況不了解,對於概念也理解的不深的話,很可能就會問)
(不就是個優先順序反轉嘛)即使,發生了優先順序反轉了,又如何?(地球還不是照轉?!)
優先順序的反轉,有很大危害。
但是,在具體解釋優先順序反轉的危害之前,需要知道相關背景知識:
1.優先順序反轉,這個概念,往往都是在嵌入式領域內,尤其是嵌入式實時系統方面,才會提及
關於嵌入式實時操作系統,不熟悉的,可以參考:
【整理】嵌入式實時操作系統
2.嵌入式實時操作系統,最最重要的指標就是:確保任務執行時間是可預測的,即涉及到最後期限deadline
要確保,任何時刻,執行某個任務,都不能超過某個時間,比如1ms(我隨便舉例的)
然後再來解釋,優先順序反轉的危害:
由於優先順序反轉,造成任務調度時,時間的不確定性。
時間不確定,破壞了實時系統的實時性
嚴重時可能導致系統崩潰
由於本身基於優先順序設計的任務,每個優先順序不同的任務,往往對應著實際的現實中的執行的任務
其優先順序反轉,導致低優先順序比高優先順序先執行了
直接就導致任務錯亂,邏輯錯亂了
程序也就異常了?(待確定此部分的理解是否有誤)
1.當年火星探路者號(Mars Pathfinder),就由於,此處所說的,優先順序反轉,而導致了內部執行邏輯出錯的bug:
在1997年7月4號發射後,在開始搜集氣象數據之後沒幾天,系統(無故)重啟了。
後來,當然,被相關技術人員找到問題根源,就是,這個優先順序反轉所導致的,然後修復了此bug。
當年火星探路者號用的軟硬體是:
硬體:
CPU:RS6000
匯流排:VME Bus
各種介面卡/外設:
音頻
攝像頭
1553匯流排介面
軟體:
OS:(Wind River的)VxWorks
What really happened on Mars ?
What really happened on Mars?
如何解決或避免優先順序反轉?
既然,相對來說,優先順序反轉,這樣的問題,對於,尤其是嵌入式實時系統中,危害這么大,
那麼肯定N年前,就有人找到解決辦法了:
優先順序反轉的解決辦法:
禁止所有中斷(以保護臨近區)
當使用,禁止所有中斷,來避免優先順序反轉時,需要滿足下面的條件:
可被搶占的
中斷已禁止的
由於沒有別的第三種的優先順序了,所以,也就不可能發生反轉了。
(暫時沒有完全理解此種的含義。。。。)
priority inheritance 優先順序繼承:
對於,佔了高優先順序任務A的某種所需資源的,低優先任務級C,
當A被阻塞,要去調度,即使存在另一個中優先順序任務B,則也可以實現:
由於此時低優先順序任務C已有和A同樣的優先順序了,
則調度器自然會去執行:
比中優先順序任務B的優先順序高的C了。
然後,等C執行完畢後,就可以繼續執行A了。
優先順序繼承的實際例子
What really happened on Mars ?
中為例來來說明如何應用此,優先順序繼承:
HOW WAS THE PROBLEM CORRECTED?
VxWorks中的mutex對象,添加一個布爾值的參數,表示:
mutex是否使用優先順序繼承
當mutex初始化時,該參數是關閉的;
當此參數被打開時,低優先順序的任務,就從高優先順序的任務中繼承了相同的優先順序,
當然,背後是對應的檢測機制:
可以判定出,當然被阻塞的高優先順序的任務,所需要的資源,被當前自己這個低優先順序任務所佔用了
由此,解決了優先順序反轉的問題,避免了系統再次發生無故重啟。
Priority Celling(最高優先順序/優先順序天花板)
給臨界區,即上述的mutex等公用資源的部分
凡是想要用到,臨界區的資源的任務,
要進入臨界區之前,都將臨界區的優先順序賦值給該任務,
使得該任務有了最高的優先順序,可以不被打斷,而始終繼續運行,直到用到資源
這樣,就避免了,被高優先順序A發現某資源被低優先順序的C佔用之類的問題了
㈧ 什麼是操作系統的優先順序反轉
如果任務之間由於有共享資源出現了競爭或者死鎖,是會嚴重影響系統安全的。因此uC/OS對共享資源提供了保護機制。一般情況下使用的是信號量方法。創建一個信號量並對他進行初始化,當一個任務需要使用一個共享資源時,他必須先申請得到這個信號量。在這個過程中即使有優先權更高的任務進入了就緒態,因為無法得到信號量,也不能使用該資源。在uC/OS中稱為優先順序反轉。簡單地說,就是高優先順序任務必須等待低優先順序任務的完成。