一劝篷、共享內(nèi)存
一種常用的進(jìn)程間共享方式,兩個(gè)線程可以共享訪問同一塊內(nèi)存區(qū)域民宿,減少了數(shù)據(jù)的復(fù)制操作娇妓,因此具有速度上的優(yōu)勢(shì),一般情況下實(shí)現(xiàn)共享內(nèi)存的步驟如下:
1.創(chuàng)建共享區(qū)域活鹰,進(jìn)程1首先通過操作系統(tǒng)提供的API從內(nèi)存上申請(qǐng)一塊共享區(qū)域哈恰,生成的共享區(qū)域?qū)⑴c某個(gè)特定的key進(jìn)行綁定;
2.映射共享內(nèi)存志群,成功創(chuàng)建了共享區(qū)域着绷,我們需要把它映射到進(jìn)程1的空間中才能進(jìn)一步操作。
3.訪問共享區(qū)域赖舟,進(jìn)程1已經(jīng)創(chuàng)建了共享區(qū)域蓬戚,進(jìn)程2怎么才能訪問到它呢?就是利用第一步中產(chǎn)生的key,通過操作系統(tǒng)API宾抓,傳入通過一個(gè)key即可子漩。然后將這塊內(nèi)存映射到進(jìn)程2自己的空間中豫喧。
4.進(jìn)程間通信,共享內(nèi)存的各個(gè)進(jìn)程都實(shí)現(xiàn)了內(nèi)存共享之后幢泼,便可以利用該區(qū)域進(jìn)行信息交換紧显。由于內(nèi)存共享本身沒有同步機(jī)制,所以參與通信的諸進(jìn)程需要自己寫協(xié)商處理缕棵;
5.撤銷內(nèi)存映射區(qū)孵班,完成了進(jìn)程間通信后,各個(gè)進(jìn)程都需要撤銷之前的映射操作招驴。
6.刪除功效內(nèi)存篙程,最后都必須刪除共享區(qū)域,以便回收內(nèi)存别厘。
二虱饿、管道
管道,這一次很形象的描述了參與通信的雙方的行為触趴,即進(jìn)程A與進(jìn)程B.
1.分立管道兩邊的氮发,進(jìn)行數(shù)據(jù)傳輸通信;
2.管道是單向的冗懦,所以一個(gè)管道如果既要讀也要寫的話爽冕,就必須建立兩根管道。就像水管一樣
3.一根水管同時(shí)具有讀取端和寫入端披蕉,比如進(jìn)程A從write end寫入數(shù)據(jù)颈畸,那么進(jìn)程B就可以從read end讀取到數(shù)據(jù);
4.管道是有容量限制的没讲。即當(dāng)pipe滿時(shí)承冰,寫操作將阻塞,反之食零,讀操作阻塞困乒。
三、Unix Domain Socket(UDS)
UDS是專門針對(duì)單機(jī)內(nèi)的進(jìn)程通信提出來的贰谣,優(yōu)勢(shì)也被稱為IPC Socket.兩個(gè)雖然在使用方式上類似娜搂,但是實(shí)現(xiàn)原理大不相同。Android中使用最多的一種IPC就是Binder吱抚,其次就是UDS百宇。功能如下:
1.服務(wù)端監(jiān)聽I(yíng)PC請(qǐng)求,
2.客戶端發(fā)起IPC請(qǐng)求秘豹,
3.雙方成功建立起IPC連接携御,
4.客戶端向服務(wù)端 發(fā)送數(shù)據(jù)證明IPC通信是有效的,
四、RPC(Remote Procedure Calls)
RPC涉及的通信雙方通常運(yùn)行與兩臺(tái)不同的機(jī)器中啄刹,一般而言涮坐,一個(gè)完整的RPC通信需要實(shí)現(xiàn)以下幾個(gè)步驟:
1.客戶端進(jìn)程調(diào)用Stub接口;
2.Stub根據(jù)操作系統(tǒng)的要求進(jìn)程打包誓军,并執(zhí)行相應(yīng)的系統(tǒng)調(diào)用袱讹;
3.由內(nèi)核完成與服務(wù)端的交互,她負(fù)責(zé)將客戶端的數(shù)據(jù)發(fā)給服務(wù)端的內(nèi)核昵时;
4.服務(wù)端Stub解包并調(diào)用與數(shù)據(jù)包匹配的進(jìn)程捷雕;
5.進(jìn)程執(zhí)行操作;
6.服務(wù)器以上述步驟的逆向過程將結(jié)果返回給客戶端壹甥;
5救巷、Binder機(jī)制
其實(shí)Binder機(jī)制模型就是RPC,也就是說發(fā)送的進(jìn)程向內(nèi)核提交一個(gè)完整的ipc操作句柠,該操作在接受的進(jìn)程中被執(zhí)行征绸,當(dāng)接收者執(zhí)行時(shí)發(fā)送者可能被阻塞,使得結(jié)果可以返回,發(fā)送這也可以選擇不阻塞俄占,從而繼續(xù)執(zhí)行,與接收者并行淆衷。我們知道Android是基于linux內(nèi)核的缸榄,因而她所依賴的Binder驅(qū)動(dòng)也必須是一個(gè)標(biāo)準(zhǔn)的linux驅(qū)動(dòng),具體而言Binder driver會(huì)將自己注冊(cè)成一個(gè)misc device祝拯,并向上層提供一個(gè)\dev\binder節(jié)點(diǎn)甚带,值得一提的是binder節(jié)點(diǎn)并不對(duì)應(yīng)具體的硬件設(shè)備。Binder驅(qū)動(dòng)運(yùn)行在內(nèi)核態(tài)佳头,可以提供open()鹰贵、ioctl()、mmap()等常用的文件操作康嘉;