为什么 Android 要采用 Binder 作为 IPC 机制?
Hi 大家好,我是 DHL,大厂程序员,公众号:ByteCode ,在美团、快手、小米工作过。搞过逆向,做过性能优化,研究过系统,擅长鸿蒙、Android、Kotlin、性能优化、职场分享。
微信小程序「猿面试」每日分享一道大厂面试题,涉及 Java
、Android
、鸿蒙和ArkTS
、设计模式
、算法和数据结构
等内容。
本篇文章主要以面试为主,因此只要记住这些即可。Android 采用 Binder 作为 IPC (进程间通信) 机制的原因主要包括以下几点,
高效性:
Binder 机制通过减少数据拷贝次数来提高 IPC 的效率。在 Binder 机制中,发送方只需要将数据从用户空间拷贝到内核空间一次,接收方可以直接访问内核空间中的数据,避免了额外的数据拷贝。
与其他 IPC 机制相比,Binder 更高效。Binder 数据拷贝只需要一次,而管道、消息队列、Socket 都需要 2 次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder 性能仅次于共享内存。
对象级别的通信:
与基于消息的通信方式不同,Binder 机制提供了一种面向对象的 IPC 方法。Binder 允许在进程间传递对象引用,开发者可以像调用本地对象一样调用远程对象的方法,而无需关心对象实际所在的进程。这种面向对象的 IPC 方式让编程模型更自然,易于理解和使用。
支持异步通信
除了同步调用外,Binder 还支持异步通信,这对于构建响应式应用尤其重要。通过异步通信,应用可以在等待 Binder 事务完成时继续执行其他任务,提高了应用的响应性和性能。
安全性
Binder 通过使用 UID(用户 ID)和 PID(进程 ID)来验证请求的来源,提供了进程间通信的安全性保障。这意味着每个 Binder 事务都可以精确到发起者,系统可以据此实施安全策略,例如权限检查,从而防止未授权的数据访问或通信。
每个 Binder 通信都有明确的权限控制,可以限制哪些进程可以访问 Binder 服务,从而增强了系统的安全性。
稳定性
与其他 IPC 机制相比,Binder 是基于 C/S 架构的,是指客户端 (Client) 和服务端 (Server) 组成的架构,Client 端有什么需求,直接发送给 Server 端去完成,架构清晰明朗,Server 端与 Client 端相对独立。
而共享内存实现方式复杂,没有客户与服务端之别,需要充分考虑到访问临界资源的并发同步问题,否则可能会出现死锁等问题;
从这稳定性角度看,Binder 架构优越于共享内存
简便性
Binder 为开发者提供了一套易于使用的 API 来进行进程间通信,隐藏了复杂的内部实现。它使得不同应用之间或应用与系统服务之间的数据传递和方法调用变得简单直观。
总之,由于其高效、安全、简便、面向对象等特性,Binder 成为了 Android 系统中进行 IPC 通信的首选机制。这些特性使得 Binder 非常适合移动设备这种资源受限的环境。
来源:juejin.cn/post/7378321582399602707