一、共享內(nèi)存
一種常用的進程間共享方式,兩個線程可以共享訪問同一塊內(nèi)存區(qū)域,減少了數(shù)據(jù)的復制操作,因此具有速度上的優(yōu)勢,一般情況下實現(xiàn)共享內(nèi)存的步驟如下:
1.創(chuàng)建共享區(qū)域,進程1首先通過操作系統(tǒng)提供的API從內(nèi)存上申請一塊共享區(qū)域,生成的共享區(qū)域?qū)⑴c某個特定的key進行綁定;
2.映射共享內(nèi)存,成功創(chuàng)建了共享區(qū)域,我們需要把它映射到進程1的空間中才能進一步操作。
3.訪問共享區(qū)域,進程1已經(jīng)創(chuàng)建了共享區(qū)域,進程2怎么才能訪問到它呢?就是利用第一步中產(chǎn)生的key,通過操作系統(tǒng)API,傳入通過一個key即可。然后將這塊內(nèi)存映射到進程2自己的空間中。
4.進程間通信,共享內(nèi)存的各個進程都實現(xiàn)了內(nèi)存共享之后,便可以利用該區(qū)域進行信息交換。由于內(nèi)存共享本身沒有同步機制,所以參與通信的諸進程需要自己寫協(xié)商處理;
5.撤銷內(nèi)存映射區(qū),完成了進程間通信后,各個進程都需要撤銷之前的映射操作。
6.刪除功效內(nèi)存,最后都必須刪除共享區(qū)域,以便回收內(nèi)存。
二、管道
管道,這一次很形象的描述了參與通信的雙方的行為,即進程A與進程B.
1.分立管道兩邊的,進行數(shù)據(jù)傳輸通信;
2.管道是單向的,所以一個管道如果既要讀也要寫的話,就必須建立兩根管道。就像水管一樣
3.一根水管同時具有讀取端和寫入端,比如進程A從write end寫入數(shù)據(jù),那么進程B就可以從read end讀取到數(shù)據(jù);
4.管道是有容量限制的。即當pipe滿時,寫操作將阻塞,反之,讀操作阻塞。
三、Unix Domain Socket(UDS)
UDS是專門針對單機內(nèi)的進程通信提出來的,優(yōu)勢也被稱為IPC Socket.兩個雖然在使用方式上類似,但是實現(xiàn)原理大不相同。Android中使用最多的一種IPC就是Binder,其次就是UDS。功能如下:
1.服務(wù)端監(jiān)聽IPC請求,
2.客戶端發(fā)起IPC請求,
3.雙方成功建立起IPC連接,
4.客戶端向服務(wù)端 發(fā)送數(shù)據(jù)證明IPC通信是有效的,
四、RPC(Remote Procedure Calls)
RPC涉及的通信雙方通常運行與兩臺不同的機器中,一般而言,一個完整的RPC通信需要實現(xiàn)以下幾個步驟:
1.客戶端進程調(diào)用Stub接口;
2.Stub根據(jù)操作系統(tǒng)的要求進程打包,并執(zhí)行相應(yīng)的系統(tǒng)調(diào)用;
3.由內(nèi)核完成與服務(wù)端的交互,她負責將客戶端的數(shù)據(jù)發(fā)給服務(wù)端的內(nèi)核;
4.服務(wù)端Stub解包并調(diào)用與數(shù)據(jù)包匹配的進程;
5.進程執(zhí)行操作;
6.服務(wù)器以上述步驟的逆向過程將結(jié)果返回給客戶端;
5、Binder機制
其實Binder機制模型就是RPC,也就是說發(fā)送的進程向內(nèi)核提交一個完整的ipc操作,該操作在接受的進程中被執(zhí)行,當接收者執(zhí)行時發(fā)送者可能被阻塞,使得結(jié)果可以返回,發(fā)送這也可以選擇不阻塞,從而繼續(xù)執(zhí)行,與接收者并行。我們知道Android是基于linux內(nèi)核的,因而她所依賴的Binder驅(qū)動也必須是一個標準的linux驅(qū)動,具體而言Binder driver會將自己注冊成一個misc device,并向上層提供一個\dev\binder節(jié)點,值得一提的是binder節(jié)點并不對應(yīng)具體的硬件設(shè)備。Binder驅(qū)動運行在內(nèi)核態(tài),可以提供open()、ioctl()、mmap()等常用的文件操作;