大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

做者:鸿洋java

原文连接:https://mp.weixin.qq.com/s/zPVe1IRjNKKx2l5RVCc1Jwlinux

前言

对Binder学习感兴趣的小伙伴能够看看,但愿能帮助到大家。api

为何会有Binder通讯机制,为何不能用linux中已有的进程框架呢?Google工程师到底是如何考量的?微信

这一切能够经过一场恋爱来理解?架构

了解binder以前咱们看看原有Linux进程是如何通讯的吧!为何须要在内存中拷贝两次呢?框架

在了解Linux进程通讯前咱们先理解下 恋爱的故事吧!ide

故事:函数

男孩和女孩在某次旅游一见倾心,而旅行结束的他们不得不返回各自的工做城市性能

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

那个时代尚未微信,因为相隔在不一样的城市。相思的他们只能经过邮局抒发彼此爱慕之情学习

若是男孩想要给女孩发送信封,须要向本地邮局 寄信。再有全国邮局转发到 女孩所在的本地邮局

最后由本地邮局送到女孩手中

在进程中的角色:

男孩 称为进程A,工做城市A城,女孩称为进程B,工做城市B城

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

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

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

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

转换专业术语的图

进程间,用户空间的数据不可共享(本地邮局是男孩或女孩独有),因此用户空间至关于私有空间。

进程间,内核空间的数据可共享(全国邮局是全部人共有),因此内核空间 至关于公共空间。

进程间若是须要作到通讯,须要经过共享空间对数据转换。转换过程须要调用系统的api,这个过程称为系统调用。

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

问题来了:

男孩写好信以后,发送信件给本地邮局 , 至关于一次拷贝 咱们把这个过程称为(copy_from_user)

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

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

两次拷贝究竟性能怎么样,固然拷贝是很是耗性能的,而两次拷贝能够再优化优化。

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

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

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

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

为了方便收信封,竟然还有这操做

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

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

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

可是男孩仍是要发送信件。binder拷贝也是发生在男孩这个地方copyfromuser,女孩因为在快递公司上班,能够随意浏览男孩的信件。不须要再取信件了。也就减小了从本地邮局取快递此次拷贝过程

思考: 你们还记不记得接收端怎么写的,对! 接收端必定必须是服务Service,接收端不能是其余java对象。Service就是那个女孩。她必须在快递公司上班才能减小一次拷贝。因此这个Service,在通讯前会注册在ServiceManager中。而男孩能够是任意对象,出如今任意地方。

Linux 已有的进程通讯,发送端和接收端能够是任意对象。出如今任意类中。可是必须牺牲多拷贝一次

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

1.3 Binder少拷贝一次的原理:

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

你们记不记得Linux系统 是文件操做系统,都是基于文件展开的。进程通讯中 File也能实现进程通讯

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

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

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

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

A城与B城的快递公司,至关于文件实体。实际信封是由快递公司转发。邮局与快递公司的合做关系,能够理解内存与文件造成了映射关系(mmap)

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

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

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

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

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

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

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

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

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

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

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

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

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

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

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

你们看完了 是否是对整个Binder机制有深入的认识呢?

若是还不是很理解的,能够来看一下我搜集的一些关于Binder的详细系统的学习资料和视频从为何会有Binder,到Binder原理,最后从Binder中mmap函数 能为实际工做中解决储存的问题。

从Binder的底层原理分析,让Android开发者真正了解到Binder的通讯机制。从Linux进程通讯技术认知到为何Android会选择Binder做为通讯方式,到Linux的进程原理,最后借鉴Binder中mmap函数打造优异的存储框架。

有须要的小伙伴能够私信我Binder】我分享给你

但愿在2020 资本寒冬和疫情的状况下,你们都能抓住此次机会,在这段时间内努力提高本身技术,把本身变得更优秀,成为不可替代的人。最后找到本身满意的工做。

330页Android进阶核心笔记

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构

精选Binder进阶视频

大牛用爱情故事来说Binder通讯原理,一招搞定Binder进程通讯架构
B站帐号:bili_84936792704 但愿资料加视频能够提升你们学习的效率。

相关文章
相关标签/搜索