一由來
最近在翻閱MediaProvider的時候,突然想起之前碰到的一個問題,該問題是這樣的:
一個Pad上有很多媒體文件,然後每次開機後的一段時間內,Home Screen的反應都特別慢,有時候還會報出ANR的錯誤。從ANR文件/data/anr/traces.txt分析,發現系統打印的cpu占有率中,Android.process.media占用非常高。所以懷疑是MediaProvider做文件掃描占用CPU太多資源導致。
但是我們實際測試的時候,通過top –m 5查看cpu占有率的時候,發現只要一操作Home,android.process.media進程cpu占有率就會下降很多。
當時看到這個現象,直觀感覺就是MediaProvider搶占CPU能力不夠。直接把該現象告訴領導,這個事情也就結了。但是一直沒在代碼中找到依據:總有地方設置進程的優先級吧??
後來,時間充裕了,想起這個問題。果不其然,在MediaScannerService中,找到答案:
上面代碼顯示得將本進程的優先級設置為BACKGROUND+LESS_FAVORABLE。
那麼這個優先級是什麼呢?
本隨筆將關注兩個問題:
Android平台提供的調度接口及其它的實現
調度一定是依靠Linux OS的,那麼本隨筆也會順便介紹一下Linux OS中的進程調度相關的知識。
二 Android平台中的進程調度接口
從最上的Java層看,Anroid提供的Process類封裝了進程調度優先級,調度策略等一些API。下圖是整體調用流程和相關文件位置。
圖1 進程調度的API以及調用分發流程
從上圖我們可知: