进程间通信的方式
-
共享内存
- 创建共享内存区
int shmget(key_tkey,size_t size,int shmflg)
- 映射内存共享区shmat
char *shmat(int shmid,viod *shmaddr,int shmflag)
- 创建共享内存区
-
管道(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还是有一定优势的
同步机制的经典实现
- 信号量(Semaphore)
- Mutex
- 管程(Monitor)
android中的同步机制
- Mutex
- Condition
- Barrier
android进程间通信的主要方式binder机制
如果统观Binder中的各个组成元素,就会惊奇的发现它和TCP/IP网络有很多相似之处:
- Binder驱动->路由器
- Service Manager->DNS
- Binder Client->客户端
- Binder Server->服务端
首先Binder是android进程间通信的一种方式,
基本原理:binder定义了4个角色:client,server,serviceManager ,binder驱动
server会创建一个binder实体并起一个名字,然后将名字一块以数据包的形式通过binder驱动发送给serviceManager ,通知servicemanager注册一个名字为xx的Binder,然后client通过名字查询到该Binder 的引用。
注意
- Client和Server和ServiceManager实现在用户空间,Binder驱动实现在内核空间中
- Binder驱动程序和ServiceManager在Android中已经实现,开发者只需要实现Client和Server
- ServiceMagager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力
- Client和Server之间通信,是通过Binder驱动程序间接实现
AIDL
-
AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。是的,首先我们知道的第一点就是:AIDL是一种语言
-
AIDL中的定向 tag 表示了在跨进程通信中数据的流向,其中 in 表示数据只能由客户端流向服务端, out 表示数据只能由服务端流向客户端,而 inout 则表示数据可在服务端与客户端之间双向流通。其中,数据流向是针对在客户端中的那个传入方法的对象而言的。in 为定向 tag 的话表现为服务端将会接收到一个那个对象的完整数据,但是客户端的那个对象不会因为服务端对传参的修改而发生变动;out 的话表现为服务端将会接收到那个对象的的空对象,但是在服务端对接收到的空对象有任何修改之后客户端将会同步变动;inout 为定向 tag 的情况下,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动。
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 .
官网是这样解释的:所有的非基本参数都需要一个定向tag来指出数据流通的方式,不管是 in , out , 还是 inout 。基本参数的定向tag默认是并且只能是 in
网友评论