IPC机制

2020-07-10  本文已影响0人  Dream_Book

仅做个人学习记录

什么是IPC?

inter-process-communication 进程间通信(跨进程通信),两个进程间进行数据交互的过程。

什么是线程?什么是进程?两者的关系?

线程:是CUP调度的最小单元,同时是一种有限的系统资源。
进程:一般指一个执行单元,在PC或移动设备上表示为一个程序或者应用。
一个进程中可以包含过个线程,一个或多个线程系统的组成就是一个程序。

IPC是Android独有的吗?Linux有那些跨进程通信?

任何一个操作系统都需要一套IPC通信机制,比如windows的剪切板、管道...

linux的跨进程通信方式:

Android有哪些跨进程通信方式?

Android是基于Linux内核开发的操作系统,为什么不采用Linux的IPC通信方式?

管道:缓存区容量有限,不适合Android大量的进程间通信需求。

消息队列:和命名管道一样每次数据快的容量有限制;消息复制两次(用户空间到内存,内存到用户空间),额外消耗cpu,不适合Android频繁的通信要求。

共享内存:共享内存就是允许两个不相关的进程访问同一个逻辑内存。 共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效 的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以 将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共 享内存中的地址。
无需复制,共享缓冲区,速度快。但是安全问题比较突出。

套接字:效率太低,主要用来跨网络通信。

信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

信号:不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

Binder:Binder驱动会在
为何会选Binder:

  1. 传递性:Binder数据需要进行一次拷贝,而共享内存完全不需要进行数据拷贝。
  2. 稳定性:Binder采用CS的架构方式,Server端和Client端相对独立,稳定性好。共享内存需要充分考虑临界资源的访问问题,很容易出现死锁问题。
  3. 安全性:Android端会为每个已安装的应用程序分配一个UID,Binder只对外暴露Client端,Client端会将任务发送给Server端,Server端会根据权限控制策略对UID进行甄别是否满足访问权限。
  4. 其他原因:Linux是受GPL保护的。
    传统的IPC只能由用户在数据包里填写ID;传统IPC接入点也是开放的,无法建立私有通道。

传统的IPC就没有在Android中用到吗?

比如在 Android OS 中的 Zygote 进程的 IPC 采用的是 Socket(套 接字)机制,Android 中的 Kill Process 采用的 signa(l 信号)机制等等。而 Binder 更多则用在 system_server 进程与上层 App 层的 IPC 交互。

zygot

开发中有哪些多进程的情况?

如何开启多进程模式?

        <activity 
            android:name="com.ipc.app.page"/>

        <activity
            android:process=":test"
            android:name="com.ipc.app.page1"/>

        <activity
            android:process="com.ipc.app.test"
            android:name="com.ipc.app.page2" />

page会运行在默认的进程(com.ipc.app)当中;
page1会运行在com.ipc.app:test进程当中;
page2会运行在com.ipc.app.test进程当中;

page1和page2不是同一个进程。因为“:”表示,是要在当前进程名前添加当前包名,这是一种简写,并且以“:”开头的进程为当前应用的私有进程,其他应用的组件不可以和他跑在同一个进程当中。
反之不以“:”开头则为全局进程,其他应用通过ShareUID方式可以和他跑在同一个进程。

使用多进程会有哪些问题?

解释:Android会为每个进程分配一个独立的虚拟机,不同的虚拟机就会有不同的地址控件,不同的虚拟机访问同一个对象就会产生不同的副本,并且互不干扰,这样就会出现第一种和第二种情况。SharedPreferences虽然是线程安全的,但是不支持多进程操作,可能会导致数据的丢失。开启一个新的进程,就是开启一个新的应用,当然会创建application。

Binder是什么?

Binder的工作流程?

binder工作流程

Binder通信有四个很重要的角色:

这样就完成了一次Binder通信,其中上海(BinderClient),西安的家(BinderServer)、备忘录(serviceManger)、蜂巢物流系统(Binder驱动)。

蓝色区域为Binder驱动

操作系统采用虚拟存储器,在逻辑上将虚拟空间分为内核空间和用户空间,为了保证安全安全性他们之间是隔离的。用户是不能直接操作内核的,但不可避免的用户空间需要访问内核(文件操作,网络访问),为了突破这层隔离就需要进行系统调用

系统调用步骤:
1.将数据从用户空间拷贝到内核空间
2.将数据从内核空间拷贝到用户空间

传统IPC一次跨进程通信
  1. 消息发送方将消息放入自行开辟的内存缓存区中
  2. 通过系统调用进入内核运行态(内核态)
  3. 内核程序开辟一块内核缓存区,将数据从消息发送方的内存缓存区中拷贝过来。
  4. 内核程序处理完毕后,消息接收方从内核缓存区中将数据拷贝到自己的内存缓存区中。

传统通信存在的问题:

  1. 需要尽量两次数据拷贝,效率低下。
  2. 接收方并不知道数据有多大,会开辟很大的内存缓存区来进行数据接受;或者通过其他方式先获取数据大小,浪费时间。

Binder不是系统内核的一部分,如何完成进程通信?

Linux的动态内核可加载模块的机制。

上一篇 下一篇

猜你喜欢

热点阅读