進程篇—進程整理(轉)
一、概括
系統啟動架構圖:
上圖在Android系統-開篇中有講解,是從Android系統啟動的角度來分析,本文是從進程/線程的視角來分析該問題。
1.1 父進程
在所有進程中,以父進程的姿態存在的進程(即圖中的淺紅色項),如下:
kthreadd進程
: 是所有內核進程的父進程init進程
: 是所有用戶進程的父進程(或者父父進程)zygote進程
: 是所有上層Java進程的父進程,另外zygote
的父進程是init
進程。
1.2 重量級進程
在Android進程中,有3個非常重要的進程(即圖中的深紫色項),如下:
-
system_server
:是由zygote孵化而來的,是zygote的首席大弟子,托起整個Java framework的所有service,比如ActivityManagerService, PowerManagerService等等。 -
mediaserver
:是由init孵化而來的,托起整個C++ framework的所有service,比如AudioFlinger, MediaPlayerService等等。 -
servicemanager
:是由init孵化而來的,是整個Binder架構(IPC)的大管家,所有大大小小的service都需要先請示servicemanager。
二、進程
Android進程從大類來劃分,可分為內核進程和用戶進程。
2.1 kthreadd子進程
kthreadd
進程(2號進程),是Linux系統的內核進程,是所有內核進程的鼻祖。
由Kthreadd孵化出來的內核守護進程,這些進程位於系統啟動架構圖中的kernel的深藍色塊。下面列舉常見的內核進程:
進程名 | 解釋 |
---|---|
ksoftirqd/0 | |
kworkder/0:0H | |
migration/0 | |
watchdog/0 | |
binder | |
rcu_sched | |
perf | |
netns | |
rpm-smd | |
mpm | |
writeback | |
system | |
irq/261-msm_iom | |
mdss_dsi_event | |
kgsl-events | |
spi | |
therm_core:noti | |
msm_thermal:hot | |
… | … |
內核進程都不存在子進程與子線程,並且所有內核進程的用戶都是root.
每個內核進程的作用,後續再補上
2.2 init子進程
init
進程(1號進程),是Linux系統的用戶空間進程,或者說是Android的第一個用戶空間進程。
下面列舉常見的由init進程孵化而來的用戶進程:
進程名 | 進程文件 | 作用 |
---|---|---|
zygote | /system/bin/app_process | Java界的第一個進程,分32位和64位 |
servicemanager | /system/bin/servicemanager | Binder的守護進程 |
media | /system/bin/mediaserver | 多媒體服務的進程 |
ueventd | /sbin/ueventd | uevent守護進程 |
healthd | /sbin/healthd | 電池的守護進程 |
logd | /system/bin/logd | log的守護進程 |
adbd | /sbin/adbd | adbd進程(Socket IPC) |
lmkd | /system/bin/lmkd | lowmemorykiller守護進程 |
console | /system/bin/sh | 控制臺 |
vold | /system/bin/vold | volume守護進程 |
netd | /system/bin/netd | network守護進程 |
debuggerd | /system/bin/debuggerd | 用於調試程序異常退出 |
debuggerd64 | /system/bin/debuggerd64 | 用於調試程序異常退出 |
ril-daemon | /system/bin/rild | Radio Interface Layer的守護進程 |
installd | /system/bin/installd | 安裝的守護進程 |
surfaceflinger | /system/bin/surfaceflinger | UI幀相關的進程 |
… | … |
servicemanager,作為Binder架構的一個大管家,所有註冊服務、獲取服務,都需要經過servicemanager,更多關於servicemanager查看Binder系列文章。
2.3 Zygote子進程
Zygote本身是一個Native的應用程序,剛開始的名字為“app_process”,運行過程中,通過系統調用將自己名字改為Zygote。是所有上層Java進程的父進程,android系統中還有另一個Zygote64進程,用於孵化64位的應用進程。
在圖中的紅色線,便是Zygote fork出來的進程,所有的App進程都是由Zygote fork產生的。
下面列舉Zyogte進程
孵化的部分子進程
進程名 | 解釋 |
---|---|
system_server | Java framework的各種services都依賴此進程 |
com.android.phone | 電話應用進程 |
android.process.acore | 通訊錄進程 |
android.process.media | 多媒體應用進程 |
com.android.settings | 設置進程 |
com.android.wifi | Wifi應用進程 |
… | … |
三、線程
3.1 Zygote 子線程
在adb shell
終端,輸入:
ps -t | grep -E "NAME| 497 "
解釋: -E "NAME| 497 "
是輸出時能多顯示NAME
的那一行,方便查看每一列代表的具體含義,497
是Zygote的進程號。
共享父進程的地址空間的便是子線程,即VSIZE必然相同,否則就是子進程,如下圖:
圖中紅色圈起來的便是子線程,其他都是子進程。
可見Zygote的子線程如下:
線程名 | 解釋 |
---|---|
ReferenceQueueD | 引用隊列的守護線程 |
FinalizerDaemon | 析構的守護線程 |
FinalizerWatchd | 析構監控的守護線程 |
HeapTrimmerDaem | 堆整理的守護線程 |
GCDaemon | 執行GC的守護線程 |
這5個線程都是與虛擬機息息相關的線程,之後所有由Zygote直接或間接孵化的子進程,都會包含這5個線程,那麽就在其線程說明中,不再重復,而是以“用於GC”的字樣來表示。後續有空會專門針對Android的虛擬機展開討論。
3.2 system_server 子線程
Java Framework中的service都運行在system_server進程中,system_server內的子線程很多,統計了下自己身邊的手機有system_server有122個線程。下面列舉部分子線程:
線程名 | 解釋 |
---|---|
system_server | 包含4個此同名線程 |
Heap thread poo | 異步的HeapWorker, 包含5個 |
Signal Catcher | 捕捉Kernel信號,比如SIGNAL_QUIT |
JDWP | 虛擬機調試的線程 |
ReferenceQueueD | 用於GC |
FinalizerDaemon | 用於GC |
FinalizerWatchd | 用於GC |
HeapTrimmerDaem | 用於GC |
GCDaemon | 用於GC |
android.fg | 前臺的Looper線程 |
android.ui | UI的Looper線程 |
android.io | IO的Looper線程 |
android.display | display的Looper線程 |
ActivityManager | AMS線程 |
PowerManagerSer | PMS線程 |
PackageManager | PKMS線程 |
watchdog | 看門狗線程 |
RenderThread | 渲染線程 |
Binder_ | IPC線程, 包含16個 |
CpuTracker | 統計進程CPU信息 |
PerformanaceCont | system_server專有 |
FileObserver | system_server專有 |
WifiMonitor | system_server專有 |
UEventObserver | system_server專有 |
Thread_ | 普通線程,包含若幹個 |
AsyncTask # | 異步任務,包含若幹個 |
… | … |
ActivityManagerService線程是一個ServerThread線程。進程結構體task_struct的comm字段是一個長度為16的char型,故進程名最長為15個字符。
3.3 mediaserver 子線程
mediaserver 子線程,如下:
線程名 |
---|
mediaserver |
ApmTone |
ApmAudio |
ApmOutput |
Safe Speaker Th |
AudioOut_2 |
FastMixer |
AudioOut_4 |
FastMixer |
AudioOut_6 |
Binder_1 |
Binder_2 |
每個線程的作用,後續再補上
3.4 app 子線程
此處以settings為例
線程名 | 解釋 |
---|---|
com.android.settings | settings進程 |
Heap thread poo | 異步的HeapWorker, 包含5個 |
Signal Catcher | 捕捉Kernel信號,比如SIGNAL_QUIT |
JDWP | 虛擬機調試的線程 |
ReferenceQueueD | 用於GC |
FinalizerDaemon | 用於GC |
FinalizerWatchd | 用於GC |
HeapTrimmerDaem | 用於GC |
GCDaemon | 用於GC |
Binder_1 | 用於IPC |
Binder_2 | 用於IPC |
pool-m-thread-n | 線程池m中的第n個線程,包含若幹個 |
AsyncTask #1 | 異步任務 |
RenderThread | 渲染線程 |
WifiManager | 管理wifi的線程 |
一般地,每個apk都會產生2或3個Binder線程,Apk運行的Activity或service都會產生2個Binder線程。
關於Binder問題
- 主線程是由 Zygote母體生成的;
- 線程池:首次創建第一個Binder線程A,然後監聽BR_SPAWN_LOOPER事件,收到後創建第二個Binder線程B,線程B繼續監聽BR_SPAWN_LOOPER事件,收到後創建第三個Binder線程C。總共創建3個Bindr線程,這是Binder協議決定。根據系統處理器數目以及應用程序的負載強度,線程池的線程數目可以動態調整,這是Binder優化需要考慮的。
四、進程統計
下面以一臺基於Android 5.1.1的手機為例,統計以“父進程”作為PPID的進程個數統計表:
父進程 | 個數 | 解釋 |
---|---|---|
0 | 2 | 分別為init, kthreadd |
init | 55 | 用戶進程 |
kthreadd | 303 | 內核進程 |
zygote64 | 41 | 64位zygote |
zygote | 3 | 32位zygote |
qseecomd | 1 | 高通安全執行環境 |
adbd | 2 | 打開了2個adb窗口 |
sh | 2 | 分別為ps, grep |
圖中zygote64/zygote/qseecomd/adbd的父進程都是init進程,而sh的父進程是adbd,而adb和qseecomd的父進程都是init進程。
手機總計:407
個進程,1575
個線程。(該數據僅供參考,讓大家對手機當前的進程和線程的數量級有個大概的感觀)
轉自:http://gityuan.com/2015/12/19/android-process-category/
進程篇—進程整理(轉)