linux传统IPC和Binder的介绍
16lz
2021-01-24
本文总结:https://www.cnblogs.com/baronzhang/p/8784458.html
Binder在android中的的使用
- 在android中涉及到跨进程的应用基本都会使用到binder机制
Binder与linux传统IPC的性能对比
- linux IPC进程:管道,内存拷贝,消息队列,套接字等
- 性能对比
IPC进程 | 实现方式 | 内存拷贝次数| |
---|---|---|
管道 | 数据(缓存区)->内核缓冲区-缓存区 | 至少2次 |
消息队列 | 同上 | 同上 |
共享内存 | 读取在一块内存中,控制困难 | 1 |
套接字 | 通过网络传送,收到网络的影响 | 至少2次 |
Binder | c/s架构 职责明确 | 1 |
linux IPC通信原理
-
什么是IPC通信
- 进程与进程之间的内存是不共享的,如果两个进程之间需要进行数据的交互,那就要用到特殊的通信机制:就是IPC
-
如何操作
- 在linux系统中,进程空间分为“用户空间”和”内核空间“,这两个空间的隔离开来的。那么“用户空间‘想要访问"内核空间”就要通过“系统调度”
- 系统调度通过一下两个函数实现:copy_from_user: 将数据从用户空间拷到内核空间,copy_to_user: 将数据从内核空间拷到用户空间
- 通信过程如下:通常的做法是消息发送方将要发送的数据存放在内存缓存区中,通过系统调用进入内核态。 然后内核程序在内核空间分配内存,开辟一块内核缓存区,调用 copy_from_user()函数将数据从用户空间的内存缓存区拷贝到内核空间的内核缓存区中。 同样的,接收方进程在接收数据时在自己的用户空间开辟一块内存缓存区, 然后内核程序调用 copy_to_user() 函数将数据从内核缓存区拷贝到接收进程的内存缓存区。 这样数据发送方进程和数据接收方进程就完成了一次数据传输,我们称完成了一次进程间通信
-
存在的不足
- 性能低下,一次数据传递需要经历:内存缓存区 --> 内核缓存区 --> 内存缓存区,需要 2 次数据拷贝;
- 接收数据的缓存区由数据接收进程提供,但是接收进程并不知道需要多大的空间来存放将要传递过来的数据,因此只能开辟尽可能大的内存空间或者先调用 API 接收消息头来获取消息体的大小。
- 这两种做法不是浪费空间就是浪费时间。
Binder机制的介绍
-
Binder驱动
在android系统中也有个内核模块在负责android各个用户进程的通信,这个内核模块就叫做Binder驱动,通过Linux的内核动态加载机制,加载到内核中。
-
android通过Binder驱动也是内核模块那跟传统的ipc有啥区别
传统的IPC通信是:数据从用户空间A拷贝到内核空间,接着又从内核空间拷贝到用户空间B,如果内核空间和用户空间B,地址是一样,及用户空间B就是内核空间,那拷贝到内核空间就是拷贝用户空间B。在linux中存在这种机制,内存映射 -
内存映射:
内存映射简单的讲就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间 -
Binder的IPC机制原理
1.首先 Binder 驱动在内核空间创建一个数据接收缓存区
2.接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系
3.发送方进程通过系统调用 copy_from_user() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信 -
Binder的通信过程
- 首先,一个进程使用 BINDER_SET_CONTEXT_MGR 命令通过 Binder 驱动将自己注册成为 ServiceManager;
- Server 通过驱动向 ServiceManager 中注册 Binder(Server 中的 Binder 实体),表明可以对外提供服务。驱动为这个 Binder 创建位于内核中的实体节点以及 ServiceManager 对实体的引用,将名字以及新建的引用打包传给 ServiceManager,ServiceManger 将其填入查找表。
- Client 通过名字,在 Binder 驱动的帮助下从 ServiceManager 中获取到对 Binder 实体的引用,通过这个引用就能实现和 Server 进程的通信。
-
实例-AIDL
- 参考: https://blog.csdn.net/yy1090582686/article/details/84564786
更多相关文章
- 精通 Android(安卓)中的 tools 命名空间
- android 机器耗电
- Android(安卓)GridLayout 动态添加子控件 + 平均分配空间
- Android之值得开发者(安卓)必备的十八大开发资源
- Ophone和Android的关系如何?
- ubuntu下编译android源码、linux内核、android的源码结构以及编
- Android高手进阶教程(二十四)之---Android(安卓)WebView的缓存!!
- Android(安卓)内存缓存框架 LruCache 的源码分析
- Android(安卓)通过读取本地Arp表获取当前局域网内其他设备信息