1. 简要说说进程与线程的区别和联系。
进程是系统进行资源分配的基本单位,线程是任务执行和调度的基本单位。
一个操作系统内可运行多个进程,每个进程拥有独立的数据空间;一个进程内可运行多个线程,多个线程共享所在进程的系统资源。
线程之间相互切换,资源开销较小;而进程之间相互切换,资源开销较大。
进程与线程都统一由CPU进行调度执行,进程是线程运行的基本环境,线程相当于进程的子任务,颗粒度较小。
2. 应用内使用多进程可能导致哪些问题?
当一个APP启用了多进程后,系统会为不同的进程分配不同的内存空间,因此所有需要通过内存共享的行为都会失败。另外,还会导致以下几个问题:
- 进程:Application会被多次创建,因为系统会为每一个进程分配独立的内存空间。
- 线程:线程同步失效,因为不同进程中的线程同步锁不是同一个对象。
- 内存:单例模式和静态变量失效,因为不同进程间的内存空间不同。
- 存储:SharedPreferences可靠性下降,因为系统对SharedPreferences有一定的缓存策略,多个进程同时读写可能会造成数据丢失。
3. Android中有哪些进程间通信方式?
名称 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Bundle | 简单易用 | 只能传输Bundle支持的数据类型 | 四大组件间的进程间通信 |
文件共享 | 简单易用 | 不适用高并发场景,并且无法做到进程间即时通信 | 适用于无关发的情况下,交换简单的数据,对实时性要求不高的场景。 |
AIDL | 功能强大,支持一对多实时并发通信 | 使用稍复杂,需要处理好线程间的关系 | 一对多通信且有RPC需求 |
Messenger | 功能一般,支持一对多串行通信,支持实时通信 | 不能很好地处理高并发的情形,不支持RPC,由于数据通过Message传输,因此只能传输Bundle支持的数据类型 | 低并发的一对多实时通信,无RPC需求,或者无需要返回结果的RPC需求 |
ContentProvider | 支持一对多的实时并发通信,在数据源共享方面功能强大,可通过Call方法扩展其它操作 | 可以理解为受约束的AIDL,主要提供对数据源的CRUD操作 | 一对多的进程间数据共享 |
BroadcastReceiver | 操作简单,对持一对多实时通信 | 只支持数据单向传递,效率低且安全性不高 | 一对多的低频率单向通信 |
Socket | 功能强大,可通过网络传输字节流,支持一对多实时并发通信 | 实现细节步骤稍繁琐,不支持直接的RPC | 网络间的数据交换 |
由于不同的进程拥有不同的数据空间,所以无论是应用内还是应用间,均无法通过共享内存来实现进程间通信。