02.Android之IPC机制问题
时间 2021-05-30
标签
php
linux
android
git
github
面试
segmentfault
缓存
安全
服务器
目录介绍
- 2.0.0.1 什么是Binder?为何要使用Binder?Binder中是如何进行线程管理的?总结binder讲的是什么?
- 2.0.0.2 Android中进程和线程的关系?什么是IPC?为什么须要进行IPC?多进程通讯可能会出现什么问题?
- 2.0.0.3 Binder的工做流程是怎样的?Binder主要能提供哪些功能?Binder通讯机制原理是怎样的?
- 2.0.0.4 Android中为什么新增Binder来做为主要的IPC方式?Binder运行机制是怎样的?Binder机制有什么优点?
- 2.0.0.5 Android中跨进程通信的几种方式?实际开发中,有哪些场景使用Binder进行数据传输?
- 2.0.0.6 Android中有哪些基于Binder的IPC方式?简单对比下?
- 2.0.0.7 为什么说Binder相比传统的Socket性能更高效?为什么说Binder相比传统IPC安全性更高?
- 2.0.0.8 Service Manager是如何成为一个守护进程的?Server和Client是如何得到Service Manager接口的?
好消息
- 博客笔记大汇总【15年10月到至今】,包括Java基础及深刻知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,固然也在工做之余收集了大量的面试题,长期更新维护而且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计500篇[近100万字],将会陆续发表到网上,转载请注明出处,谢谢!
- 连接地址:https://github.com/yangchong2...
- 若是以为好,能够star一下,谢谢!固然也欢迎提出建议,万事起于忽微,量变引发质变!全部的笔记将会更新到GitHub上,同时保持更新,欢迎同行提出或者push不一样的见解或者笔记!
2.0.0.1 什么是Binder?为何要使用Binder?Binder中是如何进行线程管理的?总结binder讲的是什么?
2.0.0.2 Android中进程和线程的关系?什么是IPC?为什么须要进行IPC?多进程通讯可能会出现什么问题?
-
Android中进程和线程的关系?缓存
-
一个APP通常对应一个进程和有限个线程安全
- 通常对应一个进程,固然,能够在AndroidMenifest中给四大组件指定属性android:process开启多进程模式
- 有限个线程:线程是一种受限的系统资源,不可无限制的产生且线程的建立和销毁都有必定的开销。
- 什么是IPC?
-
为什么须要进行IPC?服务器
- 进程间通讯的必要性
- 全部运行在不一样进程的四大组件,只要它们之间须要经过内存在共享数据,都会共享失败。这是因为Android为每一个应用分配了独立的虚拟机,不一样的虚拟机在内存分配上有不一样的地址空间,这会致使在不一样的虚拟机中访问同一个类的对象会产生多份副本。技术博客大总结
-
多进程形成的影响可总结为如下四方面
- 静态变量和单例模式失效:由独立的虚拟机形成
- 线程同步机制失效:由独立的虚拟机形成
- SharedPreference的不可靠降低:不支持两个进程同时进行读写操做,即不支持并发读写,有必定概率致使数据丢失
- Application屡次建立:Android系统会为新的进程分配独立虚拟机,至关于系统又把这个应用从新启动了一次。
2.0.0.3 Binder的工做流程是怎样的?Binder主要能提供哪些功能?Binder通讯机制原理是怎样的?
-
Binder的工做流程是怎样的?
- 1客户端首先获取服务器端的代理对象。所谓的代理对象实际上就是在客户端创建一个服务端的“引用”,该代理对象具备服务端的功能,使其在客户端访问服务端的方法就像访问本地方法同样。
- 2客户端经过调用服务器代理对象的方式向服务器端发送请求。
- 3代理对象将用户请求经过Binder驱动发送到服务器进程。
- 4服务器进程处理用户请求,并经过Binder驱动返回处理结果给客户端的服务器代理对象。
- 5客户端收到服务端的返回结果。
-
binder工做流程图以下所示:
-
Binder主要能提供哪些功能?
- 用驱动程序来推动进程间的通讯。
- 经过共享内存来提升性能。
- 为进程请求分配每一个进程的线程池。
- 针对系统中的对象引入了引用计数和跨进程的对象引用映射。
- 进程间同步调用。
-
Binder通讯机制原理是怎样的?
- Server进程向ServiceManager注册,告诉ServiceManager我是谁,我有什么,我能作什么。就比如徐同窗(Server进程)有一台笔记本(computer对象),这台笔记本有个add方法。这时映射关系表就生成了。技术博客大总结
- Client进程向ServiceManager查询,我要调用Server进程的computer对象的add方法,能够看到这个过程通过Binder驱动,这时候Binder驱动就开始发挥他的做用了。当向ServiceManager查询完毕,是返回一个computer对象给Client进程吗?其实否则,Binder驱动将computer对象转换成了computerProxy对象,并转发给了Client进程,所以,Client进程拿到的并非真实的computer对象,而是一个代理对象,即computerProxy对象。很容易理解这个computerProxy对象也是有add方法,(若是连add方法都没有,岂不是欺骗了Client?),可是这个add方法只是对参数进行一些包装而已。
- 当Client进程调用add方法,这个消息发送给Binder驱动,这时驱动发现,原来是computerProxy,那么Client进程应该是须要调用computer对象的add方法的,这时驱动通知Server进程,调用你的computer对象的add方法,将结果给我。而后Server进程就将计算结果发送给驱动,驱动再转发给Client进程,这时Client进程还蒙在了鼓里,他觉得本身调用的是真实的computer对象的add方法,其实他只是调用了代理而已。不过Client最终仍是拿到了计算结果。
2.0.0.4 Android中为什么新增Binder来做为主要的IPC方式?Binder运行机制是怎样的?Binder机制有什么优点?
-
Binder运行机制是怎样的?
- Binder基于Client-Server通讯模式,除了Client端和Server端,还有两角色一块儿合做完成进程间通讯功能。
-
Binder通讯的四个角色:
- Client进程:使用服务的进程。
- Server进程:提供服务的进程。
- ServiceManager进程:ServiceManager的做用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client可以经过Binder名字得到对Server中Binder实体的引用。
- Binder驱动:驱动负责进程之间Binder通讯的创建,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。
- 接触这些概念可能会以为难于理解,读者能够把四个角色和熟悉的互联网进行类比:Server是服务器,Client是客户终端,ServiceManager是域名服务器(DNS),驱动是路由器。
-
Binder机制有什么优点
- 传输效率高、可操做性强:传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高。从Android进程架构角度分析:对于消息队列、Socket和管道来讲,数据先从发送方的缓存区拷贝到内核开辟的缓存区中,再从内核缓存区拷贝到接收方的缓存区,一共两次拷贝
- 技术博客大总结
- 对于Binder来讲,数据从发送方的缓存区拷贝到内核的缓存区,而接收方的缓存区与内核的缓存区是映射到同一块物理地址的,节省了一次数据拷贝的过程
- 因为共享内存操做复杂,综合来看,Binder的传输效率是最好的。
- 实现C/S架构方便:Linux的众IPC方式除了Socket之外都不是基于C/S架构,而Socket主要用于网络间的通讯且传输效率较低。Binder基于C/S架构 ,Server端与Client端相对独立,稳定性较好。
- 安全性高:传统Linux IPC的接收方没法得到对方进程可靠的UID/PID,从而没法鉴别对方身份;而Binder机制为每一个进程分配了UID/PID且在Binder通讯时会根据UID/PID进行有效性检测。
2.0.0.5 Android中跨进程通信的几种方式?实际开发中,有哪些场景使用Binder进行数据传输?
2.0.0.6 Android中有哪些基于Binder的IPC方式?简单对比下?
2.0.0.7 为什么说Binder相比传统的Socket性能更高效?为什么说Binder相比传统IPC安全性更高?
2.0.0.8 Service Manager是如何成为一个守护进程的?Server和Client是如何得到Service Manager接口的?
-
Service Manager是如何成为一个守护进程的?
- Service Manager,它是整个Binder机制的守护进程,用来管理开发者建立的各类Server,而且向Client提供查询Server远程接口的功能技术博客大总结
- 既然Service Manager组件是用来管理Server而且向Client提供查询Server远程接口的功能,那么,Service Manager就必然要和Server以及Client进行通讯了。咱们知道,Service Manger、Client和Server三者分别是运行在独立的进程当中,这样它们之间的通讯也属于进程间通讯了,并且也是采用Binder机制进行进程间通讯,所以,Service Manager在充当Binder机制的守护进程的角色的同时,也在充当Server的角色,然而,它是一种特殊的Server,下面咱们将会看到它的特殊之处
-
Service Manager在用户空间的源代码位于frameworks/base/cmds/servicemanager目录下,主要是由binder.h、binder.c和service_manager.c三个文件组成。Service Manager的入口位于service_manager.c文件中的main函数:
int main(int argc, char **argv){
struct binder_state *bs;
void *svcmgr = BINDER_SERVICE_MANAGER;
bs = binder_open(128*1024);
if (binder_become_context_manager(bs)) {
LOGE("cannot become context manager (%s)\n", strerror(errno));
return -1;
}
svcmgr_handle = svcmgr;
binder_loop(bs, svcmgr_handler);
return 0;
}
- main函数主要有三个功能:一是打开Binder设备文件;二是告诉Binder驱动程序本身是Binder上下文管理者,即咱们前面所说的守护进程;三是进入一个无穷循环,充当Server的角色,等待Client的请求
-
Server和Client是如何得到Service Manager接口的?
- ServiceManager做为守护进程,Service Manager的职责固然就是为Server和Client服务了。那么,Server和Client如何得到Service Manager接口,进而享受它提供的服务呢?
- Service Manager在Binder机制中既充当守护进程的角色,同时它也充当着Server角色,然而它又与通常的Server不同。对于普通的Server来讲,Client若是想要得到Server的远程接口,那么必须经过Service Manager远程接口提供的getService接口来得到,这自己就是一个使用Binder机制来进行进程间通讯的过程。而对于Service Manager这个Server来讲,Client若是想要得到Service Manager远程接口,却没必要经过进程间通讯机制来得到,由于Service Manager远程接口是一个特殊的Binder引用,它的引用句柄必定是0。
- 通过一系列的调用...
- 回到defaultServiceManager函数中,最终结果为:gDefaultServiceManager = new BpServiceManager(new BpBinder(0));
- 这样,Service Manager远程接口就建立完成了,它本质上是一个BpServiceManager,包含了一个句柄值为0的Binder引用。技术博客大总结
-
在Android系统的Binder机制中,Server和Client拿到这个Service Manager远程接口以后怎么用呢?
- 对Server来讲,就是调用IServiceManager::addService这个接口来和Binder驱动程序交互了,即调用BpServiceManager::addService 。而BpServiceManager::addService又会调用经过其基类BpRefBase的成员函数remote得到原先建立的BpBinder实例,接着调用BpBinder::transact成员函数。在BpBinder::transact函数中,又会调用IPCThreadState::transact成员函数,这里就是最终与Binder驱动程序交互的地方了。回忆一下前面的类图,IPCThreadState有一个PorcessState类型的成中变量mProcess,而mProcess有一个成员变量mDriverFD,它是设备文件/dev/binder的打开文件描述符,所以,IPCThreadState就至关于间接在拥有了设备文件/dev/binder的打开文件描述符,因而,即可以与Binder驱动程序交互了。
- 对Client来讲,就是调用IServiceManager::getService这个接口来和Binder驱动程序交互了。具体过程上述Server使用Service Manager的方法是差很少的。
关于其余内容介绍
01.关于博客汇总连接
02.关于个人博客