首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Binder纯理论分析

Binder纯理论分析

作者头像
Rouse
发布于 2021-01-24 14:25:19
发布于 2021-01-24 14:25:19
7990
举报
文章被收录于专栏:Android补给站Android补给站

接下来的一段时间,我们会来深入认识一下Android中的Binder机制。

今天的主要是来对Binder做一个较全面的介绍,为之后的深入分析做一个预热准备。

Linux IPC

首先BinderAndroid中的一种独有的跨进程通信方式,简称IPC。它是专门为Android平台设计的。

那为什么要设计出Binder这个烦人的东西呢?我们都知道Android是基于Linux系统进行演变过来的,所以理应也能直接使用LinuxIPC通信方式。

所以在理解Binder的设计初衷之前,我们先来了解一下Linux系统中现有的IPC通信方式。

Linux现有的IPC通信方式有6种:

  1. 管道
  2. 信号量
  3. 信号
  4. 共享内存
  5. 消息队列
  6. socket

管道

英文为pipe,在Linux中它的本质是一个文件系统,通过一个进程以写的方式打开文件,另一个进程以读的方式进行打开文件,通过这样读写的方式,实现了进程间的通信。

只不过该文件是位于Linux内存中,所以操作管道就是以文件的方式操作Linux内存缓存区。

由于管道是通过读写文件的方式进行运作的,所以它需要进行两次数据的拷贝;分别是copy_form_user从写进程拷贝到文件内存缓存区,再通过copy_to_user从文件缓存区拷贝到读进程中。

同时管道还有大小限制,默认为4k,一旦写入端超过大小限制,管道将会阻塞。

信号量

主要作用于进程间的资源互斥访问,通过PV两种操作等待与发送信号。

P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行 V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

所以信号量主要是用来解决多个进程对同一资源的竞争问题,类似于多线程的同步锁。

信号

Linux中定义的一种软中断,有64种,分为可靠信号与不可靠信号,多用于消息传递与通知,不适合传递信息。

共享内存

共享内存顾名思义,允许不同的进程访问同一块内存地址空间,它也需要进行两次数据拷贝操作,分别是将数据拷贝到共享内存中,又从共享内存中间将数据拷贝出来。

但需要注意的是,共享内存是不提供同步机制。

意思就是说,在其中一个进程进行写操作时,并不能放在另一进程进行读操作。

为了解决这个问题,共享内存一般都与前面说的信号量一起使用。

消息队列

消息队列通过一个进程向另一个进程发生消息块的方式进行通信,它与管道非常类似,都需要发送与接收,数据拷贝两次。

不同点是

  1. 消息队列可以防止同步与阻塞问题。
  2. 消息队列的接收方可以进行选择性接收。
  3. 发送的消息块有最大限制

socket

Linux中的socket是基于C/S架构的,传输效率低,多用于跨网络与跨设备的通信。

Android底层使用socket来进行initzygote等进程间的通信。

最后简单的来看一张图来了解在Linux中不同进程中的通信过程。

所以通过上面的分析,Linux现有的几种IPC通信方式都不是很适合Android间的进程通信。

例如管道、共享内存与消息队列都需要拷贝两次数据,同时有的还会存在阻塞与同步问题;另外的信号、信号量与socket由于使用场景的原因,都不适合用于Android中快速的进程间的数据通信。

Binder

那么Binder通信方式是怎么样的呢?

Binder本身是基于C/S架构的,层次分明,架构稳定,同时Binder内部只需使用一次数据拷贝操作,就能达到进程间数据的通信;另外Binder还支持鉴别用户进程的Uid,为Android提供身份的验证。

我们先来通过一张图来简单看下基于Binder的进程通信过程

Binder数据通信流程是,将数据从client端拷贝到内核空间,在内核空间中会提前通过mmap方式建立与server端的内存地址映射,通过内存地址映射server端可以直接访问内核空间中的数据,从而避免将数据拷贝到server端,提高进程间的通信速度。

