Android信号量怎样定义的,Android 系统复习面试系列(五)进程间通信

Android 系统复习面试系列(五)进程间通信

本篇主要总结 Binder 原理,顺带提下其他进程间通信方式

Android 进程间通信方法

文件、AIDL、Binder、Messenger、ContentProvider、Socket

Linux 进程间通信方法

管道、消息队列、共享内存、套接字、信号量、信号

Android 为什么选择 binder 作为进程间通信的方式

文中前三点比较重要

ed5afb553bc8

image.png

Binder 原理

再附上 Binder 通信的各个角色图,很清晰

ed5afb553bc8

image.png

Binder 内存映射和接收缓存区管理

传统的IPC方式中,数据是怎样从发送端到达接收端的呢?

通常的做法是,发送方将准备好的数据存放在缓存区中,调用API通过系统调用进入内核中。内核服务程序在内核空间分配内存,将数据从发送方缓存区复制到内核缓存区中。接收方读数据时也要提供一块缓存区,内核将数据从内核缓存区拷贝到接收方提供的缓存区中并唤醒接收线程,完成一次数据发送。这种存储转发模式,需要拷贝两次内存,效率低下。

Binder采用一种全新策略:

通过 mmap(),由于 mmap() 分配的内存是映射在接收方用户空间里的,所有总体效果就相当于对有效负荷数据做了一次从发送方用户空间到接收方用户空间的直接数据拷贝,省去了内核中暂存这个步骤,提升了一倍的性能。顺便再提一点,Linux 内核实际上没有从一个用户空间到另一个用户空间直接拷贝的函数,需要先用 copy_from_user() 拷贝到内核空间,再用 copy_to_user() 拷贝到另一个用户空间。为了实现用户空间到用户空间的拷贝,mmap() 分配的内存除了映射进了接收方进程里,还映射进了内核空间。所以调用 copy_from_user() 将数据拷贝进内核空间也相当于拷贝进了接收方的用户空间,这就是 Binder 只需一次拷贝的原理。

AIDL

AIDL 是 Android 接口定义语言

流程

1、通过 Android Studio 新建一个 aidl 文件,as 会自动创建好包路径 main\aidl\包名,并且生成对应的 java 文件。

2、本地创建一个 binder 类,继承生成 aidl 文件生成的 java 类 的 内部类 Stub。

3、创建一个远程 service, 在 onBind 方法中返回第 2 步中创建的 binder 类。

4、在 ServiceConnection 的 onServiceConnected 回调中,通过 Stub.asInterface 方法,创建 aidl 文件 生成的 java 类的接口对象,拿到这个对象后我们就可以调用服务端进程中的方法了。

强烈建议写一个简单的例子,然后去看 as 自动生成的 java 文件,aidl 原理全在其中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值