zoukankan      html  css  js  c++  java
  • Android系统binder机制的研究分析

    binder是安卓系统中非常重要的传输方法,笔者之前所在公司进程间通信采用的都是binder方法,之前笔者只是会用,能看懂,最近趁着手头的事情告一段落,决定对它的机制做了一番研究,以下就是我的分析成果,不对之处,请各位大神多多指教。

      一、为什么要用binder

      二、binder的原理

      三、binder的结构

      四、binder传输时序

      五、总结

      一、为什么要用binder

        首先在说binder结构之前,我们要说一下我们为什么要用binder。要回答这个问题,我们先简单说一下binder是什么。所谓binder,就是在Android系统中所创造出来的一种进程间的通信机制。通过这样一种通信机制,我们可以实现进程间通信,那么有人可能要问进程间通信有很多,比如管道,消息队列等等。binder有什么读到之处吗?有的,最大的不同就在于其他的所有消息队列他们都是取了两次数据,即放入了一次,取出了一次,而binder的话只需要传递一次就可以了,这是binder的非常神奇的地方。

      二、binder的原理

        以32位总线为例,我们的虚拟内存是4G,创建完成之后,有3G是给了用户层,1G给了内核,其中内核是连接各个进程之间的,可以进行通信,所以binder就是利用了这一点。

      三、binder的结构

        binder的结构主要分成三大部分,分别是客户端(获取数据的部分),ServiceManager(管理部分),服务端(提供数据的部分)。

      四、binder的传输时序

        binder的总体时序如下:

          1、开机时候服务端对ServiceManger端进行注册。

          2、调用的时候ServiceManager端会给客户端创建一个代理

          3、客户端向代理提出一个获取相应服务的请求,代理通过ServiceManager端将其发送到服务端

          4、服务端经过处理后将结果返回给客户端代理

          5、客户端处理该请求

      所以其时序可以分成两部分,第一部分就是开机时候服务端对ServiceManager端进行注册

                     第二部分就是客户端向服务端提出请求

          第一部分:1、判断当前服务时候注册进入

               2、如果有不用注册

                 3、如果没有创建一个新的服务端,并将其放到链表中

                 4、通知binder驱动注册成功。

          第二部分:这一部分也可以分成两部分,第一部分为创建代理过程,第二部分为客户端发送请求过程

                 第一:ServiceManager——Processstate——BPbinder

                 第二:客户端——BPbinder——ProcessState——IPCThread——binder驱动——ServiceManager(函数调用)——getService——transnt——服务端——进入死循环——ontransnt函数

      五、总结

          binder主要利用了内核层的传输通道,其中间有ServiceManager进行管理,但是该服务却又不介入客户端和服务器中间,客户端直接向服务器申请数据,这就是binder驱动的奥妙所在。

      PS:本部分是该系列的第一章,大概讲了一个架子,里面的具体内容留待以后在讲,谢谢。

           

  • 相关阅读:
    [HAOI2008]糖果传递
    LGTB 与大数
    LGTB 与序列
    poj1160 Post Office
    组队
    [JLOI2015]装备购买
    三元组
    乘法表
    [BZOJ3730]震波
    [Luogu3345][ZJOI2015]幻想乡战略游戏
  • 原文地址:https://www.cnblogs.com/songyuchen/p/13184227.html
Copyright © 2011-2022 走看看