1 binder 是什么?
进程间通信机制(一个进程可以理解为一个 app)
是一个驱动
Binder.java(implement Ibinder) --> 写一个类 extends Binder.jiva 就有了跨进程的能力。
跨进程的应用:
自己创建的进程:webView、视频播放、音乐、大图浏览和推送
系统服务:打电话,闹钟等等
2 Android 为什么要增加Binder?为什么面试要问 Binder?Binder 有什么优势?
Linux 进程间通信机制有:管道、信号量、socket、共享内存等。而 android 增加 binder 肯定是比 linux 进程间通信机制更好。
Binder 的性能仅次于“共享内存”优于其它 IPC(进程间通信机制) ,有很多有点。
Binder 与其它 IPC 对比
Binder 如何实现一次拷贝?
内存划分:
内存被操作系统划分称两块:用户空间和内核空间。用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使用户程序崩溃了,内核也不受影响。
传统 IPC 传输数据时的两次拷贝:
第一次copy, 通过系统调用 copy_from_user() 将数据从用户空间 copy 到内核缓存区; 第二次 copy通过调用 copy_to_user() 将数据从内核空间 copy 到用户空间。用户空间和内核空间都是虚拟内存,我们只能操作虚拟内存。
Binder 传输数据时的一次拷贝:
数据发送方通过 copy_from_user() 将数据发送到内核地址空间(一次拷贝),内核地址空间与接收方映射了同一块物理内存(binder map空间),接收方通过 mmap(内存映射) 技术就能直接在共同的物理空间中接收数据。内核地址空间与接收方通过mmap 技术实现内存共享的。
mmap(memory mapping) 原理:
Linux 通过将一个虚拟内存区域与一个磁盘上的物理区域的对象关联起来,以初始化这个虚拟内城区区域的内容,这个过程称为内存映射(Memory Mapping)
mmap 能够让虚拟内存与指定的物理内存直接联系起来。
共享内存:
发送方、接收方、内核都通过mmap 共享同一块内存。所以 Binder 相当于是"半共享内存"。
进程间是怎么实现通信的?
假设:进程A,进程B(有一个 test 方法),进程A 想要调用进程B的 test 方法,在进程A 中 new B.test() 显然是不行的。因为进程间的内存是隔离的。
Binder 驱动设备
binder_init:
1 分配内存;2 初始化设备;3 放入链表 binder_devices
binder_open:
1 创建 binder_proc 对象;2 保存当前进程信息到 proc
3 file-->private_data = proc; 4 添加到 binder_procs 链表中
binder_mmap:
struct vm_struc *area ---> 内核的虚拟内存;vma ---> 进程的虚拟内存
1 通过用户空间的虚拟内存大小,分配一块内核的虚拟内存;
2 分配了一块物理内存 ---4KB;
3 把这块物理内存分别映射到用户的虚拟内存和内核的虚拟内存;
binder_ioctl:
读写操作
binder 的 jni 注册:
目的: java 和 jni 能够相互调用