7

優先級反轉是由於與它們關聯的優先級而在調度線程/進程期間可能發生的問題。Android中可能發生優先級反轉

優先級反轉是調度問題的方案,其中一個 高優先級任務是間接通過有效中等優先級任務 「反相」搶佔兩個任務的相對優先級 - Wikipedia

我奇怪的是,Android中可以優先倒置,因爲我們知道Android提供了不同優先級的進程see this post。此外,我們可以創建多個線程(在活動和服務中)具有不同的優先級,它們如何適合這種情況?我看到一篇文章談到Thread Scheduling in Android。如果發生優先倒置,我們如何檢測並避免它?

當我在尋找這個問題的答案時,我發現了Android的this頁面,它告訴我們如何避免Android音頻系統中的優先倒置。

+1

這是你應該擔心的。大致上每個有優先級的系統都有這個功能。但是隻有當你編寫「不好」的代碼時纔會發生這種情況,要求它以特定的順序/某些優先級執行。此外音頻系統鏈接也回答你的問題(「*試圖避免優先倒置*」):) – zapl

+0

優先倒置通常不會發生由於錯誤的代碼,而是取決於如何通過操作系統(或某些語言的編譯器)而且它確實關係到開發者,如果語言保證不會發生優先級反轉,那麼我們就不必擔心它的迴避/預防等。 – penguin

+0

s /壞代碼/壞系統設計。您不必編寫同時競爭共享資源的代碼。另外,如果爭用(很大程度上受到系統設計的影響)足夠高,它只會變得很糟糕。偶爾的優先級反轉調度不會損害大多數系統。 – zapl

回答

5

簡短的答案

,可發生於Android的優先級反轉,如您所提供的link詳細說明。

的問題

任何系統,允許具有不同優先級的任務鎖定同一共享資源是易受優先級反轉,除非採取措施,以防止它。您提到了線程和進程 - 在Android中,狀態可以在進程和線程之間共享,這使得它們都易受優先級倒置的影響。

優先級反轉帶來的主要問題是較低優先級的任務被給予較少的CPU週期來執行。如果時間敏感的高優先級任務被低優先級任務阻塞,那麼它可能需要等待無法接受的長時間才能執行,並導致系統某處發生故障或降低用戶體驗。

傳統的解決方案

傳統的解決方案是優先級繼承。通過優先級繼承,保存共享資源的任務(線程或進程)將臨時繼承在該資源上阻塞的最高優先級任務的優先級。這解決了這個問題,因爲低優先級任務的執行速度要快得多,爲時間敏感的任務釋放資源。

具有此功能的互斥鎖(快速用戶空間互斥鎖)在Linux Kernel中可用。但是,他們是而不是在Android標準C庫中可用,因爲security concerns因爲它們涉及大量的開銷。

的Android解決方案

的Android開源項目recommends幾種不同的方法來處理的優先級反轉問題。

  • 「嘗試鎖定」/超時鎖定 - 在低優先級任務持續多久時間內強制執行一段超時時間,使得高優先級任務更有可能及時獲得訪問權限。缺點是如果有一系列不相關的低優先級任務具有較長的累積超時時間。
  • 在某些情況下,互斥或其他同步原語可以用適當的原子操作集合以及對稱多處理來代替。有關這方面的指導提供here
  • 您還可以實現無鎖定的單讀取器,單寫入器FIFO任務隊列。這被描述爲herehere

共同所有的這些方法的基本主題是,以儘量減少對高和低優先級rasks之間共享資源的鎖的數量,或減輕其影響,如果他們真的不能被刪除。目前,這些技術都在Android中用於減少優先級反轉問題。

檢測

這是很難發生之前自動檢測優先級反轉。如果您懷疑它正在發生,您可以使用諸如systraceps -t -p等工具來測試您的假設,以檢查您的不同進程花費在執行和阻止上的時間。最好的建議是對你正在處理的系統的不同部分以及優先級反轉問題有一個很好的理解。