您的位置:首页 > 职场人生

Binder机制

2017-09-08 21:25 162 查看

一、Binder的由来?

android的底层使用的是Linux内核,而Linux为了保证系统的稳定性,使用了进程隔离的机制,让不同的进程运行在不同的虚拟地址空间中,这样就可以防止两个进程A篡改进程B的数据。但是有时候我们也需要两个进程之间进行通信,比如很多时候我们app就需要调用我们系统的服务,但是两者是在不同的虚拟空间的,这时候就需要使用Binder机制来让两者建立联系。所以,Binder机制的出现是为了让两个进程之间可以实现通信。

二、Binder是如何实现进程间的通信的?

在回答Binder的通信机制之前,我们必须要了解四个重要的概念:

server:提供服务的对象

client:需要获取服务的对象

serviceManager:服务的管理者,本质上也是一个server

Binder驱动:C/S联系的中介

实现机制:

服务注册:每一个提供服务的server都会通过binder机制将自身注册到serviceManager中

Binder驱动和Server通信:Binder驱动为了和server进行通信,它做了两件事:

为每一个server在内核空间里建立了一个binder节点;

为每一个节点分配一个大于0的句柄,然后Binder驱动将服务的名字以及分配给它的句柄一起发送到serviceManager中。

Binder驱动和client通信:

client要想和server通信,首先要知道server的名字;

在知道了服务的名字以后,client会把这个名字以及一个句柄为0的值封装成一个数据包,发送给Binder驱动;

Binder驱动一看,这个句柄为0,它就会把这个数据包发送给serviceManager;

serviceManager在接收到这个数据包以后,就会根据名字来寻找它里面有没有client想要的server,如果有,那么它就会把这个server的大于0的句柄发送给Binder驱动;

Binder驱动再把这个句柄发送给client;

这样client就拿到了目标server的句柄,然后client就用现在这个目标server的句柄外加server的名字,再封装成一个数据包,发送给Binder驱动,驱动再发送给serviceManager,这样就可以找到对应的server实现通信了。

说起来可能非常繁琐,总结一下其实很简单:

1、所有的server注册到serviceManager中;

2、Binder驱动为server创建节点,分配句柄;

3、client想要什么服务就通过Binder驱动拿到对应服务的句柄,用句柄去serviceManager中去寻找对应的服务,当然获取句柄,获取服务都是要通过Binder驱动的,client不能直接对server进行访问,因为Linux内核有进程隔离机制啊,这样应该很清楚了吧。

三、关于ServiceManager的一点补充

刚才我们也说了serviceManager本质上也是一个server,那这么多server到底哪一个可以成为管理者呢?

server也是一个进程,这个进程会打开“/dev/binder”设备文件,映射内存;

然后通过“BINDER_SET_CONTEXT_MGR”命令告诉Binder驱动,让自己成为上下文的管理者,这样这个进程就成为了serviceManager;

四、为什么要使用Binder?

其实安卓中已经有非常多的通信模型了,比如管道、报文队列、插口等等,那为什么还要选择Binder呢?

安全,每一个进程都会由系统分配UID和PID,不像传统的在数据中添加UID的形式,这样那些恶意的进程就无法和其他进程进行通信,保证系统的安全;

高效,Binder实现通信的时候,只需要拷贝1次数据,而其他的比如socket需要拷贝2次,这样也节省了手机内存。

好了,对于binder机制的面试题就总结这么多了,如果有补充,后续还会更新,同样的,欢迎大家留言告诉我你们在面试过程中遇到的有关binder的面试题~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息