支援 PI 的 RT 互斥子系統

具有優先順序繼承的 RT 互斥鎖用於支援 PI-futexes,它能啟用 pthread_mutex_t 優先順序繼承屬性 (PTHREAD_PRIO_INHERIT)。[關於 PI-futexes 的更多細節,請參見輕量級 PI-futex。]

這項技術在 -rt 樹中被開發,併為了 pthread_mutex 支援而進行了簡化。

基本原則:

RT 互斥鎖透過優先順序繼承協議擴充套件了簡單互斥鎖的語義。

一個低優先順序的 rt-mutex 持有者會繼承一個更高優先順序等待者的優先順序,直到 rt-mutex 被釋放。如果臨時提升的持有者本身阻塞在一個 rt-mutex 上,它會將優先順序提升傳播到它被阻塞的另一個 rt_mutex 的持有者。一旦 rt_mutex 被解鎖,優先順序提升會立即被移除。

這種方法允許我們縮短高優先順序任務在保護共享資源的互斥鎖上的阻塞時間。優先順序繼承不是為設計不良的應用程式準備的靈丹妙藥,但它允許設計良好的應用程式在優先順序高的執行緒的關鍵部分使用使用者空間鎖,而不會失去確定性。

等待者在 rtmutex 等待者樹中的入隊是按優先順序順序完成的。對於相同優先順序,選擇 FIFO 順序。對於每個 rtmutex,只有最高優先順序的等待者會被排隊到持有者的優先順序等待者樹中。這個樹也按優先順序順序排列。每當任務的最高優先順序等待者發生變化時(例如,它超時或收到訊號),持有者任務的優先順序會被調整。優先順序排隊由“pi_waiters”處理。

RT 互斥鎖針對快速路徑操作進行了最佳化,並且在鎖定未競爭的互斥鎖或解鎖沒有等待者的互斥鎖時沒有內部鎖定開銷。最佳化的快速路徑操作需要 cmpxchg 支援。[如果沒有這個支援,那麼將使用 rt-mutex 內部自旋鎖]

rt-mutex 的狀態透過 rt-mutex 結構的 owner 欄位進行跟蹤

lock->owner 儲存持有者的 task_struct 指標。位 0 用於跟蹤“鎖有等待者”狀態

owner

bit0

註釋

NULL

0

鎖是空閒的(可以快速獲取)

NULL

1

鎖是空閒的並且有等待者,並且最高優先順序的等待者將要獲取鎖 [1]

taskpointer

0

鎖被持有(可以快速釋放)

taskpointer

1

鎖被持有並且有等待者 [2]

只有當 lock->owner 的位 0 為 0 時,基於快速原子比較交換的獲取和釋放才有可能。

順便說一下,實際上仍然存在一個“待定所有者”,只是不再這樣稱呼它了。 待定所有者恰好是沒有所有者的鎖的 top_waiter,並且已被喚醒以獲取鎖。