IPC-Android中的進程與進程間通信

一节芥、Android中的進程

官方解釋
Android的系統(tǒng)架構(gòu)底層是Linux当船,上層采用的是可以運行java(其實是dex字節(jié)碼)的虛擬機(Dalvik & ART),Dalvik的核心內(nèi)容是實現(xiàn)庫(libdvm.so)钝尸,大體由C語言實現(xiàn)挎狸。依賴于Linux內(nèi)核的一部分功能——線程機制钾埂、內(nèi)存管理機制河闰,能高效使用內(nèi)存科平,并在低速CPU上表現(xiàn)出的高性能。每一個Android應(yīng)用在底層都會對應(yīng)一個獨立的Dalvik虛擬機實例姜性,其代碼在虛擬機的解釋下得以執(zhí)行匠抗。

1. 內(nèi)核進程(確切的說是內(nèi)核線程kernel thread)和用戶進程

這個是根據(jù)進程運行空間來區(qū)分的。linux常見進程與內(nèi)核線程

屏幕快照 2017-05-04 13.52.55.png

USER 進程當(dāng)前用戶
PID 進程ID
PPID 父進程ID
VSIZE 進程的虛擬內(nèi)存大小污抬,以KB為單位
RSS 實際占用的內(nèi)存大小,以KB為單位
PC Program Counter
NAME 進程狀態(tài)及名稱

上圖是用ChromeADB這個工具抓取的系統(tǒng)進程信息绳军,當(dāng)然也可直接用adb 的ps命名查看印机。對上圖表頭的做些解釋,PID指的是進程id,PPID指的是parent ID也就是父進程的pid门驾。至于VSIZE和RSS是和內(nèi)存相關(guān)的射赛,暫時不管。仔細觀察pid和ppid會發(fā)現(xiàn)規(guī)律奶是。

1.0. 進程這東西要從Linux說起楣责,Android系統(tǒng)內(nèi)核是Linux,所以Android系統(tǒng)啟動聂沙,必須先要Linux系統(tǒng)啟動秆麸。而Linux下有3個特殊的進程,idle進程(PID = 0), init進程(PID = 1)和kthreadd(PID = 2)及汉,至于這三個進程的作用沮趣,可以簡答的理解為idle(PID=0)的這個是操作系統(tǒng)boot起來后第一個線程,initkthreadd都是由它通過kernel_thread創(chuàng)建出來的坷随。
1.1. kthreadd線程由idle通過kernel_thread創(chuàng)建房铭,并始終運行在內(nèi)核空間,它的任務(wù)就是管理和調(diào)度其他內(nèi)核線程kernel_thread(內(nèi)核線程)温眉。所有內(nèi)核進程的用戶都是root缸匪,所有的內(nèi)核線程都是直接或者間接的以kthreadd為父進程 。
1.2. init進程:由idle通過kernel_thread創(chuàng)建类溢,在Linux中的定義是一個由內(nèi)核啟動的用戶級進程凌蔬, Kerner啟動后會調(diào)用/system/core/init/Init.cpp的main()方法,然后解析/init.rc文件豌骏,包括所有的.rc文件龟梦,最重要的Zygote進程啟動起來。所以窃躲,init始終是第一個進程(其進程編號始終為1)计贰。在系統(tǒng)啟動完成完成后,init將變?yōu)槭刈o進程監(jiān)視系統(tǒng)其他進程蒂窒。在Android中的含義也是一樣的躁倒,是所有用戶進程的父進程荞怒。

//主要進程的創(chuàng)建(kthreadd或者fork)關(guān)系,PID給出的那幾個的PID在任何設(shè)備上都是相同的
idle(PID == 0)
    |---init(PID==1)
            |---servicemanager(它是整個Binder機制的守護進程)
            |---zygote
                 |---system_server
                 |---com.xxx.app(每個app至少有一個進程)
            |---mediaserver
            |--- 秧秉。褐桌。。其他進程
    |---kthreadd(PID == 2)
            |---binder
            |---watchdog
            |---象迎。荧嵌。。其他進程

