編輯:關於Android編程
線程與進程的最大區別就是是否共享父進程的地址空間,內核角度來看沒有線程與進程之分,都用task_struct結構體來表示,調度器操作的實體便是task_struct。
進程可劃分為普通進程和實時進程,那麼優先級與nice值的關系圖:
優先級值越小表示進程優先級越高,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/base/core/android/os/Process.java
Android進程優先級,總分10級
優先級調度方法:
setThreadPriority(int tid, int priority)
進程優先級級別:
進程/線程組優先級調度方法:
setProcessGroup(int pid, int group)
setThreadGroup(int tid, int group)
進程組優先級級別:
調度器設置方法:
setThreadScheduler(int tid, int policy, int priority)
調度器類別
設置優先級,Kernel不區別線程和進程,都對應同一個數據結構Task。Linux kernel用nicer值來描述進程的調度優先級,該值越大,表明該進程越友(nice),其被調度運行的幾率越低。
int setpriority(int which, int who, int prio);
參數說明:
int sched_setscheduler(pid_t pid, int policy, conststruct sched_param *param);
參數說明:
選擇和設置合理的進程優先級和調度器是性能優化的一個方向,後續再以內核調度器的角度來分析調度策略的抉擇問題。
一、問題:在Android啟動後會在新進程裡創建一個主線程,也叫UI線程(非線程安全)這個線程主要負責監聽屏幕點擊事件與界面繪制。當Application需要進行耗時操作
最近比較忙,很久沒更新博客,今天我們仿一個美拍或者糗事百科的錄像功能。 首先確認步奏: 1、打開攝像頭; 2、開始錄制; 3、支持分段錄制,並支持分段刪除; 4、把分段
這個問題本身不難,但是由於項目中的需求太過於復雜,結果導致這個問題變得不是那麼容易實現。在網上一搜,結果如下:int scrollPos = refreshListVie
前言作為一名Android開發者,經常會接到項目經理提出的收集用戶信息的需求,而且對於普通開發者來說,也需要收集一些真實用戶的信息來輔助開發或者進行優化。在這裡簡單的記錄