<返回更多

通俗易懂的Android多进程间通信 binder机制

2022-09-14  今日头条  初壹十五a
加入收藏

一丶Android多进程通信的应用场景?

二丶为什么要用binder

 

Binder的一次拷贝发生在用户空间拷贝到内核空间;

用户空间: App进程运行的内存空间;

内核空间: 系统驱动、和硬件相关的代码运行的内存空间,也就是进程ID为0的进程运行的空间;

程序局部性原则: 只加载少量代码;应用没有运行的代码放在磁盘中,运行时高速缓冲区进行加载要运行的代码;默认一次加载一个页(4K),若不够4K就用0补齐;

MMU:内存管理单元;

给CPU提供虚拟地址;

当对变量操作赋值时:

物理地址: 物理内存的实际地址,并不是磁盘;

虚拟地址: MMU根据物理内存的实际地址翻译出的虚拟地址;提供给CPU使用;

 


 

页命中:CPU读取变量时,MMU在物理内存的页表中找到了这个地址;

页未命中:CPU读取变量时,MMU在物理内存的页表中没有找到了这个地址,此时会触发MMU去磁盘读取变量并存到物理内存中;

普通的二次拷贝:

应用A拷贝到服务端:coay_from_user

从服务端拷贝到应用B:coay_to_user

mmap():

共享内存进程通信:

Binder通信原理:

角色:Server端A、Client端B、Binder驱动、内核空间、物理内存

 

Activity跳转时,最多携带1M-8k(1兆减去8K)的数据量;

真实数据大小为:1M内存-两页的请求头数据=1M-8K;

应用A直接将数据拷贝到应用B的物理内存空间中,数据量不能超过1M-8K;拷贝次数少了一次,少了从服务端拷贝到用户;

IPC通信机制:

以下为简单的主进程和子进程通信:

1、服务注册: 缓存中心中有三张表(暂时理解为三个HashMap,Binder用的是native的红黑树):

类的方法集合:key-value;

key:方法签名:“方法名” 有参数时用 “方法名-参数类型-参数类型-参数类型......”;

value: 方法本身;

注册后,服务若没被调用则一直处于沉默状态,不会占用内存,这种情况只是指用户进程里自己创建的服务,不适用于AMS这种;

2、服务发现: 当被查询到时,要被初始化;

3、服务调用:

AIDL: BpBinder:数据发送角色 BbBinder:数据接收角色

 

编译器生成的AIDL的JAVA接口.Stub.proxy.transact()为数据发送处;

发送的数据包含:数据+方法code+方法参数等等;

请求头:包含了目的进程、大小等等参数,这些参数占了8K

编译器生成的AIDL的java接口.Stub.onTransact()为数据接收处;

Binder中的IPC机制:

ServiceManager维持了Binder这套通信框架

三丶APP多进程的优点

四丶多进程通信原理

 

Android进程是运行在系统分配的虚拟地址空间,虚拟地址空间分为用户空间和内核空间。多进程间,用户空间不共享,内核空间共享,进程间通过共享的内核空间通信。

五丶多进程通信有哪些方式?

1.传统的IPC方式:socket,内存共享。
2.Android特有的方式:Binder。

六丶Binder相对其他IPC方式优点/为什么使用Binder?

 

1.性能:

A.Socket传输数据的过程:两次拷贝

 

B.Binder传输数据的过程:一次拷贝

 

内存映射:MMAP(memory map)

虚拟内存和物理内存

虚拟内存映射到物理内存,物理内存存储数据。

2.易用性

3.安全性

七丶Binder在Android系统CS通信机制中起到的作用

AIDL和Binder的关系?
AIDL封装了Binder,AIDL调用Binder

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>