binder 总结

1.Binder

Binder 是一种进程间通信机制

Android 系统对应用层提供的各种服务如:ActivityManagerService、PackageManagerService 等都是基于 Binder IPC 机制来实现的。Binder 机制在 Android 中的位置非常重要.

Android常用进程间通信方式:
intent contentProvider 文件共享(序列化)、AIDL、Messager、 Socket

Android 系统是基于 Linux 内核的,Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制。那为什么 Android 还要提供 Binder 来实现 IPC 呢?主要是基于性能、稳定性和安全性

1.性能

1.Socket 套接字 其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。
2.消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。
3.共享内存虽然无需拷贝,但控制复杂,难以使用。
4.Binder 只需要一次数据拷贝

2.稳定性

Binder 基于 C/S 架构,客户端(Client)通知给服务端(Server)去完成,架构清晰、职责明确又相互独立。

3.安全

Android 为每个安装好的 APP 分配了自己的 UID,故而进程的 UID 是鉴别进程身份的重要标志。同时 Binder 既支持实名 Binder,又支持匿名 Binder,安全性高。

2.Linux 进程间通信

进程隔离
进程空间划分:用户空间(User Space)/内核空间(Kernel Space)
系统调用:用户态/内核态

在这里插入图片描述

3.Binder 跨进程原理

跨进程通信是需要内核空间做支持的。

在 Android 系统中,这个运行在内核空间,负责各个用户进程通过 Binder 实现通信的内核模块就叫 Binder 驱动(Binder Dirver),用来在内核空间创建数据接收的缓存空间。

1.内存映射

Binder IPC 机制中涉及到的内存映射通过 mmap() 来实现,mmap() 是操作系统中一种内存映射的方法。内存映射就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间。

内存映射能减少数据拷贝次数,实现用户空间和内核空间的高效互动。两个空间各自的修改能直接反映在映射的内存区域,从而被对方空间及时感知。也正因为如此,内存映射能够提供对进程间通信的支持。

2.Binder IPC 实现原理

在这里插入图片描述
1.首先 Binder 驱动在内核空间创建一个数据接收缓存区
2.然后在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区接收进程用户空间地址的映射关系;
3.发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间。

Guess you like

Origin blog.csdn.net/chentaishan/article/details/118758270