美文网首页
1.3 IPC(进程间通信)

1.3 IPC(进程间通信)

作者: Journey_lm | 来源:发表于2021-11-15 11:53 被阅读0次
    Q:Android中进程和线程的关系?区别?

    进程是操作系统分配和管理资源的单位,线程是CPU调度和管理的单位,是CPU调度的最小单元
    进程拥有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程间共享地址空间,线程有自己的堆栈和局部变量,一个线程崩溃会导致整个进程崩溃掉。
    一个进程可包含多个线程,即一个应用程序上可以同时执行多个任务。

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

    所有运行在不同进程的四大组件,只要它们之间需要通过内存共享数据,都会共享失败。由于Android为每个应用分配了独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间
    静态变量和单例模式失效:由独立的虚拟机造成。
    线程同步机制失效:由独立的虚拟机造成
    SharedPreference的不可靠下降: SharedPreferences不支持两个进程同时进行读写操作,即不支持并发读写,有一定几率导致数据丢失。
    Application多次创建:Android系统会为新的进程分配独立虚拟机,相当于系统又把这个应用重新启动了一次

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

    序列化表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
    Serializable:Java序列化接口,将一个对象转化成可存储或可传输的状态,操作简单、效率低、开销大,ObjectOutputStream和ObjectInputStream过程都需要大量的I/O操作。适合将对象序列化到存储设备或将对象序列化后通过网络设备传输。
    Parcelable:Android序列化接口,将一个对象进行分解,且分解后的每一个部分都是传递可支持的类型。操作比较麻烦、效率高。主要用在内存的序列化。

    Q:Android中为何新增Binder来作为主要的IPC方式?

    传输效率高、可操作性强:传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高。
    实现C/S架构方便:Linux的众IPC方式除了Socket以外都不是基于C/S架构,而Socket主要用于网络间的通信且传输效率较低。Binder基于C/S 架构 ,Server端与Client端相对独立,稳定性较好。
    安全性高:传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而Binder机制为每个进程分配了UID/PID且在Binder通信时会根据UID/PID进行有效性检测。

    Q:使用Binder进行数据传输的具体过程?

    通过AIDL实现方式解释Binder数据传输的具体过程

    服务端中的Service给与其绑定的客户端提供Binder对象,客户端通过AIDL接口中的asInterface()将这个Binder对象转换为代理Proxy,并通过它发起RPC请求。客户端发起请求时会挂起当前线程,并将参数写入data然后调用transact(),RPC请求会通过系统底层封装后由服务端的onTransact()处理,并将结果写入reply,最后返回调用结果并唤醒客户端线程。

    image.png
    Q:Binder框架中ServiceManager的作用?

    在Binder框架定义了四个角色:Server,Client,ServiceManager和Binder驱动。其中Server、Client、ServiceManager运行于用户空间,Binder驱动运行于内核空间。
    ServiceManager:服务的管理者,将Binder名字转换为Client中对该Binder的引用,使得Client可以通过Binder名字获得Server中Binder实体的引用。
    Server&Client:服务器&客户端。在Binder驱动和ServiceManager提供的基础设施上,进行Client-Server之间的通信。

    Q:Android中有哪些基于Binder的IPC方式?简单对比下?

    Bundle:Bundle实现了Parcelable接口,方便在不同的进程中传输数据。支持在activity、service、receiver之间通过intent.putExtra()传递Bundle数据。Bundle内部是通过ArrayMap来存取数据。Bundle不支持的数据类型无法在进程中被传递
    Messager:底层实现是AIDL,即对AIDL进行了封装,更便于进行进程间通信。支持一对多串行通信,支持实时通信。
    文件共享:两个进程通过读/写同一个文件来交换数据。比如A进程把数据写入文件,B进程通过读取这个文件来获取数据。对数据同步要求不高的进程之间进行通信,并且要妥善处理并发读/写的问题。
    ContentProvider:专门用来进行不同应用间数据共享的方式。
    AIDL:支持一对多并发通信,支持实时通信。
    Socket:不仅可跨进程,还可以跨设备通信。网络数据交换


    image.png
    Q:是否了解AIDL?原理是什么?如何优化多模块都使用AIDL的情况?

    如果在一个进程中要调用另一个进程中对象的方法,可使用AIDL生成可序列化的参数,AIDL会生成一个服务端对象的代理类,通过它客户端实现间接调用服务端对象的方法。
    当有多个业务模块都需要AIDL来进行IPC,此时需要为每个模块创建特定的aidl文件,那么相应的Service就会很多。必然会出现系统资源耗费严重、应用过度重量级的问题。解决办法是建立Binder连接池,即将每个业务模块的Binder请求统一转发到一个远程Service中去执行,从而避免重复创建Service。
    每个业务模块创建自己的AIDL接口并实现此接口,然后向服务端提供自己的唯一标识和其对应的Binder对象。服务端只需要一个Service,服务器提供一个queryBinder接口,它会根据业务模块的特征来返回相应的Binder对像,不同的业务模块拿到所需的Binder对象后就可进行远程方法的调用了

    Q.Binder到底是什么?

    通常意义下,Binder指的是一种通信机制;我们说AIDL使用Binder进行通信,指的就是Binder这种IPC机制。
    1、对于Server进程来说,Binder指的是Binder本地对象
    2、对于Client来说,Binder指的是Binder代理对象,它只是Binder本地对象的一个远程代理;对这个Binder代理对象的操作,会通过驱动最终转发到Binder本地对象上去完成;对于一个拥有Binder对象的使用者而言,它无须关心这是一个Binder代理对象还
    3、Binder本地对象;对于代理对象的操作和对本地对象的操作对它来说没有区别。
    4、对于传输过程而言,Binder是可以进行跨进程传递的对象;Binder驱动会对具有跨进程传递能力的对象做特殊处理:自动完成代理对象和本地对象的转换。

    详细解读IPC通信

    https://www.jianshu.com/p/88fd0dcd0528

    image.png

    相关文章

      网友评论

          本文标题:1.3 IPC(进程间通信)

          本文链接:https://www.haomeiwen.com/subject/zveiyctx.html