乐趣区

Android(IPC)进程间通讯1:详解Binder由来?

Android 开发的进程间通讯,整个 Android 的应用都依赖于 binder 做底层通信机制。而 Linux 中提供的进程间通讯方式并没有 binder 机制,那么 android 中为什么要单独创造这种通讯方式呢?带着这个问题,继续往下读。

Linux 中进程相关概念


Linux 将系统内存划分成了 用户空间 内核空间 两部分:

用户空间 : 普通应用程序则运行在用户空间上,它们不能使用某些特定的系统功能,不能直接访问硬件,不能直接访问内核空间。
内核空间 : 系统的核心软件会运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限。

用户程序只能运行在用户空间,用户空间访问内核空间的唯一方式就是系统调用。

linux 的用户程序和进程

在 linux 中,所有的用户程序执行时状态都是进程。进程间存在父子关系来表示同一个用户程序开启的多个同步任务。

所有的进程构成一个以 init 为根的树状结构,这是因为 Linux 内核 并不提供直接建立新进程的系统调用。剩下的所有进程都是 init 进程通过 fork 机制建立的。新的进程要通过老的进程复制自身得到,这就是 fork。fork 是一个系统调用。

a 与 b 之间不能直接通讯

因为进程隔离的原因,进程 A 和进程 B 之间不能直接进行通讯。

但是开发中,总难免要遇到进程通讯的地方(例如一个应用不通进程之间相互传递数据等场景)。

进程间通信方式(IPC)

虽然不同进程在用户空间不能直接进行通讯,但它们却是共享一份内核空间。很显然,当一个用户进程想与另外一个用户进程进行通信时,就可以通过内核空间来完成了

Linux 中常见的进程间通讯的几种方式:

Linux 中常见的进程间通讯的几种方式

上面的 6 种都是内核里的程序:

进程 A 发起请求给内核里的程序,内核里的程序再将请求转发给进程 B,从而达到进程间通信。

a 与 b 交互过程

Android 中的 Binder 诞生

Android 系统通过 Linux 的动态可加载内核模块,添加一个内核模块运行在内核空间,用户进程之间的通过这个模块作为桥梁,就可以完成通信。就是我们后面要涉及到的:Binder 驱动。

google 通过新增内核模块完成了进程间通信协议的实现,然后使用 binder 驱动来调用这个新增的内核模块,来为上层应用提供接口,最后在 framework 层封装这个接口来提供 java API 调用接口。

Android 系统为什么需要再实现一个进程间通信协议 Binder 呢?

退出移动版