做者:鸿洋java
对Binder学习感兴趣的小伙伴能够看看,但愿能帮助到大家。api
为何会有Binder通讯机制,为何不能用linux中已有的进程框架呢?Google工程师到底是如何考量的?微信
这一切能够经过一场恋爱来理解?架构
了解binder以前咱们看看原有Linux进程是如何通讯的吧!为何须要在内存中拷贝两次呢?框架
在了解Linux进程通讯前咱们先理解下 恋爱的故事吧!ide
故事:函数
男孩和女孩在某次旅游一见倾心,而旅行结束的他们不得不返回各自的工做城市性能
那个时代尚未微信,因为相隔在不一样的城市。相思的他们只能经过邮局抒发彼此爱慕之情学习
若是男孩想要给女孩发送信封,须要向本地邮局 寄信。再有全国邮局转发到 女孩所在的本地邮局
最后由本地邮局送到女孩手中
在进程中的角色:
男孩 称为进程A,工做城市A城,女孩称为进程B,工做城市B城
本地邮局称为用户空间, 全国邮局称为内核空间
本地邮局是他们离的最近的地方。他们能够接触到本地邮局,能够在邮局中直接收信和发信
转换专业术语的图
进程间,用户空间的数据不可共享(本地邮局是男孩或女孩独有),因此用户空间至关于私有空间。
进程间,内核空间的数据可共享(全国邮局是全部人共有),因此内核空间 至关于公共空间。
进程间若是须要作到通讯,须要经过共享空间对数据转换。转换过程须要调用系统的api,这个过程称为系统调用。
问题来了:
男孩写好信以后,发送信件给本地邮局 , 至关于一次拷贝 咱们把这个过程称为(copy_from_user)
女孩收到当地邮局通知,须要从本地邮局取信。至关于第二次拷贝,咱们把这个过程称为(copy_to_user)
这就是Linux已有进程间通讯方式。
两次拷贝究竟性能怎么样,固然拷贝是很是耗性能的,而两次拷贝能够再优化优化。
那binder是怎么作到一次拷贝的呢
后来在疫情结束后,这个女孩去了全国邮局依赖的快递公司上班去了,全部的信封须要用快递公司来处理,恰好这家快递公司处理的是他们两个城市的信件。
为了方便收信封,竟然还有这操做
这就给女孩创造了便利,不用去本地邮局取信件
可是男孩仍是要发送信件。binder拷贝也是发生在男孩这个地方copyfromuser,女孩因为在快递公司上班,能够随意浏览男孩的信件。不须要再取信件了。也就减小了从本地邮局取快递此次拷贝过程
思考: 你们还记不记得接收端怎么写的,对! 接收端必定必须是服务Service,接收端不能是其余java对象。Service就是那个女孩。她必须在快递公司上班才能减小一次拷贝。因此这个Service,在通讯前会注册在ServiceManager中。而男孩能够是任意对象,出如今任意地方。
Linux 已有的进程通讯,发送端和接收端能够是任意对象。出如今任意类中。可是必须牺牲多拷贝一次
Android的Binder通讯,接收端不能是任意对象,只能是Service,这也节约了一次拷贝,牺牲了开发者的体验
全国邮局 至关于内核空间的内存,全部的应用都与内核空间的内存发生频繁的调用,在Binder中传递数据本质上是经过文件读取来实现的
你们记不记得Linux系统 是文件操做系统,都是基于文件展开的。进程通讯中 File也能实现进程通讯
Binder机制中 在内存与文件中设计了一层映射关系。内核空间的内存是虚的,文件IO是实的。映射指的是内存与文件的映射,映射是经过mmap函数。
而mmap函数 须要依赖一个文件,这个文件叫作“binder”。对!他没有后缀名,他就是一个文件。可是人们习惯性的把它称为binder驱动。
咱们再来看看实际的是如何映射的
全国邮局中的A城与B城的信件,至关于内核空间内存一部分虚拟内存区域。
A城与B城的快递公司,至关于文件实体。实际信封是由快递公司转发。邮局与快递公司的合做关系,能够理解内存与文件造成了映射关系(mmap)
一旦有信件到达女孩的公司直接读取出来,而不用去本地邮局取信件。
女孩怎么在公司取出来呢?你们忘记了女孩在快递公司上班呢,快递公司会给员工布置工做内容
女孩的工做内容是查看快递接收站和发送站的信封
这样你说能不能看到男友发过来的信件,还不用亲自跑到本地邮局,那不是爽歪歪
绿色部分 是女孩进程,绿色内有两个角色(女孩接触到的 接收站和收发站)
这一套机制的实现基于 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进阶视频
B站帐号:bili_84936792704 但愿资料加视频能够提升你们学习的效率。