虽然我对Binders用于跨进程通信的过程有点熟悉,但我想知道他们是否必须与内核上的Binder驱动程序进行交互这一事实会显着增加创建对象的内存开销。
此外,即使交易数量没有增加,创建大量的粘合剂是否会限制现有粘合剂的交易速度?
答案 0 :(得分:2)
您必须深入研究libbinder代码以及内核驱动程序代码才能真正分析内存消耗。但是,开销可能不是很大,因为内部绑定程序驱动程序的驱动程序对象然后链接到调用进程拥有的实际绑定程序。它还限制了调用进程处理同时事务时可以使用的线程数。
就性能而言,主要的限制因素是通过给定的活页夹的交易数据的大小。每个绑定器都有一个固定大小的缓冲区(1MB)来处理该绑定器的所有事务。因此,如果特定绑定器同时发生多个事务,则所有这些事务所使用的总数据都会计入此限制。由于发生的异常(Java级别)不表示它是事务的发送部分还是接收部分,因此排除故障或正常处理可能非常棘手。经验法则是跨越活页夹的数据需要很小,比如消息传递。它不适合流数据之类的东西。 Android使用 ashmem 驱动程序支持来更好地处理此问题,以及跨绑定器共享文件描述符的功能。
绑定器本身在btree中被跟踪,因此查找应该非常快。对于给定的过程以及系统中的绑定器总数达到较高水平有一些统计数据会很有趣,但我不知道任何此类数据。