什么是進(jìn)程間通信

什么是進(jìn)程?

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

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

Android下的進(jìn)程

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

進(jìn)程間通信

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

進(jìn)程間通信就是從文字意義上講就是不同進(jìn)程之間傳播或交換信息。

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

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

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

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

Android中 進(jìn)程間通信方式

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

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

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

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

5、使用ContentProvider
ContentProvider是Android中提供的專門用于不同應(yīng)用間進(jìn)行數(shù)據(jù)共享的方式,天生適合進(jìn)程間通信。
ContentProvider的底層實現(xiàn)也是Binder,但是它的使用過程比AIDL簡單的多,因為系統(tǒng)做了封裝,使得無需關(guān)心細(xì)節(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é)議。
兩個進(jìn)程可以通過Socket來實現(xiàn)信息的傳輸,Socket本身可以支持傳輸任意字節(jié)流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容