Android Binder个人理解

Binder的定义:Binder是IPC(Inter-Process Communication)通信的一种方式。基于Client-Server通信模型,定义了四种角色,Client、Server、ServiceManager(SMgr)以及Binder驱动,这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,SMgr是域名服务器(DNS),驱动是路由器。(以前一直不明白,为什么需要SMgr,当把它类比为DNS之后就很好理解)

在这个定义中,我们需要搞清楚以下几个问题。
1、为什么需要IPC(进程间通信机制),为什么进程间不能直接通信(在进程里面线程之间是可以直接通信的)?
进程是什么:进程是操作资源管理的最小单位。进程是程序的一次执行过程,是动态概念。
Linux进程的结构:可由三部分组成:代码段、数据段、堆栈段。也就是程序、数据、进程控制块PBC组成。代码段存放程序的可执行代码;数据段存放程序的全局变量、常量、静态变量;堆栈段中堆用于存放动态分配的内存变量,堆栈段中的栈用于函数调用,存放着函数的参数,函数内部定义的局部变量。

说明了进程的概念之后,我们再了解进程间为什么不能直接通信,是为了防止什么问题做出了这样的限制?
因为进程之间的资源是相互独立的,对于一个进程,它不知道它所运行在的内存的物理地址是多少,它只有个虚拟内存地址,用来访问物理内存,因此它不能随意访问进程之外的内存。(这样做是为了解决进程间的相互干扰,假如A进程可以访问其他进程的内存地址,那么如果A进程执行出错改写了B进程的内存,那么就很可能导致B进程崩溃。)
32位Linux系统中,每个进程拥有4G的虚拟空间(寻址指针为4个字节,32 bit,可表示的范围为0-2^32即0-4G,其中0-3G为用户空间,3-4G为内核空间)

2、Binder是为了解决什么样的问题而存在?我们知道在Linux系统中已经有不少的IPC机制了,比如Sokcet、管道 … …,那么Binder存在的意义是什么?

Linux中众多IPC机制中,如Socket/管道/消息队列,只有Socket支持Client-Server的通信方式,但是从传输的性能上来说,Socket传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。(对于其他IPC机制,我们也可以在这些底层机制上架设一套协议来实现Client-Server通信,但是这样增加了系统的复杂性)Binder的传输性能优与其他IPC通信的其中一点表现在,Binder的数据从发送方到接受方只需要一次拷贝,而其他IPC则需要两次拷贝。
另一点是从安全性方面的考虑,传统的IPC之只能由用户在数据包中填入UID/PID,但是这样容易被恶意程序利用,可靠的身份标记只有由IPC机制本身在内核中添加。其次传统IPC访问的接入点是开放的,无法建立私有通道。比如socket的ip地址或文件都是开放的,只要知道这些接入点的程序都可以和对端建立连接。

3、对于Client-Server通信,需要实现以下两点:

一是server必须要有确定的访问接入点或者说地址来接受Client的请求,并且Client可以通过某种途径获取Server的地址;二是制定Command-Reply协议来传输数据。例如在网络通信中Server的访问接入点就是Server主机号+端口号,传输协议为TCP协议。对Server而言,Binder可以看成Server提供的实现某个特定服务的访问接入点(比如:mediaserver这个Server会有MediaPlayerService,ResourceManagerService等多个服务,这些服务都继承BBinder),Client通过这个“地址”向Server发送请求来使用该服务;对于Client而言,Binder可以看成是通向Server的管道入口,要想和某个Server通信首先必须建立这个管道并获得管道入口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值