十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Binder纯理论分析

Binder纯理论分析 今天的主要是来对Binder做一个较全面的介绍为之后的深入分析做一个预热准备。Linux IPC首先Binder是Android中的一种独有的跨进程通信方式简称IPC。它是专门为Android平台设计的。那为什么要设计出Binder这个烦人的东西呢我们都知道Android是基于Linux系统进行演变过来的所以理应也能直接使用Linux的IPC通信方式。所以在理解Binder的设计初衷之前我们先来了解一下Linux系统中现有的IPC通信方式。Linux现有的IPC通信方式有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种分为可靠信号与不可靠信号多用于消息传递与通知不适合传递信息。共享内存共享内存顾名思义允许不同的进程访问同一块内存地址空间它也需要进行两次数据拷贝操作分别是将数据拷贝到共享内存中又从共享内存中间将数据拷贝出来。但需要注意的是共享内存是不提供同步机制。意思就是说在其中一个进程进行写操作时并不能放在另一进程进行读操作。为了解决这个问题共享内存一般都与前面说的信号量一起使用。消息队列消息队列通过一个进程向另一个进程发生消息块的方式进行通信它与管道非常类似都需要发送与接收数据拷贝两次。不同点是消息队列可以防止同步与阻塞问题。消息队列的接收方可以进行选择性接收。发送的消息块有最大限制socketLinux中的socket是基于C/S架构的传输效率低多用于跨网络与跨设备的通信。在Android底层使用socket来进行init与zygote等进程间的通信。最后简单的来看一张图来了解在Linux中不同进程中的通信过程。所以通过上面的分析Linux现有的几种IPC通信方式都不是很适合Android间的进程通信。例如管道、共享内存与消息队列都需要拷贝两次数据同时有的还会存在阻塞与同步问题另外的信号、信号量与socket由于使用场景的原因都不适合用于Android中快速的进程间的数据通信。Binder那么Binder通信方式是怎么样的呢Binder本身是基于C/S架构的层次分明架构稳定同时Binder内部只需使用一次数据拷贝操作就能达到进程间数据的通信另外Binder还支持鉴别用户进程的Uid,为Android提供身份的验证。我们先来通过一张图来简单看下基于Binder的进程通信过程Binder数据通信流程是将数据从client端拷贝到内核空间在内核空间中会提前通过mmap方式建立与server端的内存地址映射通过内存地址映射server端可以直接访问内核空间中的数据从而避免将数据拷贝到server端提高进程间的通信速度。在整个通信的过程中主要做的事情是通过/dev/binder打开binder驱动通过mmap建立内存地址映射通过ioctl与binder驱动交互进行数据传输client使用BpBinder的transact方法进行事务请求server使用BBinder的onTransact方法来接收相应的事务由于Android中主要使用Binder来进行service的注册与获取所以为了更好的管理service的注册使用了ServiceManager来进行统一管理service的注册。在service的注册过程中ServiceManager就相当于server端内部开启loop循环不断接收消息将注册的service保存到注册表svclist中。最终关于Binder的整个大致流程如下图所示其中client与server位于应用层ServiceManager位于用户空间binder驱动位于内核空间。对于开发者来说用户空间与内核空间是透明的我们只需关注应用层client与server的实现就可以方便的使用Binder的通信机制。以上是对Binder的一个理论分析接下来的一段时间我将结合源码来分析service的注册过程从而探索Binder的整个工作流程感兴趣的读者可以关注一下。更多Android进阶指南 可以扫码 解锁《Android十大板块文档》1.Android车载应用开发系统学习指南附项目实战2.Android Framework学习指南助力成为系统级开发高手3.2023最新Android中高级面试题汇总解析告别零offer4.企业级Android音视频开发学习路线项目实战附源码5.Android Jetpack从入门到精通构建高质量UI界面6.Flutter技术解析与实战跨平台首要之选7.Kotlin从入门到实战全方面提升架构基础8.高级Android插件化与组件化含实战教程和源码9.Android 性能优化实战360°全方面性能调优10.Android零基础入门到精通高手进阶之路敲代码不易关注一下吧。ღ( ´ᴗ )
返回列表