Android Binder 的内存开销

Posted

技术标签:

【中文标题】Android Binder 的内存开销【英文标题】:Memory Overhead of Android Binders 【发布时间】:2016-09-19 20:52:40 【问题描述】:

虽然我对 Binder 用于跨进程通信的进程有点熟悉,但我想知道它们必须与内核上的 Binder 驱动程序交互这一事实是否显着增加了创建对象的内存开销。

此外,即使事务数量没有增加,创建大量 Binder 是否会限制现有 Binder 的事务速度?

【问题讨论】:

【参考方案1】:

您必须深入研究 libbinder 代码以及内核驱动程序代码才能真正分析内存消耗。但是,开销可能不是很大,因为在内部,活页夹驱动程序具有其驱动程序对象,然后链接到调用进程所拥有的实际活页夹。它还限制了调用进程可以用来处理并发事务的线程数。

就性能而言,主要限制因素将是通过给定绑定器的事务数据的大小。每个活页夹都有一个固定大小的缓冲区 (1MB) 来处理该活页夹的所有事务。因此,如果针对特定绑定器同时进行多个事务,则所有事务使用的总数据将计入此限制。由于发生的异常(Java 级别)不指示它是事务的 send 部分还是 receive 部分,因此很难排除故障或优雅地处理这可能非常棘手。经验法则是跨绑定器移动的数据需要很小,例如消息传递。它不太适合流数据之类的东西。 android 使用 ashmem 驱动程序支持来更好地处理这个问题,以及在活页夹之间共享文件描述符的能力。

活页夹本身在 btree 中进行跟踪,因此查找速度应该非常快。如果对给定进程以及系统中的活页夹总数达到高水平,有一些关于此的统计数据会很有趣,但我不知道有任何此类数据。

【讨论】:

以上是关于Android Binder 的内存开销的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出Binder进程间通信机制

Android Binder机制,共享内存实现原理

Android之Binder通信篇

Android native进程间通信实例-binder结合共享内存

Android-binder通信详解

Android 进阶——Framework 核心之Binder 相关预备理论