什么是進程間通信

什么是進程?

進程(Process)是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。在當(dāng)代的計算機結(jié)構(gòu)中根蟹,進程是線程的容器。程序是指令糟秘、數(shù)據(jù)及其組織形式的描述简逮,進程是程序的實體。進程與進程之間是相互隔離的蚌堵。

進程的特點
動態(tài)性:進程的實質(zhì)是程序在中的一次執(zhí)行過程买决,進程是動態(tài)產(chǎn)生沛婴,動態(tài)消亡的吼畏。
并發(fā)性:任何進程都可以同其他進程一起并發(fā)執(zhí)行
獨立性:進程是一個能獨立運行的基本單位,同時也是系統(tǒng)分配資源和調(diào)度的獨立單位嘁灯;
異步性:由于進程間的相互制約泻蚊,使進程具有執(zhí)行的間斷性,即進程按各自獨立的丑婿、不可預(yù)知的速度向前推進
結(jié)構(gòu)特征:進程由程序性雄、數(shù)據(jù)和進程控制塊三部分組成。
多個不同的進程可以包含相同的程序:一個程序在不同的數(shù)據(jù)集里就構(gòu)成不同的進程羹奉,能得到不同的結(jié)果秒旋;但是執(zhí)行過程中,程序不能發(fā)生改變诀拭。

Android下的進程

在Android中迁筛,每個APP在各自獨立的Dalvik虛擬機中運行,擁有獨立的地址空間和資源耕挨,而Dalvik虛擬機Linux系統(tǒng)下的一個進程细卧。即App進程則為一個虛擬機進程
Android中的每個APP和系統(tǒng)進程都被分配唯一并且固定的User Id(用戶身份標(biāo)識)尉桩,這個uid與內(nèi)核層進程的uid對應(yīng),運行于Dalvik虛擬機的App程序是依托內(nèi)核層Linux進程而存在的贪庙。
因此Android使用Dalvik虛擬機和Linux的文件訪問控制來實現(xiàn)沙箱機制蜘犁,任何應(yīng)用程序如果想要訪問系統(tǒng)資源或者其它應(yīng)用程序的資源必須在自己的manifest文件中進行聲明權(quán)限或者共享uid。

進程間通信

一般來講進程之間是不存在數(shù)據(jù)資源共享和通信的止邮,CPU執(zhí)行時為不同的進程構(gòu)建不同的執(zhí)行上下文这橙,進程在獨立的上下文環(huán)境執(zhí)行計算,也就是說在進程之間是相互獨立無干的导披。

進程間通信就是從文字意義上講就是不同進程之間傳播或交換信息析恋。

如果僅僅是交換信息,那么雙方都可以訪問的介質(zhì)便可達成這種目的盛卡。
那么存在哪些介質(zhì)是雙方都能訪問的呢助隧?
進程的用戶空間是互相獨立的,一般而言是不能互相訪問的滑沧,唯一的例外是共享內(nèi)存區(qū)并村。
另外,系統(tǒng)空間是“公共場所”滓技,各進程均可以訪問哩牍,所以內(nèi)核也可以提供這樣的條件。
此外令漂,還有雙方都可以訪問的外設(shè)膝昆。
在這個意義上,兩個進程當(dāng)然也可以通過磁盤上的普通文件交換信息叠必,或者通過“注冊表”或其它數(shù)據(jù)庫中的某些表項和記錄交換信息荚孵。廣義上這也是進程間通信的手段,但是一般都不把這算作“進程間通信”纬朝。

進程間通信(IPC)是對于程序而言是一組編程接口收叶,讓程序員能夠協(xié)調(diào)不同的進程,使之能在一個操作系統(tǒng)里同時運行共苛,并相互傳遞判没、交換信息。這使得一個程序能夠在同一時間里處理許多用戶的要求隅茎。
因為即使只有一個用戶發(fā)出要求澄峰,也可能導(dǎo)致一個操作系統(tǒng)中多個進程的運行,進程之間必須互相通話辟犀。IPC接口就提供了這種可能性俏竞。每個IPC方法均有它自己的優(yōu)點和局限性,一般,對于單個程序而言使用所有的IPC方法是不常見的胞此。
IPC方法包括管道(PIPE)臣咖、消息排隊、旗語漱牵、共用內(nèi)存以及套接字(Socket)夺蛇。

對于Android來說,它是一種基于Linux內(nèi)核的移動操作系統(tǒng)酣胀,但它的進程間通信方式并不能完全繼承自Linux;相反刁赦,它有自己的進程間通信方式。
在Android中可以通過Binder輕松的實現(xiàn)進程間通信闻镶。Android還支持Socket甚脉,通過Socket可以實現(xiàn)任意兩個終端之間的通信,同一設(shè)備的兩個進程通過Socket通信自然也是可以的铆农。

類比內(nèi)網(wǎng)主機間的通信:其實進程間通信從進程獨立來看牺氨,可以把它看成計算機間的通信。比如RPC墩剖,RPC(Remote Procedure Call猴凹,遠程過程調(diào)用)是種C/S的編程模式,在一臺機器上運行的主程序岭皂,可以調(diào)用另一臺機器上準(zhǔn)備好的子程序郊霎。通過RPC可以充分利用非共享內(nèi)存的多處理器環(huán)境,可以簡便地將你的應(yīng)用分布在多臺工作站上爷绘,應(yīng)用程序就像運行在一個多處理器的計算機上一樣书劝。

Android中 進程間通信方式

