1. 程式人生 > >進程篇—進程整理(轉)

進程篇—進程整理(轉)

說明 radi 隊列 所有 看門狗 子進程 andro 過程 內核進程

一、概括

系統啟動架構圖:

技術分享

上圖在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/

進程篇—進程整理(轉)