其實對于Android中進程砾淌,我們主要關(guān)心的是init進程fork出來的那幾個重要的進程

2.進程生命周期

看官網(wǎng)解釋很清楚啦撮,不再抄過來了
Android進程的重要性,劃分5級汪厨,前臺進程的重要性最高赃春,依次遞減:
前臺進程(Foreground process)
可見進程(Visible process)
服務(wù)進程(Service process)
后臺進程(Background process)
空進程(Empty process)

作用:必要時(當(dāng)資源有限時),系統(tǒng)會首先消除重要性最低的進程劫乱,然后是重要性略遜的進程织中,依此類推,以回收系統(tǒng)資源衷戈。

3. Android中開啟進程的方式

  • Manifest文件給<activity> <service> <receiver> <provider>設(shè)置屬性android:process 指定單獨進程
<!-- 假設(shè)包名為me.febsky.app -->
 <activity
       android:name="me.febsky.app.OtherActivity"
       android:process=":remote" />
  • 通過jni在native層fork一個進程出來

注:android:process=":remote" 這行代碼翻譯一下狭吼,其實他的完整進程名為:me.febsky.app:remote(假設(shè)當(dāng)前應(yīng)用包名為me.febsky.app)。進程名以“:”開頭的進程屬于當(dāng)前應(yīng)用的私有進程脱惰,其他應(yīng)用不可以通過SharedUID的方式和他跑在同一個進程中搏嗡;而如果沒有用“:”,直接指定android:process="me.febsky.remote" 說明開啟的這個進程是可以和別的app(這個app必須和當(dāng)前app簽名相同并且指定了sharedUID)共享的拉一。

二采盒、Android中IPC

一個app可以開啟多個進程,那么多個進程間就有可能需要通信蔚润。IPC是Inter-Process Communication(進程間通信)的首字母縮小磅氨。

1. Linux 中一些經(jīng)典的IPC

Android系統(tǒng)是基于Linux內(nèi)核的,而Linux內(nèi)核繼承和兼容了豐富的Unix系統(tǒng)進程間通信(IPC)機制嫡纠。有傳統(tǒng)的管道(Pipe)烦租、信號(Signal)和跟蹤(Trace),這三項通信手段只能用于父進程與子進程之間除盏,或者兄弟進程之間叉橱;后來又增加了命令管道(Named Pipe),使得進程間通信不再局限于父子進程或者兄弟進程之間者蠕;為了更好地支持商業(yè)應(yīng)用中的事務(wù)處理窃祝,在AT&T的Unix系統(tǒng)V中,又增加了三種稱為“System V IPC”的進程間通信機制踱侣,分別是報文隊列(Message)粪小、共享內(nèi)存(Share Memory)和信號量(Semaphore)大磺;后來BSD Unix對“System V IPC”機制進行了重要的擴充,提供了一種稱為插口(Socket)的進程間通信機制

Socket:這個東西探膊,在學(xué)java網(wǎng)絡(luò)編程的時候接觸的杠愧。它在Android中有個經(jīng)典的使用場景,在啟動一個單獨進程中的Activity或者Service的時候(Activity和Service的啟動后面再說逞壁,這里只需知道他們都是通過AMS啟動的就行了)流济,ActivityManagerService會通過Socket進程間通信機制,通知Zygote進程為這個應(yīng)用程序創(chuàng)建一個新的進程腌闯。

2. Android上經(jīng)典的IPC Binder

進程隔離

要說IPC袭灯,先要知道進程隔離的概念
wiki解釋:進程隔離是為保護操作系統(tǒng)中進程互不干擾而設(shè)計的一組不同硬件和軟件的技術(shù)。這個技術(shù)是為了避免進程A寫入進程B的情況發(fā)生绑嘹。 進程的隔離實現(xiàn),使用了虛擬地址空間橘茉。進程A的虛擬地址和進程B的虛擬地址不同工腋,這樣就防止進程A將數(shù)據(jù)信息寫入進程B。

