歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

隨筆之Android平台上的進程調度探討

一由來

最近在翻閱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中,找到答案:

  1. public void run()  
  2. {  
  3. Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND +  
  4.                 Process.THREAD_PRIORITY_LESS_FAVORABLE);  
  5.      ……  
  6. }  

上面代碼顯示得將本進程的優先級設置為BACKGROUND+LESS_FAVORABLE。

那麼這個優先級是什麼呢?

本隨筆將關注兩個問題:

Android平台提供的調度接口及其它的實現
調度一定是依靠Linux OS的,那麼本隨筆也會順便介紹一下Linux OS中的進程調度相關的知識。

二 Android平台中的進程調度接口

從最上的Java層看,Anroid提供的Process類封裝了進程調度優先級,調度策略等一些API。下圖是整體調用流程和相關文件位置。

 

 

圖1 進程調度的API以及調用分發流程

從上圖我們可知:

  • 重點討論Process.java提供的setThreadPriority和setThreadGroup函數。
  • 調用分發順序從Java一直貫穿JNI,Native層後,setThreadPriority直接轉移到setpriority系統調用,而setThreadGroup通過set_sched_policy處理後,再轉移給sched_setscheduler系統調用。
Copyright © Linux教程網 All Rights Reserved