進程間通信的方式
-
共享內(nèi)存
- 創(chuàng)建共享內(nèi)存區(qū)
int shmget(key_tkey,size_t size,int shmflg)
- 映射內(nèi)存共享區(qū)shmat
char *shmat(int shmid,viod *shmaddr,int shmflag)
- 創(chuàng)建共享內(nèi)存區(qū)
管道(Pipe)
1.管道是單向的像水管一樣甜孤,要建立讀和寫兩個管道
2.管道容量有限 當pipe滿時,會阻塞
3.linux提供了pipe接口打開一個管道int pipe(int pipefd[2],int flags)
Unix Domain Socket(UDS)
1.cs模式 network socket就是uds
2.對于同一機器的進程間通信,uds也可以完全勝任
3.android版本以前android全部是使用binder進行進程間通信的歼郭,后來有一部分不得不使用uds代替厂抽,可見uds還是有一定優(yōu)勢的
同步機制的經(jīng)典實現(xiàn)
- 信號量(Semaphore)
- Mutex
- 管程(Monitor)
android中的同步機制
- Mutex
- Condition
- Barrier
android進程間通信的主要方式binder機制
如果統(tǒng)觀Binder中的各個組成元素剥扣,就會驚奇的發(fā)現(xiàn)它和TCP/IP網(wǎng)絡(luò)有很多相似之處:
- Binder驅(qū)動->路由器
- Service Manager->DNS
- Binder Client->客戶端
- Binder Server->服務(wù)端
首先Binder是android進程間通信的一種方式宜鸯,
基本原理:binder定義了4個角色:client坎怪,server岖沛,serviceManager 暑始,binder驅(qū)動
server會創(chuàng)建一個binder實體并起一個名字,然后將名字一塊以數(shù)據(jù)包的形式通過binder驅(qū)動發(fā)送給serviceManager 婴削,通知servicemanager注冊一個名字為xx的Binder廊镜,然后client通過名字查詢到該Binder 的引用。
注意
- Client和Server和ServiceManager實現(xiàn)在用戶空間唉俗,Binder驅(qū)動實現(xiàn)在內(nèi)核空間中
- Binder驅(qū)動程序和ServiceManager在Android中已經(jīng)實現(xiàn)嗤朴,開發(fā)者只需要實現(xiàn)Client和Server
- ServiceMagager是一個守護進程,用來管理Server虫溜,并向Client提供查詢Server接口的能力
- Client和Server之間通信雹姊,是通過Binder驅(qū)動程序間接實現(xiàn)
AIDL
AIDL是一個縮寫,全稱是Android Interface Definition Language衡楞,也就是Android接口定義語言吱雏。是的,首先我們知道的第一點就是:AIDL是一種語言
-
AIDL中的定向 tag 表示了在跨進程通信中數(shù)據(jù)的流向瘾境,其中 in 表示數(shù)據(jù)只能由客戶端流向服務(wù)端歧杏, out 表示數(shù)據(jù)只能由服務(wù)端流向客戶端,而 inout 則表示數(shù)據(jù)可在服務(wù)端與客戶端之間雙向流通迷守。其中犬绒,數(shù)據(jù)流向是針對在客戶端中的那個傳入方法的對象而言的。in 為定向 tag 的話表現(xiàn)為服務(wù)端將會接收到一個那個對象的完整數(shù)據(jù)盒犹,但是客戶端的那個對象不會因為服務(wù)端對傳參的修改而發(fā)生變動懂更;out 的話表現(xiàn)為服務(wù)端將會接收到那個對象的的空對象,但是在服務(wù)端對接收到的空對象有任何修改之后客戶端將會同步變動急膀;inout 為定向 tag 的情況下沮协,服務(wù)端將會接收到客戶端傳來對象的完整信息,并且客戶端將會同步服務(wù)端對該對象的任何變動卓嫂。
All non-primitive parameters require a directional tag indicating which way the data goes . Either in , out , or inout . Primitives are in by default , and connot be otherwise .
官網(wǎng)是這樣解釋的:所有的非基本參數(shù)都需要一個定向tag來指出數(shù)據(jù)流通的方式慷暂,不管是 in , out , 還是 inout 。基本參數(shù)的定向tag默認是并且只能是 in