zoukankan      html  css  js  c++  java
  • android binder 进程间通信机制3-Binder 对象生死

    以下概述Binder通信过程中涉及到的四个对象:Binder本地对象、Binder实体对象、Binder引用对象、Binder代理对象的生死。

    1、Binder通信的交互过程

      1.Client 进程发出进程间通信请求,具体由Client进程中的代理对象通过Binder驱动程序向Server进程中的Binder本地对象发起请求。

      2.Binder驱动程序根据Client进程传递过来的Binder代理对象的句柄值找到Binder驱动程序内的Binder引用对象。

      3.根据Binder引用对象找到Binder实体对象。同时为本次请求创建一个binder_transaction结构(事务)来描述本次进程间通信过程。

      4.Binder驱动程序根据找到的Binder实体对象找到运行在Server进程中的Binder本地对象,并将Client进程发来的数据发给他。

      5.Server进程处理完成后,将处理结果返回给Binder驱动程序,驱动程序将结果写入前面创建的binder_transaction中

      6.Binder驱动程序通过保存在binder_transaction中的Client信息,找到Client进程,将通信结果返回给对应的Binder代理对象处理。

    2、由以上过程可知:binder代理对象依赖于binder引用对象,binder引用对象依赖于binder实体对象,binder实体对象依赖于binder本地对象。一下介绍这些被依赖的对象是如何保证粗活的:

    binder 引用对象和binder实体对象在内核空间Binder驱动程序内部维护。实际上分别是binder_ref和binder_node结构体。

    binder 代理对象在用户空间Client进程内维护。是一个BpBinder对象。

    binder 本地对象在用户空间Server进程内维护。是一个BBinder对象。

      1.Binder本地对象的生命周期。

        在被驱动程序实体对象引用时,应该保证本地对象的引用计数不为0。在Server进程将一个Binder本地对象注册到ServerManager时,Binder驱动程序会为他创建对应的实体对象(binder_node)。当有Cient进程查询Binder本地对象的代理对象接口时,binder_node 中的有关引用计数的值会发生改变。Binder驱动通过函数:

      binder_thread_read

      使用协议BR_INCREFS,BR_ACQUIRE,BR_DECREFS,BR_RELEASE与Server进程通信。通信数据会写入Server进程的一个用户空间缓冲区中。

      Server进程的IPCThreadState的成员函数executeCommand从取出协议命令并执行,增减本地对象的强弱引用计数实现生命周期管理。

      另:BBinder继承自RefBase,在用户空间的引用可自动管理。

      2.Binder实体对象的生命周期。

      当Binder引用对象创建或销毁时,由于引用对象会引用实体对象,需要对应的增减Binder实体对象的引用计数。因为同在内核空间,调用binder_inc_node和binder_dec_node操作实体对象的引用,具体规则参考源码binder.c的这两个函数实现。

      3.Binder引用对象的生命周期。

      类似本地对象的生命周期,在Binder驱动程序内使用函数binder_thread_write,读取由Client写入用户空间缓冲区的BC_ACQUIRE,BC_INCREFS,BC_RELEASE,BC_DECREFS四个协议增减Binder引用对象的强弱引用计数。

      这个过程是通过Client进程传进来的句柄值找到对应的引用对象的。

      4.Binder代理对象的生命周期。

    3.Binder对象死亡通知机制:

      过程一:

      1.定义死亡接收通知,DeathRecipient

      2.调用代理对象BpBinder的linkToDeath注册。注册的最后会调用IPCThreadState::flushCommands()将注册死亡通知协议尽快通知给Binder驱动程序

      3.Binder驱动程序在binder_thread_write中处理注册请求。

      过程二:

      1.发送死亡通知:本地对象死亡会出发关闭/dev/binder设备,binder_release会被调用,binder驱动程序会在其中检查Binder本地对象是否死亡,该过程会调用binder_deferred_release 执行。如死亡会在binder_thread_read中检测到BINDER_WORK_DEAD_BINDER的工作项。就会发出死亡通知。

      2.接收死亡通知:Client进程会在IPCThreadState::executeCommand函数中处理到BR_DEAD_BINDER协议了。

      过程三:

      1.注销接收死亡通知:代理对象调用BpBinder::unlinkToDeath。

      

  • 相关阅读:
    python2 与python3 区别的总结 持续更新中......
    基础数据类型初识(三)字典
    基础数据类型初识(二)列表,元组
    基本数据类型初识(一)数字,字符串
    python基础知识(理论)
    进程池 和 管道 , 进程之间的 信息共享
    并发编程
    进程 和 多进程
    计算机系统的发展史
    网络编程 黏包
  • 原文地址:https://www.cnblogs.com/zj2012zy/p/4043870.html
Copyright © 2011-2022 走看看