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

隨筆之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能
力不夠。直接把該現象告訴領導,這個事情也就結了。可是⼀
直沒在代碼中找到依據:總有地方設置進程的優先級吧??
後來,時間充裕了,想起這個問題。果不其然,在MediaScan
nerService中,找到答案:
public void run()
{
Process.setThreadPriority(Process.THREAD_PRIORITY_BA
                Process.THREAD_PRIORITY_LESS_FAVORAB
     ……
}
上面代碼顯示得將本進程的優先級設置爲BACKGROUND+LE
SS_FAVORABLE。
那麼這個優先級是什麼呢?
本隨筆將關注兩個問題:
Android平臺提供的調度接口及其它的實現
調度⼀定是依靠Linux OS的,那麼本隨筆也會順便介紹⼀
下Linux OS中的進程調度相關的知識。
二 Android平臺中的進程調度接口
從最上的Java層看,Anroid提供的Process類封裝了進程調度
優先級,調度策略等⼀些API。下圖是總體調用流程和相關文
件位置。
 
 
圖1 進程調度的API以及調用分發流程
從上圖咱們可知:
重點討論Process.java提供的setThreadPriority和setThrea
dGroup函數。
調用分發順序從Java⼀直貫穿JNI,Native層後,setThread
Priority直接轉移到setpriority系統調用,而setThreadGrou
p經過set_sched_policy處理後,再轉移給sched_setsche
duler系統調用。
 
2.1 設置調度優先級
進程調度的優先級,這個應該不難理解。簡單地說:
l         OS在調度進程的時候是遵循⼀定規則的,優先級高的
進程分配CPU的時間多,而優先級低的進程相對分配的CPU時
間少。(這個僅是理論上的,具體如何分配是和OS相關的)
下面咱們看看androidSetThreadPriority的實現。
int androidSetThreadPriority(pid_t tid, int pri)
{
#if defined(HAVE_PTHREADS)  //目前僅支持POSIX
//phtread_once保證這個線程建立時會首先執行⼀次(僅此⼀次,
//checkDoSchedulingGroup函數,該函數判斷系統是否設置了」de
    pthread_once(&gDoSchedulingGroupOnce, checkDoSch
    if (gDoSchedulingGroup) {
        if (pri >= ANDROID_PRIORITY_BACKGROUND) {
            //設置調度策略。這個咱們待會會碰到。
            rc = set_sched_policy(tid, SP_BACKGROUND
        } else if (getpriority(PRIO_PROCESS, tid) >=
            rc = set_sched_policy(tid, SP_FOREGROUND
        }
    }
  ……
   //設置調度優先級。
   if (setpriority(PRIO_PROCESS, tid, pri) < 0) {
        rc = INVALID_OPERATION;

……
}
從上面代碼發現,Android直接調用了系統API setpriority,其
中有三個參數,其原型是:
int setpriority(int which, int who, int prio);
第⼀個參數which可選值爲PRIO_PROGRESS,表示設置
進程;PRIO_PGROUP表示設置進程組;PRIO_USER表
示user。
第二個參數who,根據第⼀個參數的不一樣,分別指向進程I
D;進程組ID和user id。
第三個參數學名叫nice值,從-20到19。是優先級的表示
,越大代表越nicer,優先級越低。

看來,設置進程調度優先級仍是很簡單的嘛! java

查看更多…… android

相關文章
相關標籤/搜索