在介绍Binder之前,先了解一下Linux内核的基础知识,主要有三个知识点:
1、进程隔离/虚拟地址空间
2、系统调用
3、binder驱动
下面开始学习binder
一、什么是binder
1、通常意义下,binder指的是一种通信机制
2、对于server进程来说,binder指的是binder本地对象;对于client来说,binder指的是binder代理对象。
3、对于传输过程而言,binder是可以跨进程传递的对象。
二、为什么要使用binder
1、Android使用的linux内核拥有着非常多的跨进程通信机制
2、性能:在移动设备上(性能受限制的设备:比如要省电),广泛地使用跨进程通信对通信机制的性能有严格的要求,binder相对传统的socket方式,更加高效。binder数据拷贝只需要一次,而管道、消息队列、socket都需要2次,共享内存方式一次内存拷贝都不需要,但实现方式又比较复杂。
3、安全:传统的进程通信方式对于通信双方的身份并没有做出严格的验证,比如socket通信,IP地址是客户端手动填入,很容易进行伪造,而binder机制从协议本身就支持对通信双方做身份校验,因而大大提升了安全性。
三、binder通信模型
binder运行机制
binder基于client-server通信模型,除了client端和server端,还有两角色一起合作完成进程间通信功能。
binder通信的四个角色:
(1)client进程:使用服务的进程。
(2)server进程:提供服务的进程。
(3)serviceManager进程:serviceManager的作用是将字符形式的binder名字转化成client中对该binder的引用,使得client能够通过binder名字获得对server中binder实体的引用。
(4)binder驱动:驱动负责进程之间binder通信的建立,binder在进程之间的传递,binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。
四、binder的线程管理
每个binder的server进程会创建很多线程来处理binder请求,可以简单的理解为创建了一个binder的线程池(虽然实际上并不完全是这样简单的线程管理方式),而真正管理这些线程并不是由这个server端来管理的,而是由binder驱动进行管理的。
一个进程的binder线程数默认最大是16,超过的请求会被阻塞等待空闲的binder线程。
好了,关于binder就先学习到这吧。
参考文章:(http://www.jianshu.com/p/c7bcb4c96b38)