Binder是android系统中的一种进程通信方式,Android开发以及源码中大量使用了这种方式。
进程空间分为:用户空间和内核空间,用户空间不共享,内核空间是共享。
Binder驱动运行在内核空间,相比于其他的进程通信方式如管道,socket等,Binder通信方式只需要进行一次数据拷贝,而其他方式需要进行两次数据拷贝。
两次数据拷贝分别是:
copy_from_user() //将数据从用户空间拷贝到内核空间
copy_to_user() //将数据从内核空间拷贝到用户空间
image.png
Binder只有一次数据拷贝的原因是内存映射 image.png
一次完整的Binder IPC 通信过程通常是这样:
- Binder 驱动在内核空间创建一个数据接收缓存区;
- 然后在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;
- 发送方进程通过系统调用 copy_from_user() 将数据拷贝到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。
Binder内容分布在Android系统的Java层,Native层和驱动层。
Binder通信采用C/S结构,主要的角色包括:Client,Server,Service Manager和Binder驱动。
image.png
Service Manager是服务管理类,一个Service想要在Android系统生效,必须在Service Manager进行注册,也就是调用它的addService方法,之后客户端可以通过getService获取对应的服务,然后客户端和服务端可以进行通信。
步骤1,2,3都使用Binder通信进行跨进程通信。
文章大部分内容和所用图片来自参考内容3。
参考:
- 《深入理解Android卷1》
- 《深入理解Android卷2》
- Android——Binder机制
网友评论