簡短的答案
是,可發生於Android的優先級反轉,如您所提供的link詳細說明。
的問題
任何系統,允許具有不同優先級的任務鎖定同一共享資源是易受優先級反轉,除非採取措施,以防止它。您提到了線程和進程 - 在Android中,狀態可以在進程和線程之間共享,這使得它們都易受優先級倒置的影響。
優先級反轉帶來的主要問題是較低優先級的任務被給予較少的CPU週期來執行。如果時間敏感的高優先級任務被低優先級任務阻塞,那麼它可能需要等待無法接受的長時間才能執行,並導致系統某處發生故障或降低用戶體驗。
傳統的解決方案
傳統的解決方案是優先級繼承。通過優先級繼承,保存共享資源的任務(線程或進程)將臨時繼承在該資源上阻塞的最高優先級任務的優先級。這解決了這個問題,因爲低優先級任務的執行速度要快得多,爲時間敏感的任務釋放資源。
具有此功能的互斥鎖(快速用戶空間互斥鎖)在Linux Kernel中可用。但是,他們是而不是在Android標準C庫中可用,因爲security concerns因爲它們涉及大量的開銷。
的Android解決方案
的Android開源項目recommends幾種不同的方法來處理的優先級反轉問題。
- 「嘗試鎖定」/超時鎖定 - 在低優先級任務持續多久時間內強制執行一段超時時間,使得高優先級任務更有可能及時獲得訪問權限。缺點是如果有一系列不相關的低優先級任務具有較長的累積超時時間。
- 在某些情況下,互斥或其他同步原語可以用適當的原子操作集合以及對稱多處理來代替。有關這方面的指導提供here。
- 您還可以實現無鎖定的單讀取器,單寫入器FIFO任務隊列。這被描述爲here和here。
共同所有的這些方法的基本主題是,以儘量減少對高和低優先級rasks之間共享資源的鎖的數量,或減輕其影響,如果他們真的不能被刪除。目前,這些技術都在Android中用於減少優先級反轉問題。
檢測
這是很難發生之前自動檢測優先級反轉。如果您懷疑它正在發生,您可以使用諸如systrace
和ps -t -p
等工具來測試您的假設,以檢查您的不同進程花費在執行和阻止上的時間。最好的建議是對你正在處理的系統的不同部分以及優先級反轉問題有一個很好的理解。
這是你應該擔心的。大致上每個有優先級的系統都有這個功能。但是隻有當你編寫「不好」的代碼時纔會發生這種情況,要求它以特定的順序/某些優先級執行。此外音頻系統鏈接也回答你的問題(「*試圖避免優先倒置*」):) – zapl
優先倒置通常不會發生由於錯誤的代碼,而是取決於如何通過操作系統(或某些語言的編譯器)而且它確實關係到開發者,如果語言保證不會發生優先級反轉,那麼我們就不必擔心它的迴避/預防等。 – penguin
s /壞代碼/壞系統設計。您不必編寫同時競爭共享資源的代碼。另外,如果爭用(很大程度上受到系統設計的影響)足夠高,它只會變得很糟糕。偶爾的優先級反轉調度不會損害大多數系統。 – zapl