SylixOS---互斥信號量與優先級反轉問題

信號量是一種約定機制:在共享資源的互斥訪問中,它約定當一個線程獲得信
號量(Wait)後,其他線程不可以再次獲得該信號量直到信號量被釋(Give);在同步機制中,它約定等待信號量(Take)的線程(或者說等待信號更確切)在收到信號量之前應該處於阻塞狀態,直到其他線程發送該信號量(Post)。

在介紹二進制信號量時,曾討論到如果二進制信號量創建時設置參數 bInitValue 爲 TRUE,則可以用於互斥訪問共享資源。實際上,SylixOS 的二進制信號量實現的互斥性是將一個變量初始化標記爲1,等待信號量(Wait)時將該變量減 1(此時等於 0),如果另 一個線程再次等待該信號量將阻塞,直到該信號量被釋放(變量加 1),這樣就實現了共享資源的互斥訪問。

優先級反轉問題:
如果系統中只有兩個線程,上面的過程是沒有問題的。但是一旦有多個線程介入,上面過程將出現以下問題:一個高優先級的線程可能也要訪問同一個共享資源(這是完全有可能的),此時只能阻塞等待,但是可能會有另一箇中等優先級的線程將佔有信號量的線程搶佔。這個過程導致了高優先級線程很長時間得不到運行(這是 SylixOS 不允許出現的情況)。

以上過程出現的問題就是經典的優先級反轉問題。

互斥信號量用於共享資源需要互斥訪問的場合,可以理解爲初始值爲 TRUE 的帶優先 級天花板和優先級繼承機制(意在解決優先級反轉問題)的二進制信號量,只有擁有互斥信號量的線程纔有權釋放互斥信號量。

優先級反轉問題類比解釋:
共享資源door 信號量key 低級low 中級mid 高級high

1、信號量key相當於共享資源door的一把鎖,低優先級low獲得該信號量key後可以使用這個共享資源door;
2、此時中優先級mid因爲優先級高,並且不需要該共享資源door,因此搶佔了低優先級low使用cpu
3、高優先級high想要使用共享資源door,雖然優先級夠但是共享資源door在低優先級low手中,因此要等到中優先級mid執行完之後,在等低優先級low釋放信號量key才能夠獲取該共享資源door之後執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章