Kernel:
Linux學(xué)習(xí)-進程管理與調(diào)度(一)-進程描述及其生命周期
Linux學(xué)習(xí)-進程管理與調(diào)度(二)-進程的創(chuàng)建與銷毀
Linux學(xué)習(xí)-進程管理與調(diào)度(三)-調(diào)度基礎(chǔ)
Linux學(xué)習(xí)-進程管理與調(diào)度(四)-負載均衡與實時性
Framework:
Android進程管理篇(一)-應(yīng)用進程啟動過程
Android進程管理篇(二)-進程查殺方式總結(jié)
Android進程管理篇(三)-進程adj算法
Android 進程管理篇(四)-cpu限制
Android 進程管理篇(五)-調(diào)度策略與優(yōu)先級
lowmemorykiller總結(jié)
這兩個系列的總結(jié),Android進程基本梳理完畢。下面來簡單總結(jié)下我對Android進程管理的理解:
在用戶空間會分所謂的進程線程,但是對于內(nèi)核看來,都是task_struct,線程只是資源共享的一種特殊進程罷了,所以這里我只說進程了。
一個應(yīng)用程序進程由zygote copy-on-write 地fork孵化,孵化出來的進程在user space封裝為ProcessRecord,而在kernel space同樣會有個task_struct與之一一對應(yīng)。
ProcessRecord會由AMS來統(tǒng)一管理,怎么管理?通過進程的生命周期以及內(nèi)部的四大組件生命周期來確定你的優(yōu)先級,而這個優(yōu)先級專門定義了一套adj類型來匹配。那么這個優(yōu)先級拿來干嘛?當(dāng)然就是做進程管理。
這里對應(yīng)進程管理的策略包括:內(nèi)存管理、cpu調(diào)度限制、調(diào)度策略以及優(yōu)先級管理。
內(nèi)存管理:AMS為每個現(xiàn)存的進程計算好oomadj,在內(nèi)存低于min水線時,kswapd0會開始回收不活躍的文件頁以及匿名頁,回調(diào)shrink觸發(fā)lmk,而lmk會通過 選擇一個滿足minfree檔位并且rss內(nèi)存占用最大的進程kill掉,來釋放內(nèi)存緩解內(nèi)存壓力。當(dāng)然,這里也可以通過memory子系統(tǒng)來設(shè)置進程組,以及進程組的內(nèi)存上限等等來做管理。CPU限制、調(diào)度策略以及優(yōu)先級管理:AMS調(diào)用android/osProcess相關(guān)方法(setProcessGroup/setThreadScheduler/setThreadPriority),JNI到Native對應(yīng)方法,最后通過調(diào)用libcutils.so/libutils.so執(zhí)行set_cpuset_policy/set_sched_policy/setpriority/sched_setscheduler等系統(tǒng)調(diào)用或者直接操作對應(yīng)cgroup文件節(jié)。通過cpu/cpuset/stune子系統(tǒng),控制進程獲得CPU可調(diào)度的范圍,調(diào)度的策略以及CPU執(zhí)行時間等,以達到對不同優(yōu)先級進程的控制??刂频淖罱K目的是達到響應(yīng)優(yōu)先于吞吐的調(diào)度目標(biāo),同時盡量保證相對最優(yōu)的負載均衡。
對于Android這種注重交互體驗的操作系統(tǒng)來說,要想保證使用app的交互體驗,站在系統(tǒng)資源的角度:一定是保證其進程生命周期更長,內(nèi)存更穩(wěn)定,獲得的CPU調(diào)度范圍更大,更容被處理效率更好的核執(zhí)行,獲得執(zhí)行的時間片更多等等方面去考慮。