優先順序倒置是指高優先順序交易因低優先順序工作而延遲,因為低優先順序工作持有高優先順序工作所需的資源。為減輕優先權反轉問題,Android 支援透過三種不同的優先權繼承形式,以不同優先權執行執行緒:交易優先權繼承、節點優先權繼承和即時優先權繼承。
本頁面將說明這些不同形式的優先權繼承。
交易優先順序繼承
發出同步繫結器呼叫時,高優先順序的執行緒可能會遭到低優先順序的執行緒封鎖,直到低優先順序的執行緒傳送回覆為止。舉例來說,如果執行緒的 nice 值為 -19,可能會遭到 nice 預設值為 0 的執行緒封鎖。
交易優先權繼承可修正這個問題,因為繫結器驅動程式會暫時變更處理交易的繫結器執行緒優先權,以符合呼叫端的優先權。交易完成後,繫結器驅動程式會將繫結器執行緒的優先順序還原為先前的值。
節點優先順序繼承
在某些情況下 (例如需要低延遲),非同步交易的優先順序很重要。
節點優先順序繼承可讓您設定節點上所有交易應執行的最低優先順序。設定節點優先順序繼承後,節點上的所有交易都會以這個最低優先順序執行。
節點優先順序的繼承規則如下:
如果交易是同步的,優先順序會變成
max(min_node_priority, caller_priority);
。如果交易為非同步,優先順序會變成
max(default_priority (nice 0), min_node_priority);
。
設定節點優先順序繼承
如要設定節點優先順序的繼承方式,請使用 BBinder::setMinSchedulerPolicy
。
即時優先權繼承
Android 會使用 SCHED_FIFO
等即時排程政策,確保延遲時間至關重要的執行緒能及時完成工作。此外,Android 某些對延遲時間要求嚴格的工作會分散在兩個以上的程序中。
即時優先權繼承的運作方式與 nice 值完全相同,但有以下例外狀況:
- 即時優先順序繼承功能預設為停用。
- 即時優先順序值越大,優先順序就越高。
啟用即時優先權繼承
您必須使用 BBinder::setInheritRt(true)
呼叫,為個別節點啟用即時優先順序繼承。