IPC
<pre>Inter-Process Communication <p> — 进程间通信或者跨进程通信,即指两个进程之间进行数据交换的过程</pre>
线程
操作系统中的描述是,线程是CPU调度的最小单元,同时线程是一种有限的系统资源。
进程
进程是一个执行单元,可以是一个程序或应用。
进程和线程的关系
一个进程可以只有一个线程,即主线程(UI线程),当然也可以有多个线程;
但一个线程只存在一个进程中
IPC不是Android系统中独有的,任何一个系统中都有相应的IPC机制,如Windows中可以通过剪贴板、管道和油槽等来进行进程间通信;Linux中可以通过命名管道、共享内存、信号量等来进行进程间通信。
Android做为一个基于Linux内核的移动操作系统,但其进程间通信方式却和Linux有所不同,它有其自己的进程间通信机制,最常见的就是Binder,通过Binder可以轻松的实现进程间通信,出了Binder之外还有Socket,通过Socket可以实现任意两个终端之间的通信,固同一个设备的两个进程通过Socket也是可以通信的。
多进程
IPC的使用场景就是多进程,多进程的情况分为两种,
* 一个应用因为某些原因需要采用多进程模式来实现
* 当前应用需要向其它应用获取数据,固系统提供的ContentProvider去查询数据的时候,也是一种进程间通信
多进程模式
Android中使用多进程只有一种方法,那就是在AndroidMenifest中给四大组件指定android:process属性,可以很轻易地开启多进程模式
还有一种非常规的方法,就是通过JNI在native层去fork一个新的进程。
Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。
两个应用通过ShareUID跑在同一个进程中是有要求的,需要具有相同的ShareUID和相同的签名,只有这样才能互相访问对方的私有数据,如data目录、组件信息以及共享内存等,就像是一个应用的两部分。
运行机制
Android为每个应用都分配一个独立的虚拟机,也可以说是为每个进程分配一个独立的虚拟机,不同的虚拟机在内存中分配不同的内存地址空间,导致在不同的虚拟机中国年访问同一个类的对象会产生多份副本。
所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响。
多进程会造成的问题:
1. 静态成员和单例模式完全失效
2. 线程同步机制完全失效
3. SharePreferences的可靠性下降
4. Application会多次创建
当一个组件跑在一个新的进程中的时候,由于系统要在创建新的进程同时分配独立的虚拟机,所以这个过程其实就是启动一个应用的过程,相当于系统又把这个应用重新启动一遍,既然重新创建新的Application,自然就创建新的Application。
总结
多进程中模式中,不同进程会拥有独立的虚拟机、Application和内存空间
相当于两个不同的应用采用了ShareUID的模式
由于多进程中不能直接通过共享内存来通信,故有了很多跨进程通信机制来实现数据交互,如Intent传递数据、共享文件、SharePreferences、基于Binder的Messenger和AIDL以及Socket等等,下面我们就来学习IPC的各种跨进程通信机制。