1、使用Bundle
四大組件中三大組件Activity土至、Service购对、Receiver都支持在Intent中傳遞Bundle數(shù)據(jù)。
由于Bundle實現(xiàn)了Parcelable接口毙籽,所以它可以很方便的在不同的進程間傳輸數(shù)據(jù)洞斯。當(dāng)然我們傳輸?shù)臄?shù)據(jù)必須能夠被序列化,比如基本類型坑赡、實現(xiàn)了Parcelable接口的對象、實現(xiàn)了Serializable接口的對象以及一些Android支持的特殊對象么抗。

2毅否、使用文件共享
兩個進程通過讀寫同一個文件來交換數(shù)據(jù),比如A進程把數(shù)據(jù)寫入文件蝇刀,B進程通過讀取這個文件來獲取數(shù)據(jù)螟加。
Android系統(tǒng)基于Linux,使得并發(fā)讀寫文件可以沒有限制的進行,甚至兩個線程同時對文件讀寫操作都是允許的捆探,盡管可能出問題然爆,因此文件共享方式適合在對數(shù)據(jù)同步要求不高的進程間進行通信。
SharedPreferences也屬于文件的一種黍图,但是由于系統(tǒng)對它的讀寫有一定的緩存策略曾雕,即在內(nèi)存中會有一份SharedPreferences文件的緩存;因此在多進程模式下助被,系統(tǒng)對它的讀寫就變得不可靠剖张,會有很大幾率丟失數(shù)據(jù),不建議在進程間通信中使用SharedPreferences揩环。

3搔弄、使用Messenger
Messenger可以理解為信使,通過它可以再不同進程中傳遞Message對象丰滑,在Message中放入我們需要傳遞的數(shù)據(jù)顾犹,就可以實現(xiàn)數(shù)據(jù)的進程間傳遞了。
Messenger是一種輕量級的IPC方案褒墨,它的底層實現(xiàn)是AIDL蹦渣。由于它一次處理一個請求,因此在服務(wù)端不需要考慮線程同步的問題貌亭,因為服務(wù)端不存在并發(fā)執(zhí)行的情形柬唯。

4、使用AIDL
AIDL是 Android Interface definition language的縮寫圃庭,它是一種android內(nèi)部進程通信接口的描述語言锄奢。AIDL可以處理發(fā)送到服務(wù)器端大量的并發(fā)請求(不同與Messenger的串行處理方式),也可以實現(xiàn)跨進程的方法調(diào)用剧腻。
在Android中使用方法:創(chuàng)建一個Service和一個AIDL接口拘央,接著創(chuàng)建一個類繼承自AIDL接口中的Stub類并實現(xiàn)Stub中的抽象方法,在Service的onBind方法中返回這個類的對象书在,然后客戶端綁定服務(wù)端Service灰伟,建立連接后就可以訪問遠程服務(wù)器了。

5儒旬、使用ContentProvider
ContentProvider是Android中提供的專門用于不同應(yīng)用間進行數(shù)據(jù)共享的方式栏账,天生適合進程間通信。
ContentProvider的底層實現(xiàn)也是Binder栈源,但是它的使用過程比AIDL簡單的多挡爵,因為系統(tǒng)做了封裝,使得無需關(guān)心細節(jié)即可輕松實現(xiàn)IPC甚垦。ContentProvider主要以表格的形式組織數(shù)據(jù)茶鹃,和數(shù)據(jù)庫很類似涣雕,但ContentProvider對底層的數(shù)據(jù)存儲方式?jīng)]有任何要求,既可以使用Sqlite數(shù)據(jù)庫闭翩,也可以使用文件方式挣郭,甚至可以使用內(nèi)存中的一個對象來存儲。

6疗韵、使用Socket
Socket套接字兑障,是網(wǎng)絡(luò)通信中的概念,分為流式套接字和用戶數(shù)據(jù)奧套接字兩種伶棒,對應(yīng)于網(wǎng)絡(luò)的傳輸控制層中的TCP和UDP協(xié)議旺垒。
兩個進程可以通過Socket來實現(xiàn)信息的傳輸,Socket本身可以支持傳輸任意字節(jié)流肤无。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末先蒋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宛渐,更是在濱河造成了極大的恐慌竞漾,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窥翩,死亡現(xiàn)場離奇詭異业岁,居然都是意外死亡,警方通過查閱死者的電腦和手機寇蚊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門笔时,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仗岸,你說我怎么就攤上這事允耿。” “怎么了扒怖?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵较锡,是天一觀的道長。 經(jīng)常有香客問我盗痒,道長蚂蕴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任俯邓,我火速辦了婚禮骡楼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘看成。我一直安慰自己君编,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布川慌。 她就那樣靜靜地躺著吃嘿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梦重。 梳的紋絲不亂的頭發(fā)上兑燥,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音琴拧,去河邊找鬼降瞳。 笑死,一個胖子當(dāng)著我的面吹牛蚓胸,可吹牛的內(nèi)容都是我干的挣饥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼沛膳,長吁一口氣:“原來是場噩夢啊……” “哼扔枫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锹安,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤短荐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叹哭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍宋,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年风罩,在試婚紗的時候發(fā)現(xiàn)自己被綠了糠排。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡超升,死狀恐怖入宦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情廓俭,我是刑警寧澤云石,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站研乒,受9級特大地震影響汹忠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雹熬,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一宽菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竿报,春花似錦铅乡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽花履。三九已至,卻和暖如春挚赊,著一層夾襖步出監(jiān)牢的瞬間诡壁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工荠割, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妹卿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓蔑鹦,卻偏偏與公主長得像夺克,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嚎朽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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