多執行緒的那點兒事(之優先順序反轉)

2021-06-02 13:32:34 字數 1178 閱讀 7909

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

(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個

糟糕的還不止這一點,前面我們說過低優先順序的執行緒執行機會較少。所以,執行緒0x01獲得執行的機會只是1/528,即使執行緒0x20退出了佇列,那只有1/496,其中 496 = (1 + 31) / 2 * 31。如果執行緒0x01執行的時間還比較長,那就比較悲催了。執行緒0x20還要等待多長時間才能獲得執行緒0x01的鎖,那就只有天知道了。此時,原來的優先順序也失去了意義,這才是優先順序發生反轉的真實原因。

(3)解決方法

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

總結:

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

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

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

多執行緒的那點兒事(之優先順序反轉)

優先順序反轉對於編寫應用層的人員來說不大會發生,但是對於作業系統的設計者來說確是乙個逃不過去的問題。要知道怎麼樣處理優先順序反轉?那麼先看看它是怎麼發生的。1 排程佇列和執行緒優先順序 在作業系統中,執行緒的狀態有很多種。比如說,執行緒的狀態可能是suspend block ready die幾種型...

C 多執行緒 優先順序反轉

優先順序反轉對於編寫應用層的人員來說不大會發生,但是對於作業系統的設計者來說確是乙個逃不過去的問題。要知道怎麼樣處理優先順序反轉?那麼先看看它是怎麼發生的。1 排程佇列和執行緒優先順序 在作業系統中,執行緒的狀態有很多種。比如說,執行緒的狀態可能是suspend block ready die幾種型...

多執行緒的那點兒事(之讀寫鎖)

在編寫多執行緒的時候,有一種情況是十分常見的。那就是,有些公共資料修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查詢的操作,中間耗時很長。給這種 段加鎖,會極大地降低我們程式的效率。那麼有沒有一種方法,可以專門處理這種多讀少寫的情況呢?有,那就是讀寫鎖。1 ...