Binder 总结

2018-11-29  本文已影响0人  xgd6612

什么是binder

binder是Android 中的一种进程间通信机制(IPC机制)

binder 为什么会出现

android 是一种基于linux 的系统,linux 系统已经提供了 诸如管道、消息队列、共享内存和socket 等IPC 方式。既然已经存在了如此之多的IPC 机制,为什么binder还会出现?主要是因为上述IPC机制无法对android 而言存在着诸多的不便,主要体现在性能,稳定性和安全性三个方面。

  1. 性能:
    传统的linux IPC 机制 继承通信过程分为3个部分。首先消息发送发会在内核空间中申请一块空间,然后将数据复制到内核空间中。然后内核空间会通知接收方,接收方会在自己的进程中开辟一块内存空间用于接收数据(这里由于不知道具体数据的大小,开辟的内存空间会过大 或者先请求数据大小,再开辟空间)。传统的IPC 会经过2次数据的复制,性能方面较差。
    binder是通过内存映射进行数据传输的,它只需要复制一次数据到内核空间中,所以效率相对于传统的IPC机制要更好一些。
    2.稳定性:
    binder 是 基于C/S 架构的,客户端不处理问题,问题都丢给服务端,其稳定性更好。
    3.安全性:
    linux 传统的IPC 机制 的安全性并没有什么保障,其安全性完全依赖于上层协议,会手动的传入UID/PID 很容易被恶意程序利用。而Binder并不是手动传入UID/PID,既支持实名binder又支持匿名binder,安全性能更高。

综上,android中使用Binder作为其IPC 机制。

binder 的底层原理

binder 主要是通过内存映射来实现的,一次完整的ipc通讯的过程如下:
1.binder 驱动在内核中创建一块数据接收缓冲区
2.建立一块内核缓冲区
3.建立内核缓冲区和数据接收缓冲区的映射
4.建立内核数据缓冲区和接收进城用户空间的映射
5.发送方将数据发送到内核缓冲区
6.由于映射的存在,就相当于直接将数据发送到了 接收进城中

binder的实现

binder 主要有四部分组成

其中binder client 、 binder service 和 servicemanager 运行在用户空间,而binder 驱动则是运行在内核空间(binder驱动是通过模块挂载的方式,运行在内核空间中的)。

binder 的工作流程其实可以类比为 上网的过程。客户端(binder client) 服务器(binder service) dns(servicemanager) 和 路由器(binder 驱动)

客户端输入网址请求服务器会在路由器的帮助下请求 dns 服务器获取服务器的ip地址,然后利用ip地址和服务器进行通讯。

binder基本的运行如下:

1.首先一个进城通过binder驱动将自己注册为servicemanager

2.service 通过binder 驱动将自己的binder 注册到servicemanager中,以对外使用。在这个过程中,binder驱动会生成该binder 的内核节点,以及该节点的引用,并将这些内容发送给servicemanager,servicemanager会把引用存入表中
3.client 通过binder名称,在binder驱动的帮助下在servicemanager中获取到service 中binder 的引用,从而跨进程通信

关键实现

1.通过上述的工作流程可知,servicemanager 其实是一个特殊的进程,service 和 client 和 servicemanager 之间的通讯其实也是进程间的通讯,而这里的进程间通信其实也是使用的binder通信。这里的设计十分巧妙,servicemanager 是service 端,其他所有进程都是它的client 端,servicemanager提供了一个非常特殊的binder,他不需要注册也没有名字,其他进程可以直接获取到该binder 和servicemanager 进行通讯。

2.binder中还使用了代理模式,client 端所获取的service 的binder引用并不是一个真的binder对象,而是一个service端binder 的代理,调用binder中方法的时候通过对service进行请求然后获取返回结果。

联想记忆

android binder通信机制其实可以看作是一次简单的上网过程

1.客户端输入网址(发送端请求跨进程通信)
2.通过路由器查询dns 服务器 根据域名获取ip地址(通过binder驱动,获取servicemanager 中实名binder的引用)
3.根据返回的ip地址,通过路由器连接服务器(根据获取到service端的binder 代理 client端和service端进行通信 )

上一篇下一篇

猜你喜欢

热点阅读