深刻理解Binder机制

首先是我为什么要写这篇文章,有几点原因:其一,市面上能讲清楚Binder的文章很少,而且很多文章会让人看的云里雾里,不知所云;其二,很多同学对这一块也不是很理解,尽管很多人已经工作了很多年。

我特地去查了一下Binder的英文翻译:

Binder机制其实是用于进程间通信的,可以理解为进程之间的粘合剂。

 Binder到底是什么?

从机制,模型角度来说:Binder是一种Android中实现跨进程通信(IPC)的方式,用于实现Android中跨进程通信。【Binder机制】

从模型,结构组成来说:Binder是一种虚拟的物理设备驱动,链接Service进程,Client进程和Service Manager进程。【Binder驱动】

从Android代码实现角度来说:Binder是一个类,实现了IBinder接口,是Binder机制的在Android代码中的实现。【Binder类】

本文也将从Binder机制到Binder驱动,再到Binder类来层层深入。

在讲解Binder前,先普及一下linux的一些基础知识:

进程空间划分为用户空间和内核空间,进程之间用户空间的数据不可共享,内核空间数据可以共享。

来看一张图:

 进程内用户空间 & 内核空间进行交互需通过 系统调用,主要通过函数:

copy_from_user和copy_to_user。

进程隔离为了保证安全性 & 独立性,一个进程不能直接操作或者访问另一个进程,即 Android 的进程是 相互独 立、隔离的。跨进程通信(IPC )即进程间需进行数据交互、通信。
跨进程通信的基本原理:

 

IPC其中一种方式就是通过共享内存的方式,但是这种方式需要拷贝两次数据,很明显效率低下。而且接受进程也不知道所需要接受的数据大小,不知道需要多大的缓存,一般是开辟尽量大的空间,很明显会浪费空间。

而 Binder 的作用则是:连接两个进程,实现了mmap()系统调用,主要负责创建数据接收的缓存空间 & 管理数据接收缓存 。传统的跨进程通信需拷贝数据2次,但 Binder 机制只需1次,主要是使用到了内存映射。
什么是内存映射?

内存映射在linux操作系统中非常重要,涉及到高效率的跨进程通信和文件操作。

/**
  * 函数原型
  */
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

/**
  * 具体使用(用户进程调用mmap())
  * 下述代码即常见了一片大小 = MAP_SIZE的接收缓存区 & 关联到共享对象中(即建立映射)
  */
  mmap(NULL, MAP_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);

/**
  * 内部原理
  * 步骤1:创建虚拟内存区域
  * 步骤2:实现地址映射关系,即:进程的虚拟地址空间 ->> 共享对象
  * 注: 
  *    a. 此时,该虚拟地址并没有任何数据关联到文件中,仅仅只是建立映射关系
  *    b. 当其中1个进程对虚拟内存写入数据时,则真正实现了数据的可见
  */

Linux系统下,根据内存映射的本质原理 & 特点,其应用场景在于:

  1. 实现内存共享:如 跨进程通信
  2. 提高数据读 / 写效率 :如 文件读 / 写操作

文件读/写操作:

传统linux操作系统文件操作流程:

 使用内存映射文件读/写操作:

 使用了内存映射的跨进程通信:

 Binder跨进程通信的核心原理:

 模型原理步骤说明:

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AD钙奶-lalala

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值