在整个通信的过程中主要做的事情是:

  1. 通过/dev/binder打开binder驱动
  2. 通过mmap建立内存地址映射
  3. 通过ioctlbinder驱动交互,进行数据传输
  4. client使用BpBindertransact方法进行事务请求
  5. server使用BBinderonTransact方法来接收相应的事务

由于Android中主要使用Binder来进行service的注册与获取,所以为了更好的管理service的注册,使用了ServiceManager来进行统一管理service的注册。

service的注册过程中ServiceManager就相当于server端,内部开启loop循环,不断接收消息将注册的service保存到注册表svclist中。

最终关于Binder的整个大致流程如下图所示

其中clientserver位于应用层,ServiceManager位于用户空间,binder驱动位于内核空间。

对于开发者来说,用户空间与内核空间是透明的,我们只需关注应用层clientserver的实现,就可以方便的使用Binder的通信机制。

以上是对Binder的一个理论分析,接下来的一段时间,我将结合源码来分析service的注册过程,从而探索Binder的整个工作流程,感兴趣的读者可以关注一下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android补给站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android Framework学习笔记之Binder
Linux进程间通信的方式: 管道(Pipe)、信号(Signal)、消息队列(Message)、共享内存(Share Memory)、套接字(Socket、中断 Binder: Binder 通信机制是在OpenBinder的基础上实现的,采用CS通信方式。 OpenBinder是一种进程间通信机制,它最初是由Be公司开发的,后来由Palm公司接手开发和维护,最后Google公司对其进行改造,并应用在Android系统中。
李小白是一只喵
2021/12/06
6290
Android Framework学习笔记之Binder
Android高频面试专题 - 进阶篇(三)Binder机制
Android作为移动端操作系统,传统的Linux进程间通信机制不满足于Android,所以开发了一套新的IPC机制,就是Binder机制。
Android扫地僧
2020/03/19
1K0
Android高频面试专题 - 进阶篇(三)Binder机制
android binder机制详解
摘要 Binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析Binder机制,有两点原因:1是目前网上已经有2篇很好的文章了,2是对Binder机制进行深入底层乃至驱动的分析这一过程相当困难且相当耗时,因此并不适合重复造轮子。本文的角度是对Android的Binder机制从整体和概念上进行分析,能够让大家很快明白到底什么是Binder,Binder是干什么的,Binder和应用开发的关系是什么,总之,这篇文章还是很值得去看一看的。 什
xiangzhihong
2018/01/30
9520
android binder机制详解
Android Binder面试详解
目前linux支持的IPC包括传统的管道、System V IPC、即消息队列/共享内存/信号量,以及socket中只有socket支持Client-Server的通信方式
用户2802329
2018/08/07
1.1K0
Android Binder面试详解
写给Android开发的Binder指南
Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制。那为什么 Android 还要提供 Binder 来实现 IPC 呢?主要是基于性能、稳定性和安全性几方面的原因。
老马的编程之旅
2022/06/22
5630
写给Android开发的Binder指南
Android-Binder机制
Binder机制是​ Android系统中进程间通讯(IPC)的一种方式,Android中ContentProvider、Intent、aidl都是基于Binder。
用户7557625
2020/07/15
1.4K0
Android-Binder机制
Binder机制1—Binder原理介绍
这篇文章会先对照Binder机制与Linux的通信机制的区别,了解为什么Android会另起炉灶,採用Binder。接着,会依据Binder的机制,去理解什么是Service Manager,在C/S模型中扮演什么角色。最后,会从一次完整的通信活动中,去理解Binder通信的过程。
全栈程序员站长
2022/07/09
1.2K0
Binder机制1—Binder原理介绍
android进程间通信之Binder学习笔记(一)
Binder 是一种进程间通信机制,基于开源的 OpenBinder 实现;OpenBinder 起初由 Be Inc. 开发,后由 Plam Inc. 接手。
李小白是一只喵
2020/04/24
8250
Android跨进程通信:图文详解 Binder机制 原理
Binder 跨进程通信机制 模型 基于 Client - Server 模式
Carson.Ho
2019/02/22
3.4K0
Binder机制 简单理解
Android系统中,涉及到多进程间的通信底层都是依赖于Binder IPC机制。例如当进程A中的Activity要向进程B中的Service通信,这便需要依赖于Binder IPC。不仅于此,整个Android系统架构中,大量采用了Binder机制作为IPC(进程间通信)方案。
zhangjiqun
2024/12/16
2520
Binder机制 简单理解
Binder跨进程通信的流程
上图是一次binder调用的通信流程,Client是应用进程,Server是系统服务,应用进程通过binder调用请求系统服务,Client向binder驱动发送BC_Transaction指令,binder在收到该指令指令之后回向Client返回BR_Transaction_Complete指令,同时binder驱动会向系统服务发送BR_Transaction指令,并等待系统服务的处理,系统服务处理完成之后会向binder发送BC_Reply的回持,binder驱动在收到系统服务的回执之后,也会向系统服务发送BR_Transation_Complete的回执,同时向应用进程发送BR_Reply,将处理结果发送给应用进程。
码农帮派
2021/02/25
6380
Binder跨进程通信的流程
Android进程间通信 -- Binder学习记录
移动设备的操作系统阵营之一的Android,底层基于Linux内核,中间为Native&Runtime层和Framework层。我们知道Linux本身有着很成熟的IPC(进程间通信)机制,比如管道、消息队列、共享内存、socket、信号和信号量等。然而,Android却使用Binder来作为它的IPC的方案,这是为何呢?接下来,就把我之前学习Binder的心得写下来。
用户6414482
2022/08/28
6830
Android进程间通信 -- Binder学习记录
Android进程间通信之一:Binder机制学习
主要是驱动设备的初始化(binder_init),打开 (binder_open),映射(binder_mmap),数据操作(binder_ioctl)。
北洋
2021/12/08
5880
Android进程间通信之一:Binder机制学习
Android 进阶8:进程通信之 Binder 机制浅析
张拭心 shixinzhang
2018/01/05
2.3K0
Android 进阶8:进程通信之 Binder 机制浅析
Android跨进程通信IPC之6——Binder框架
为了让大家更好的理解Binder机制,我们先来看下Android的整体架构。因为这样大家就知道在Android架构中Binder出于什么地位。 用一下官网上的图片
隔壁老李头
2018/08/30
1.5K0
Android跨进程通信IPC之6——Binder框架
面试 | 再也不怕被问 Binder 机制了
原文链接:https://juejin.cn/post/7293175592162836514
GeeJoe
2023/10/24
1.7K1
面试 | 再也不怕被问 Binder 机制了
[002]Binder整体框架的介绍
我一直在想是从上往下讲Binder架构,还是从下往上讲,最后还是决定从下往上讲,那我们先来聊聊Binder驱动,这里不和你讲太多的源码,比如用户空间拷贝数据到内核空间具体实现,Binder线程池的具体实现。我们从宏观角度来分析一下Binder驱动要怎么设计。
王小二
2020/06/08
7420
[002]Binder整体框架的介绍
神秘、常用、多变的Binder
挺多概念的是吧,其实就说了一件事,Binder就是用来进程间通信的,是一种IPC方式。后面所有的解释都是Binder实际应用涉及到的内容。
码上积木
2020/12/11
6370
神秘、常用、多变的Binder
深入理解Binder
之前一直对 Binder 理解不够透彻,仅仅知道一些皮毛,所以最近抽空深入理解一下,并在这里做个小结。
俞其荣
2019/07/09
1.2K0
彻底理解 Android Binder 通信架构
roid 6.0的源码剖析, 本文深度剖析Binder IPC过程, 这绝对是一篇匠心巨作,从Java framework到Native,再到Linux Kernel,带你全程看Binder通信过程.
哲洛不闹
2018/09/14
6.3K0
彻底理解 Android Binder 通信架构
相关推荐
Android Framework学习笔记之Binder
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档