Android 个绑定程序的内存开销

Memory Overhead of Android Binders

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

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

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

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

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