面试题:IPC(跨进程通信)

Q1:IPC基础及概念?
Q2:Android中进程和线程的关系?区别?
Q3:为何需要进行IPC?多进程通信可能会出现什么问题?
Q4:Android中IPC方式有几种? 为何新增Binder来作为主要的IPC方式?
Q5:使用Binder进行数据传输的具体过程?
Q6:Binder框架中ServiceManager的作用?
Q7:Android中有哪些基于Binder的IPC方式?简单对比下?
Q8:是否了解AIDL?原理是什么?如何优化多模块都使用AIDL的情况?

Q9:什么是序列化?Serializable接口和Parcelable接口的区别?为何推荐使用后者?

要点提炼|开发艺术之IPC

听说你Binder机制学的不错,来面试下这几个问题(一)

Q1:IPC基础及概念?

IPC简介

a.IPC(Inter-Process Communication,跨进程通信):指两个进程之间进行数据交换的过程。

b.任何一个操作系统都有对应的IPC机制。

  • Windows:通过剪切板、管道、油槽等进行进程间通讯。
  • Linux:通过命名空间、共享内容、信号量等进行进程间通讯。
  • Android:没有完全继承Linux,比如,其独具特色的通讯方式有Binder、Socket等等。

c.IPC的使用场景:

  • 由于某些原因,应用自身需要采用多进程模式来实现。可能原因有:

          某些模块因特殊原因要运行在单独进程中;
          为加大一个应用可使用的内存,需通过多进程来获取多份内存空间。

  • 当前应用需要向其它应用获取数据。

d.Android的进程架构:每一个Android进程都是独立的,且都由两部分组成,一部分是用户空间,另一部分是内核空间,如下图:

如此设计的优点:

扫描二维码关注公众号,回复: 3417603 查看本文章
  • 稳定性、安全性高:每一个Android进程都拥有自己独立的虚拟地址空间,一方面可以限制其他进程访问自己的虚拟地址空间;另一方面,当一个进程崩溃时不至于“火烧连营”。
  • 便于复用与管理:内核共享有助于系统维护和并发操作、节省空间。

Q2:Android中进程和线程的关系?区别?

进程(Process)&线程(Thread)

进程:一般指一个执行单元,在PC和移动设备上指一个程序或应用。
线程:CPU调度的最小单元。线程是一种有限的系统资源。
两者关系: 一个进程可包含多个线程,即一个应用程序上可以同时执行多个任务。

主线程(UI线程):UI操作
有限个子线程:耗时操作
注意:不可在主线程做大量耗时操作,会导致ANR(应用无响应)。

Q3:为何需要进行IPC?多进程通信可能会出现什么问题?

为什么要用到多进程?
在Android系统中一个应用默认只有一个进程,每个进程都有自己独立的资源和内存空间,其它进程不能任意访问当前进程的内存和资源,系统给每个进程分配的内存会有限制。如果一个进程占用内存超过了这个内存限制,就会报OOM的问题,很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题,为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如Flash、视频播放页面,频繁绘制的页面等。Android多进程使用很简单,只需要在AndroidManifest.xml的声明四大组件的标签中增加”android:process”属性即可,process分私有进程和全局进程,以“:”号开头的属于私有进程,其他应用组件不可以和他跑在同一个进程中;不以“:”号开头的属于全局进程,其他应用可以通过ShareUID的方式和他跑在同一个进程中;

既然使用到了多进程,就不可避免地需要使用进程间通信了。

但是多进程模式出现以下问题:
1、静态成员和单例模式完全失效
2、线程同步机制完全失效
3、SharedPreferences的可靠性下降
4、Application多次创建

因此为了避免这些问题Android中有多种IPC机制,如AIDL,Messenger,Socket,ContentProvider,但是这些机制底层全部都是用了Binder机制来实现的,什么是Binder?要了解Android系统中的IPC我们首先要了解的就是Binder;

Android IPC机制详解(一)

Q4:Android中IPC方式有几种? 为何新增Binder来作为主要的IPC方式?

Android中IPC的几种方式详细分析与优缺点分析

Binder机制原理

写给 Android 应用工程师的 Binder 原理剖析

Android IPC机制详解(一)

1、Binder机制

Binder是Android系统中的一种IPC进程间通信结构。
Binder的整个设计是C/S结构,客户端进程通过获取服务端进程的代理,并通过向这个代理接口方法中读写数据来完成进程间的数据通信。
Android之所以选择Binder,有2个方面的原因。
1是安全,每个进程都会被Android系统分配UID和PID,不像传统的在数据里加入UID,这就让那些恶意进程无法直接和其他进程通信,进程间通信的安全性得到提升。
2是高效,像Socket之类的IPC每次数据拷贝都需要2次,而Binder只要1次,在手机这种资源紧张的情况下很重要。

1.客户端获取服务端的代理对象(proxy)。我们需要明确的是客户端进程并不能直接操作服务端中的方法,如果要操作服务端中的方法,那么有一个可行的解决方法就是在客户端建立一个服务端进程的代理对象,这个代理对象具备和服务端进程一样的功能,要访问服务端进程中的某个方法,只需要访问代理对象中对应的方法即可;
2.客户端通过调用代理对象向服务端发送请求。
3.代理对象将用户请求通过Binder驱动发送到服务器进程;
4.服务端进程处理客户端发过来的请求,处理完之后通过Binder驱动返回处理结果给客户端的服务端代理对象;
5.代理对象将请求结果进一步返回给客户端进程。
通过以上5个步骤,就完成了一次Binder通信。

2、Binder机制的组成

Binder机制由三部分组成,即:
1.Client;
2.Server;
3.ServiceManager。

三部分组件之间的关系:
1.Client、Server、ServiceManager均在用户空间中实现,而Binder驱动程序则是在内核空间中实现的;
2.在Binder通信中,Server进程先注册一些Service到ServiceManager中,ServiceManager负责管理这些Service并向Client提供相关的接口;
3.Client进程要和某一个具体的Service通信,必须先从ServiceManager中获取该Service的相关信息,Client根据得到的Service信息与Service所在的Server进程建立通信,之后Clent就可以与Service进行交互了;
4.Binder驱动程序提供设备文件/dev/binder与用户空间进行交互,Client、Server和ServiceManager通过open和ioctl文件操作函数与Binder驱动程序进行通信;
5.Client、Server、ServiceManager三者之间的交互都是基于Binder通信的,所以通过任意两者这件的关系,都可以解释Binder的机制。

猜你喜欢

转载自blog.csdn.net/songzi1228/article/details/82757302