一、 Android的Binder机制实现IPC
这里bind机制实现实现IPC模型这里不具体分析,简单理解就是clint-server模型
涉及到4个模块client、server、serverManager、bind底层驱动。
serverManager的作用是将字符形式的Binder(Server创建了Binder实体)名字转化成Client中对该Binder的引用,然后client通过serverManager请求获取server端bind的代理对象,然后进行相关需要操作。
二、 bind机制的优点
1)安全性:
Android会把每个应用进程设置单独的uid,进行标识,故进程的UID是鉴别进程身份的重要标志,安全性高
2)传输效率:
bind机制采用了内存映射,数据拷贝次数只需要一次,效率得到提高
IPC |
数据拷贝次数 |
共享内存 |
0 |
Binder |
1 |
Socket/管道/消息队列 |
传统linux的IPC,Socket和管道和消息队列用了2个数据拷贝,用户空间 –> 内核缓存区 –> 用户空间,需要2次数据拷贝
发送方进程通过copy_from_user()函数将数据拷贝 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信
如果这里不太理解 内存映射的话 可以学习这几篇博客如下:
还可以学习下 linux核心编程 书籍,下载地址:https://download.csdn.net/download/bin432/10907802
3) 稳定性:
Binder是基于C/S架构的,这个架构通常采用两层结构,稳定性是没有问题的。共享内存没有分层,难以控制,并发同步访问临界资源时,可能还会产生死锁。从稳定性的角度讲,Binder是优于共享内存的
4)面相对象优势:
Linux是基于C语言,C语言是面向过程的,Android应用层和Java Framework是基于Java语言,Java语言是面向对象的。Binder本身符合面向对象的思想。
三、 Android很多地方用到了bind机制
- 系统中的各个进程是如何通信的?
- Android系统启动过程
- AMS、PMS的原理
- 四大组件的原理,比如Activity是如何启动的?
- 插件化原理
- 系统服务的Client端和Server端是如何通信的?(比如MediaPlayer和MeidaPlayerService)
不是所有Android进程间通信都是用bind机制,Zygote进程与AMS通信使用的是Socket,Kill Process采用的是信号
四、Android和linux常见的IPC机制具体有哪些
1)Android IPC:
Android系统除了支持套接字,还支持序列化、Messenger、AIDL、Bundle、文件共享、ContentProvider、Binder、广播。
ContentProvider为存储和获取数据了提供统一的接口,ContentProvider底层实现也是Binder
2)linux IPC:
管道(pipe)、信号(sinal)、信号量(semophore)、消息队列(Message)、共享内存(Share Memory)、套接字(Socket)