android IBinder通信驱动(摘自《android深入浅出多媒体编程》)

在多进程环境下, 应用程序和后台服务间通常会运行在不同的进程中, 有着 独立的地址空间, 但是因为需要相互协作的原因, 彼 此间又必须进行通信和数据共享, 而传统的进程间通信(IPCInternet Process Connection )却有着进程过载和安全漏洞等方面的风险,Binder 的好处则在于在驱动层面即对进程间通 信提供了支持、采用的共享内存机制提供了进程间通信的性能、采用了前置进程的线程池来处理进程请求、针对系统中的对象引入了引用计数机制和跨进程的对象引 用映射机制、在进程间的同步调用。

                                      

为了进程进程间通信, Binder 采用了 AIDL Android Interface Definition Lanaguage )来描述进程间的接口。

在实际的实现中, Binder 是作为一个特殊的字符型设备来存在的,其实现遵循 Linux 设备驱动模型,相关的主要代码位于 aurora/msm/msm/drivers/staging/android/ binder.c 文件中。

Binder 驱动中, binder_thread_write () 函数通过 binder_transaction() 函数来发送请求或返回结果,而 binder_thread_read 用于读取结果, 主要通过 binder_ioctl () 与用户空间的进程交换数据

Binder 的私有数据结构 binder_proc 则被用来记录 当前进程、进程 ID 、内存映射信息、 Binder 的统计信息和线程信息等。

如果收到请求, binder_transaction() 函数会 通过对象的 handle 找到对象所在的进程,如果 handle 为空就认为对象是 context_mgr ,把请求发给 context_mgr 所在的进程。 然后请求中所有的 Binder 对象全部放到一个 RB 树中。最后把请求放到目标进程的队列中,等待目标进程读取。数据的解析工作放在 binder_parse() 中实现。

 

 

一种IPC通信方式。

原文地址:http://miaozl.spaces.live.com/blog/cns!F408F266382E09FE!933.entry

你可能感兴趣的:(thread,数据结构,android,linux,internet,interface)