1、Android为什么选择binder机制?
(1) 从性能的角度
数据拷贝次数:Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder性能仅次于共享内存。
(2) 从稳定性的角度
Binder是基于C/S架构的,简单解释下C/S架构,是指客户端(Client)和服务端(Server)组成的架构,Client端有什么需求,直接发送给Server端去完成,架构清晰明朗,Server端与Client端相对独立,稳定性较好;而共享内存实现方式复杂,没有客户与服务端之别, 需要充分考虑到访问临界资源的并发同步问题,否则可能会出现死锁等问题;从这稳定性角度看,Binder架构优越于共享内存。
仅仅从以上两点,各有优劣,还不足以支撑google去采用binder的IPC机制,那么更重要的原因是:
(3) 从安全的角度
传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而Android作为一个开放的开源体系,拥有非常多的开发平台,App来源甚广,因此手机的安全显得额外重要;对于普通用户,绝不希望从App商店下载偷窥隐射数据、后台造成手机耗电等等问题,传统Linux IPC无任何保护措施,完全由上层协议来确保。
2、Binder如何做到一次拷贝?
数据也会先从写进程的用户空间到系统的内核空间,完成一次拷贝,但是进入系统内核空间后,进程2的用户空间的数据接收区和内核空间的那部分区域,能够映射到同一块物理空间。这样就不用发生copy_to_user的系统调用了,从而不用第二次拷贝。用到了mmap,即内存映射。即内存上的空间可以映射到磁盘上的对应区域。
3、Binder如何跨进程
跨进程通信统一通过 Binder Driver 处理转发。
4、AIDL生成java类的细节
5、4大组件的底层通信机制
6、为什么Intent有大小限制?
因为在Intent 中的 Bundle 是使用 Binder 机制进行数据传送的, 数据会写到 Binder 缓冲区域;Binder 的缓冲区是有大小限制的, 有些 ROM 是 1M, 有些 ROM 是 2M。Binder 本身就是为了进程间频繁的通信所设计的, 并不是为了拷贝大量数据。
7、为什么不用共享内存?
更安全,简便
8、有共享内存的使用吗?
surfacefinger机制