IPC机制:进程间通信(Inter Process communication),指两个进程之间进行数据交换
进程知识点
进程空间的分配
- 一个进程空间可以分为用户空间和内核空间(Kernel),即把进程内 用户 和 内核隔离开来
- 二者的区别:
- 用户空间的数据在进程之间是不可共享的,所以 用户空间 = 不可共享空间
- 内核空间的数据在进程之间是共享 的,所以用户空间 = 可共享空间
- 在进程之间,用户和内核的交换 被称为系统调用
进程的隔离
为了保证 安全性 和 独立性,一个进程不能直接操作或访问另一个进程,即Android 的进程是相互独立的,隔离的
跨进程通信(IPC)
- 进程隔离后,由于某些需求,进程间 需要合作/ 交互
- 跨进程通信的原理:
- 先通过 进程间 的内核空间进行数据交互
- 在通过 进程间 的用户空间 与 内核空间进行数据交互,从而实现进程间的用户空间的数据交互
而Binder 就是充当 链接两个进程(内核空间)的通道。
Binder跨进程通信机制模型
原理
注意
1、Client 进程, Service进程 和 ServiceManager进程之间的交互都必须通过Binder驱动(使用open和ioctl文件操作函数),而非直接交互
原因:
1,Client进程,Service进程 & Service Manager进程属于进程空间的用户空间,不可进行进程间交互
2,Binder驱动 属于 进程空间的内核空间,可进行进程间 和 进程内交互
原理图如下,虚线表示并非直接交互:
2、Binder驱动 & Service Manager进程属于Android基础架构(系统已经实现好的);而Client进程和 Service进程 属于Android应用层(需要开发者自己实现)
所以在跨进程通信时,开发者只需要定义Client 和 Service进程 并显式使用上述三个步骤,最终借助Android基础架构功能就可以完成进程间通信
3、Binder请求的线程管理
- Service进程会创建很多线程来处理Binder请求
- 管理Binder模型的线程是采用Binder驱动的线程池,并由Binder驱动自身进行管理(而不是由Service线程来管理)
- 一个进程的Binder线程默认最大是16,超过的请求会被阻塞等待空间的Binder线程
所以在进程通信时处理并发问题时,例如使用ComtentProvider时,它的CRUD(创建,检索,更新,删除)方法只能同时有16个线程同时工作