Binder

這個東西并不是Google搞出來的畅卓,Binder的前身是OpenBinder擅腰,而OpenBinder的作者Dianne Hackborn現(xiàn)在在Google工作,負責(zé)Android平臺的開發(fā)工作翁潘。

Binder主要由Client(Client進程)趁冈、Server(Server進程)、ServiceManager和Binder驅(qū)動程序組成拜马。其中Client渗勘、Service和ServiceManager運行在用戶空間驼唱,而Binder驅(qū)動程序運行在內(nèi)核空間张惹。核心組件就是 Binder驅(qū)動程序了,而ServiceManager提供輔助管理的功能然遏,類似于DNS的作用扮超,無論是Client還是Service進行通信前首先要和ServiceManager取得聯(lián)系取刃。而ServiceManager是一個守護進程,負責(zé)管理Server并向Client提供查詢Server的功能出刷。

這里面很重要的一點是Binder驅(qū)動璧疗,進程a與進程b通信實際上是進程a先于Binder驅(qū)動通信,然后Binder驅(qū)動再與進程b通信的一個過程馁龟。其實進程a或者進程b與Binder的通信也是進程間通信崩侠,不過這個Binder驅(qū)動是個特殊的進程,他運行在內(nèi)核空間屁柏,至于Binder怎么就搞到了內(nèi)核空間里面去了可以搜索(Linux的動態(tài)可加載內(nèi)核模塊(Loadable Kernel Module啦膜,LKM))有送。由于進程隔離的存在,進程a打死都不可能訪問到進程b中的內(nèi)存的僧家,也就不能進行不能調(diào)用進程b中的方法,但是進程a可以通過系統(tǒng)調(diào)用的方式訪問Binder進程(內(nèi)核進程)八拱,而內(nèi)核空間的進程能訪問用戶進程a或者進程b。了解下Linux內(nèi)核控件和用戶控件的概念

ServiceManager是由init進程通過解析init.rc文件而創(chuàng)建的肌稻,其所對應(yīng)的可執(zhí)行程序/system/bin/servicemanager,所對應(yīng)的源文件是service_manager.c爹谭,進程名為/system/bin/servicemanager枷邪∨捣玻可以把/init.rc文件導(dǎo)出來看下,沒什么神秘的腹泌,創(chuàng)建這個進程的指令為:

service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凉袱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌专甩,老刑警劉巖钟鸵,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涤躲,居然都是意外死亡携添,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門篓叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烈掠,“玉大人,你說我怎么就攤上這事缸托∽蟮校” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵俐镐,是天一觀的道長矫限。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么叼风? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任取董,我火速辦了婚禮,結(jié)果婚禮上无宿,老公的妹妹穿的比我還像新娘茵汰。我一直安慰自己,他們只是感情好孽鸡,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布蹂午。 她就那樣靜靜地躺著,像睡著了一般彬碱。 火紅的嫁衣襯著肌膚如雪豆胸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天巷疼,我揣著相機與錄音晚胡,去河邊找鬼。 笑死嚼沿,一個胖子當(dāng)著我的面吹牛搬泥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伏尼,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尉尾!你這毒婦竟也來了爆阶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沙咏,失蹤者是張志新(化名)和其女友劉穎辨图,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肢藐,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡故河,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吆豹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凑阶,死狀恐怖衷快,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情师郑,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布张遭,位于F島的核電站帝璧,受9級特大地震影響湿刽,放射性物質(zhì)發(fā)生泄漏的烁。R本人自食惡果不足惜渴庆,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一襟雷、第九天 我趴在偏房一處隱蔽的房頂上張望仁烹。 院中可真熱鬧,春花似錦卓缰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摄闸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媳禁,已是汗流浹背画切。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毫别,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓台丛,卻偏偏與公主長得像挽霉,于是被迫代替她去往敵國和親变汪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容