一场恋爱趣讲-Binder通信原理,教你手写Binder进程通信架构(1)

本地邮局称为用户空间, 全国邮局称为内核空间

本地邮局是他们离的最近的地方。他们可以接触到本地邮局,可以在邮局中直接收信和发信

1.1 这是普通linux进程通信的方式

转换专业术语的图

进程间,用户空间的数据不可共享(本地邮局是男孩或女孩独有),所以用户空间相当于私有空间。

进程间,内核空间的数据可共享(全国邮局是所有人共有),所以内核空间 相当于公共空间。

进程间如果需要做到通信,需要通过共享空间对数据转换。转换过程需要调用系统的api,这个过程称为系统调用。

问题来了:

男孩写好信之后,发送信件给本地邮局 , 相当于一次拷贝 我们把这个过程称为(copy_from_user)

女孩收到当地邮局通知,需要从本地邮局取信。相当于第二次拷贝,我们把这个过程称为(copy_to_user)

这就是Linux已有进程间通信方式。

两次拷贝究竟性能怎么样,当然拷贝是非常耗性能的,而两次拷贝可以再优化优化。

那binder是怎么做到一次拷贝的呢

1.2接着讲爱情的例子(Binder的实现机制)

后来在疫情结束后,这个女孩去了全国邮局依赖的快递公司上班去了,所有的信封需要用快递公司来处理,刚好这家快递公司处理的是他们两个城市的信件。

为了方便收信封,居然还有这操作

这就给女孩创造了便利,不用去本地邮局取信件

但是男孩还是要发送信件。binder拷贝也是发生在男孩这个地方copyfromuser,女孩由于在快递公司上班,可以随意浏览男孩的信件。不需要再取信件了。也就减少了从本地邮局取快递这次拷贝过程

**思考:**大家还记不记得接收端怎么写的,对! 接收端一定必须是服务Service,接收端不能是其他java对象。Service就是那个女孩。她必须在快递公司上班才能减少一次拷贝。所以这个Service,在通信前会注册在ServiceManager中。而男孩可以是任意对象,出现在任意地方。

Linux 已有的进程通信,发送端和接收端可以是任意对象。出现在任意类中。但是必须牺牲多拷贝一次

Android的Binder通信,接受端不能是任意对象,只能是Service,这也节约了一次拷贝,牺牲了开发者的体验

1.3 Binder少拷贝一次的原理:

全国邮局 相当于内核空间的内存,所有的应用都与内核空间的内存发生频繁的调用,在Binder中传递数据本质上是通过文件读取来实现的

大家记不记得Linux系统 是文件操作系统,都是基于文件展开的。进程通信中 File也能实现进程通信

Binder机制中 在内存与文件中设计了一层映射关系。内核空间的内存是虚的,文件IO是实的。映射指的是内存与文件的映射,映射是通过mmap函数。

而mmap函数 需要依赖一个文件,这个文件叫做“binder”。对!他没有后缀名,他就是一个文件。但是人们习惯性的把它称为binder驱动。

我们再来看看实际的是如何映射的

  1. 全国邮局中的A城与B城的信件,相当于内核空间内存一部分虚拟内存区域。

  2. A城与B城的快递公司,相当于文件实体。实际信封是由快递公司转发。邮局与快递公司的合作关系,可以理解内存与文件形成了映射关系(mmap)

1.4 服务端Service 也通过mmap函数监听文件的变化。

一旦有信件到达女孩的公司直接读取出来,而不用去本地邮局取信件。

女孩怎么在公司取出来呢?大家忘记了女孩在快递公司上班呢,快递公司会给员工布置工作内容

女孩的工作内容是查看快递接收站和发送站的信封

这样你说能不能看到男朋友发过来的信件,还不用亲自跑到本地邮局,那不是爽歪歪

绿色部分 是女孩进程,绿色内有两个角色(女孩接触到的 接收站和收发站)

这一套机制的实现基于 aidl文件编译机制

在编译时生成了一个继承自Binder中的IInterface接口(女孩)。接口中有这样一个内部类叫Stub(女孩工作接触的接收站)和一个内部类叫Proxy(女孩工作接触的发送站)

男孩信封到了,女孩直接在 快递接收站查看男孩发过来的信封(Stub中的 onTransact方法)

女孩思恋男孩,跟男孩发送信封(Proxy中的transact方法)

Stub与Proxy中所有的方法是native直接调用过来的。参数是直接从内核空间传递过来的,不需要发生拷贝。

如果女孩需要给男孩发送消息,也不用跑到本地邮局,直接在 快递发送站,插入一个信封就好了(调用Proxy的transct方法)

减少一次拷贝发生在 服务端service。直接由nativie层 的Binder调起。不需要再次拷贝。

大家看完了 是不是对整个Binder机制有深刻的认识呢?

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618165277)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值