• binder的会话链接与通信


    一、binder会话

    1、获取引用:client端通过serviceManager获取到server的地址;

    2、包装本地引用:client将自身的引用打包到parcel;

    3、发起会话:client端通过server的引用发送消息给server:transact

    4、事务处理:ontransact;

    5、结果返回:server解析数据获取到客户端的引用,然后使用这个引用执行回复。

    二、通信上下文

    在内核的binder中统一管理。

    server、client、manager的binder引用都在其中。

    打开binder的本质是在binder中建立通信上下文;

    三、通信机制:系统调用与消息队列

    服务进程与服务是一对多的关系。

    每一个服务对应一个循环线程;

    每一个循环线程对应一个事务队列(这里存疑);

    1、客户端将事务数据、server信息、自身信息打包成parcel,通过系统调用发送给binder内核;

    2、binder内核解析数据获取到server相关信息;

    3、binder将事务数据放置到服务端的消息队列;

    4、如果服务线程处于休眠状态,binder内核唤醒线程进行事务处理;

    5、处理完成后,server端通过binder内核调用发送给客户端。

    6、binder保存了客户端的信息(回调上下文)。

    四、地址解析与寻址路由

    servicemanager服务地址解析;

    binder负责寻址路由;

    五、parcel数据与地址

    和tcp/ip协议类似,数据包中包含了发送、接收双方信息和事务数据、会话信息;

    parcel包中也包含了类似的信息;

    这些信息的处理在tcp/ip协议中由网络节点和终端的底层处理;

    在binder中则有binder处理。

    六、补充

    本质上是使用了我们平常使用的共享内存是两个进程之间,即点到点的,如果有N个进程要两两通信而又不相互干扰,那么就必须有N*N个共享内存。Binder使用的共享内存是进程与binder设备之间,即binderMCU。

    使用了共享内存,在驱动中还是会有一次拷贝的,进程A向进程B传递数据时,AbinderBB就可以直接读了

    https://blog.csdn.net/yangzhiloveyou/article/details/14043801

  • 相关阅读:
    Android Watchdog
    Android Zygote进程是如何fork一个APP进程的
    java多线程面试题小结
    Java Socket通信以及可能出现的问题解决
    Java对象的浅拷贝和深拷贝&&String类型的赋值
    AtomicLong和LongAdder的区别
    JDK中Concurrent包介绍及使用(包含atomic包/lock包/并发容器/执行器)
    final关键字总结
    Java内存模型-final域的内存语义--没明白,预留以后继续理解
    synchronized底层实现原理&CAS操作&偏向锁、轻量级锁,重量级锁、自旋锁、自适应自旋锁、锁消除、锁粗化
  • 原文地址:https://www.cnblogs.com/feng9exe/p/12365891.html
Copyright © 2020-2023  润新知