从匿名binder来理解Binder驱动中的红黑树

发布时间:2023年12月23日

之前都没有重点关注过Binder驱动,这里从匿名binder的proxy端恢复的角度来理解一下binder驱动中的红黑树,

如下图所示,假设B进程是个含有binder服务的service,A进程通过binderService连接了B,又通过接口调用,向B传入了一个binder回调对象aBinder,也就是匿名Binder,B进程中收到的时候,这个对象通过binder驱动,以及上层的处理,生成了一个Proxy对象,A中如果继续传送同一个aBinder对象,B中会继续还原为刚才的Proxy对象,也就是说,这里是一一对应的,为什么这里能够实现这样的对应?是因为驱动中对binder数据进行了存储记录,并创建了红黑树来便于查找。

有了这样的处理,所以regiser(aBinder) 和unregister(aBinder) 可以匹配处理。

这里来看看相关资料

在Android的Binder驱动中,红黑树是一种自平衡的二叉查找树,用于高效地管理进程间通信(IPC)中的数据。红黑树的特点是每个节点都有一个颜色属性,可以是红色或黑色,且满足一些特定的性质,使得树在插入、删除节点等操作时能够保持平衡,从而在平均情况下具有较好的性能。

在Binder驱动中,红黑树主要用于存储和管理进程间的通信实体。具体来说,Binder驱动中使用了多个红黑树结构,包括nodes树、refs_by_desc树和refs_by_node树等。这些红黑树用于记录Binder实体和代理的信息,以便在进程间通信时能够快速查找和定位所需的实体。

其中,nodes树用于记录Binder实体,而refs_by_desc树和refs_by_node树则用于记录Binder代理。在一个进程中,有多少“被其他进程进行跨进程调用的”Binder实体,就会在该进程对应的nodes树中生成多少个红黑树节点。这些节点存储了Binder实体的相关信息,使得进程间通信时能够快速找到所需的实体。

在Binder驱动中,红黑树的查找和插入操作也是通过相应的函数来实现的。例如,线程对象根据进程ID(pid)保存在红黑树中,当需要查找或创建线程对象时,会根据pid值在红黑树中进行查找或插入操作。

文章来源:https://blog.csdn.net/aaajj/article/details/135174005
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。