C 多執行緒 優先順序反轉

2021-10-02 02:25:20 字數 884 閱讀 7588

優先順序反轉對於編寫應用層的人員來說不大會發生,但是對於作業系統的設計者來說確是乙個逃不過去的問題。要知道怎麼樣處理優先順序反轉?那麼先看看它是怎麼發生的。

(1)排程佇列和執行緒優先順序

在作業系統中,執行緒的狀態有很多種。比如說,執行緒的狀態可能是suspend、block、ready、die幾種型別。我們把所有的ready執行緒放在乙個佇列裡面,這就構成了乙個基本的排程佇列。

我們還知道,為了對所有的執行緒進行有差別的時間排程,我們對所有的執行緒分配了優先順序。打個比方,排程佇列有32個執行緒,每個執行緒的優先順序也是1到32。這些優先順序對於執行緒來說有什麼意義呢?那就是,高優先順序可以獲得較多的時間片執行機會。進一步極端一點說,優先順序為32可以32個基本時間片,那麼優先順序為1的執行緒只能獲得乙個時間片的執行機會。

(2)鎖和執行緒

在佇列排程過程當中,高優先順序的執行緒獲得較多的執行機會,而與此對應的低優先順序執行緒執行的機會較少。舉個例子來說,現在有32個執行緒,執行緒的優先順序分布在1~32之間。那麼這些程式怎麼執行呢,

執行緒0x20 優先順序32 時間片 32個

執行緒0x1f 優先順序31 時間片 31個

執行緒0x1e 優先順序30 時間片 30個

/* 其他執行緒 */

執行緒0x01 優先順序01 時間片 01個

(3)解決方法

原來制定優先順序的目的就是為了讓有的程式執行時間長一點,有的程式執行時間短一點。然而,這一切在鎖面前從優點變成了缺點。那麼解決的辦法是什麼呢?其實也不難,那就是提高執行緒0x01的優先順序,盡快讓執行緒0x01盡快退出鎖。執行緒0x01和執行緒0x20交換一下優先順序的方法就不錯。

總結:(1)優先順序反轉提醒我們使用鎖的**段應盡量短;

(2)注意用小鎖代替大鎖,減少衝突的機會;

(3)如果鎖保護的**段很短,直接使用原子鎖忙等也是不錯的乙個方法。

多執行緒多程序優先順序理解 優先順序反轉

1.優先順序反轉 priority inversion 由於多程序共享資源,具有最高優先權的程序被低優先順序程序阻塞,反而使具有中優先順序的程序先於高優先順序的程序執行,導致系統的崩潰。這就是所謂的優先順序反轉 priority inversion 2.產生原因 其實,優先順序反轉是在高優級 假設為...

C 多執行緒 優先順序

在我的公司這裡,因為要跟很多特殊的裝置打交道,所以會用到多執行緒的東西,那麼我們在進行多執行緒處理的時候,怎麼去設定優先順序 執行緒裡有個屬性priority可以用來設定優先順序,我設定執行緒1的優先順序高於執行緒2的優先順序,那麼執行緒1就會比執行緒2多執行一段時間,這個是人眼觀察不出來的 執行速...

多執行緒 執行緒優先順序

目錄 1 執行緒優先順序具有繼承性 2 執行緒優先順序的作用 thread類原始碼中定義 最低優先順序為1 public final static int min priority 1 一般沒有繼承,沒有顯示指定優先順序時,預設優先順序為5 public final static int norm ...