Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android進程優先級基礎教程

Android進程優先級基礎教程

編輯:關於Android編程

線程與進程的最大區別就是是否共享父進程的地址空間,內核角度來看沒有線程與進程之分,都用task_struct結構體來表示,調度器操作的實體便是task_struct。

一、 進程優先級

進程可劃分為普通進程和實時進程,那麼優先級與nice值的關系圖:

nice_prio

優先級值越小表示進程優先級越高,3個進程優先級的概念:

  • 靜態優先級: 不會時間而改變,內核也不會修改,只能通過系統調用改變nice值的方法區修改。優先級映射公式: static_prio = MAX_RT_PRIO + nice + 20,其中MAX_RT_PRIO = 100,那麼取值區間為[100, 139];對應普通進程;

  • 實時優先級:只對實時進程有意義,取值區間為[0, MAX_RT_PRIO -1],其中MAX_RT_PRIO = 100,那麼取值區間為[0, 99];對應實時進程;

  • 動態優先級: 調度程序通過增加或減少進程靜態優先級的值,來達到獎勵IO消耗型或懲罰cpu消耗型的進程,調整後的進程稱為動態優先級。區間范圍[0, MX_PRIO-1],其中MX_PRIO = 140,那麼取值區間為[0,139]

nice值

nice∈[-20, 19],可通過adb直接修改某個進程的nice值: renice prio pid

二、 Framework調度策略

代碼路徑: framework/base/core/android/os/Process.java

2.1 進程優先級

Android進程優先級,總分10級

優先級調度方法:

setThreadPriority(int tid, int priority)

進程優先級級別:

進程優先級 nice值 解釋 THREAD_PRIORITY_LOWEST 19 最低優先級 THREAD_PRIORITY_BACKGROUND 10 後台 THREAD_PRIORITY_LESS_FAVORABLE 1 比默認略低 THREAD_PRIORITY_DEFAULT 0 默認 THREAD_PRIORITY_MORE_FAVORABLE -1 比默認略高 THREAD_PRIORITY_FOREGROUND -2 前台 THREAD_PRIORITY_DISPLAY -4 顯示相關 THREAD_PRIORITY_URGENT_DISPLAY -8 顯示(更為重要),input事件 THREAD_PRIORITY_AUDIO -16 音頻相關 THREAD_PRIORITY_URGENT_AUDIO -19 音頻(更為重要)

2.2 組優先級

進程/線程組優先級調度方法:

setProcessGroup(int pid, int group)
setThreadGroup(int tid, int group)

進程組優先級級別:

組優先級 取值 解釋 THREAD_GROUP_DEFAULT -1 僅用於setProcessGroup,將優先級<=10的進程提升到-2 THREAD_GROUP_BG_NONINTERACTIVE 0 CPU分時的時長縮短 THREAD_GROUP_FOREGROUND 1 CPU分時的時長正常 THREAD_GROUP_SYSTEM 2 系統線程組 THREAD_GROUP_AUDIO_APP 3 應用程序音頻 THREAD_GROUP_AUDIO_SYS 4 系統程序音頻

2.3 調度器選擇

調度器設置方法:

setThreadScheduler(int tid, int policy, int priority)

調度器類別

調度器 名稱 解釋 SCHED_OTHER 默認 標准round-robin分時共享策略 SCHED_BATCH 批處理調度 針對具有batch風格(批處理)進程的調度策略 SCHED_IDLE 空閒調度 針對優先級非常低的適合在後台運行的進程 SCHED_FIFO 先進先出 實時調度策略,android暫未實現 SCHED_RR 循環調度 實時調度策略,android暫未實現

三、 Kernel調度策略

設置優先級,Kernel不區別線程和進程,都對應同一個數據結構Task。Linux kernel用nicer值來描述進程的調度優先級,該值越大,表明該進程越友(nice),其被調度運行的幾率越低。

3.1 優先級

int setpriority(int which, int who, int prio);

參數說明:

  • which和who參數聯合使用:
    • 當which為PRIO_PROGRESS時,who代表一個進程;
    • 當which為PRIO_PGROUP時,who代表一個進程組;
    • 當which為PRIO_USER時,who代表一個uid。
  • prio參數用於設置應用進程的nicer值,可取范圍從-20到19。

3.2 調度器

int sched_setscheduler(pid_t pid, int policy, conststruct sched_param *param);

參數說明:

  • pid為進程id;
  • policy為調度策略;
  • param最重要的是該結構體中的sched_priority變量;
    • 針對Android中的三種非實時Scheduler策略,該值必須為NULL。

選擇和設置合理的進程優先級和調度器是性能優化的一個方向,後續再以內核調度器的角度來分析調度策略的抉擇問題。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved