安卓IPC机制学习
参考:
https://my.oschina.net/keeponmoving/blog/64218
http://blog.csdn.net/luoshengyang/article/details/6618363
http://blog.cgsdream.org/2015/11/09/binder-analysis/
IPC机制:
是什么:
IPC是Inter-Process-Communication的缩写,意思是进程间通信或者跨进程通信;
在linux中通信方式:
1.socket; 2.name pipe命名管道;3.message queue消息队列; 4.singal信号量; 5.share memory共享内存;
在Java系统通信方式:
1.socket; 2.name pipe;
在Android系统通信方式:
1.AIDL,2.Messenger,3.Socket,4.ContentProvider。这些通信方式其底层都是基于的Binder通信。
为什么:
进程都有自己独立的资源和内存空间,其它进程不能任意访问当前进程的内存和资源,系统给每个进程分配的内存会有限制。为了能让每个进程能够通信,我们建立了ipc机制。去解决这个问题。
普通IPC基本原理:
发送方将数据存放在缓存区中,调用API通过系统调用进入内核中。内核服务程序在内核空间分配内存,将数据从发送方缓存区复制到内核缓存区中。
接收方读数据时也要提供一块缓存区,内核将数据从内核缓存区拷贝到接收方提供的缓存区中并唤醒接收线程,完成一次数据发送。
两次拷贝:用户空间->内核空间->用户空间
各种通信方式的特点
socket作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。
消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。
共享内存虽然无需拷贝,但控制复杂,难以使用。
Binder基于Client-Server通信模式,传输过程只需一次拷贝,为发送添加UID/PID身份,既支持实名Binder也支持匿名Binder,安全性高。
IPC | 数据拷贝次数 |
共享内存 | 0 |
Binder | 1 |
Socket/管道/消息队列 | 2 |
Binder机制大概学习
初识binder:
Binder的实体是位于Server中的对象,遍布于client中的入口可以看成指向这个binder对象的‘指针’,获取指针便可以操作binder,因此其引用却遍布于系统的各个进程之中,所以Binder对象可以看成是一个可以跨进程引用的对象,星罗棋布的引用仿佛粘接各个应用程序的胶水。
Binder通信模型
Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SMgr)以及Binder驱动。其中Server,Client,SMgr运行于用户空间,驱动运行于内核空间。这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,SMgr是域名服务器(DNS),驱动是路由器。
Binder驱动:负责进程之间Binder通信的建立。
ServiceManager:在Server创建了Binder之后,为每个Binder在其内注册。
Server:server创建Binder实体,然后在serverManager中注册Binder。
Client:向ServiceManager请求对应的binder的引用。
Binder数据接收
由Binder驱动负责管理数据接收缓存,它的内存映射实在用户空间的地址,这样数据拷贝直接可以从一个用户到另外一个用户,并只需要一次通信。