美文网首页
[083]Binder答疑解惑(一)

[083]Binder答疑解惑(一)

作者: 王小二的技术栈 | 来源:发表于2023-09-06 00:31 被阅读0次

问题

为什么已经有了管道等跨进程通信方式,却要另外创建Binder方式?直接在原来的跨进程方式上面修改,不是更加方便吗?

一、跨进程通信共性

跨进程通信就是两个进程之前的数据传递。

如何才能跨进程通信?

我能想到最简单的跨进程通信就是在sdcard目录下创建一个文件1.txt,然后应用A写数据,应用B读数据。

这里抽象出,任何跨进程通信绕不开的两个关键的共性问题:

1.找到一片两个进程都可以访问数据存放区域

例子一中数据存放区域就是磁盘

2.让两个进程在事先无法通信的情况下,按照某种约定对这个数据存放区域进行读写

例子二中约定就是应用A写sdcard/1.txt,应用B读sdcard/1.txt

二、匿名管道(pipe)

共性问题1:
进程间的内核共享内存区域

共性问题2:
由于匿名管道只能通过父进程fork子进程的时候让两个进程分别持有pipe的两端fd,然后分别读写fd进行通信,所以匿名管道不适合跨进程通信,无法通过约定让两个没有关系的进程进行跨进程通信

三、实名管道(fifo)

实名管道解决了共性问题2,如何进行简单的约定,这个约定就是约定pathname,然后分别读写。
例如应用A和应用B约定实名的管道分别是./A_B和./B_A,这样子就可以让应用A和B分别读写了。

四、Socket通信

localsocket也是约定类似的pathname,然后通过socket的文件的读写进行通信。
网络socket通信就是约定了ip地址,双方需要实现约定某个ip地址或者端口。

约定某个ip地址,例如访问某个网站,就是约定dns服务器,然后访问dns服务器ip,传递网址返回要请求的ip,获得实际要访问的ip,在进行ip的访问,当然还有对应的tcp/ip的协议栈了,这些都是约定。

约定某个端口,就是类似someip的协议,约定双方要监听的端口是30490,然后具体的约定就是someip的协议和网络协议栈。

可以参考我之前的文章
https://www.jianshu.com/p/8af6ea33a6db

怎么有点奇怪的感觉

好像已经有人干了在原来的跨进程方式上面修改,然后形成跨进程通信的方案了。那就是someip,基于socket通信开发的。

五、只有Binder能做到的事

5.1 一次拷贝-性能

前面所有讲的跨进程通信方式都是两次拷贝,需要从用户态到内核态,内核态到用户态两次数据拷贝。只有重新写驱动才能实现一次拷贝。

5.2 fd的传递

fd的传递不是简单的fd数字的传递,而是新的fd对应file结构体在对端关联。会有人说,那传递fd对应的文件路径,重新打开不就行了,但是此fd是linux中一切皆文件的概念,很多fd并不一定会有文件路径对应。现有的跨进程通信无法做到。而且重新打开文件路径,会创建一个新的file内核结构体,读写指针无法共享。

参考我之前的文章
https://www.jianshu.com/p/0f300d539ff5

5.3 远程转本地

如果发现最后被请求的进程和发起请求的进程是同一个进程,如何高效的通信犹如函数调用一样。

参考我之前的文章
https://www.jianshu.com/p/740f1ee32fd1

5.4 线程栈复用

如果发现A请求B,B请求C,C又请求A,如何利用A请求B时候休眠的线程进行C的响应,减少线程资源的浪费。

参考我之前的文章
https://www.jianshu.com/p/b1b749b4ea8b

小结

以上的几个功能都很难利用现有的跨进程通信的方式,二次开发实现,因为二次开发只能在用户态了。为什么Binder要实现上述这几个功能,我猜是因为刚开始的时候移动端性能差,内存紧张,对现有跨进程通信的性能要求高,以及大规模进程之间通信管理难度加大要求,从而萌生了重新从驱动开始写一套跨进程通信机制的想法,当然不是从零开始思考的,我认为作者在用户态的通信协议,有点参考了JavaRMI思想,因为javaRMI是在1998年发布的,Binder应该比它晚,后面2011年发布的someip我猜也或多或少借鉴了JavaRMI的思考。

六、Binder的缺点

Binder那么好用也没有用在车上?

因为Binder暂不支持跨芯片通信,汽车上更多的是跨设备通信和跨进程通信混合,有可能某个需求一变,原本只需要跨进程通信要变成跨芯片通信了,这样子代码就需要重新写了,如果用someip就不一样,只需要把服务部署到别的芯片,代码基本不用动,当然Binder也在慢慢支持基于网络的通信。

七、Android中丰富多彩的跨进程通信

Binder 三大定律

1.通过IBinder对象(Binder或者BinderProxy)可以调用Binder对象的接口
2.通过Binder接口可以传递基础数据,IBinder,FD
3.世界上第一个Binder对象就是SM

Binder支持fd的传递

socket,pipe,ion可都是基于fd,Binder成为了这些跨进程通信的fd对象的媒介,从而形成了丰富多彩的跨进程通信
pipe-vsync信号
socket-inputchannel
ion-surface对应的某个buffer

总结

本文的内容可能跳跃的比较厉害,但是其实是我对Binder通信的一些心得体会,有些内容可能你一下子无法理解,但是我相信你真的搞懂Binder后,再回过来我这篇文章,应该会认同的我的观点。

尾巴

这个问题其实也没有完美的答案,有时候思考问题的过程,比得到问题的答案更重要。

相关文章

  • 答疑解惑一

    问题:很烦躁,功课做不下去,怎么处理? 回答:在我们起起落落的,内在的很多情绪很多感受当中,有不少感受是很抓狂的,...

  • 2019-01-11-福君老师答疑解惑后感

    福君老师答疑解惑后感 福君老师答疑解惑图1 福君老师答疑解惑图2 我的问题:人力资源学习训练营,我作为四组的小组上...

  • 答疑解惑

    问题1 我是在省会城市有5家餐饮店,每个月会有25万左右的流动资金,这部分资金会在年底的时候支付房租和其他的部分物...

  • 答疑解惑_

    伙伴们,早上没听到禹妃班主任的课,简要记录供没听到伙伴们学习: 困惑执行力不强,早上起不来的情况: 1早晨起来用舒...

  • 答疑解惑

    如果你的医保在医院用不了,可能的原因:1、你的信息未录入医保系统;2、你的医保系统(身份)信息错误;3、提...

  • 答疑解惑

    1,孩子在学校的学习已经很紧张了,没有时间读经典,您说读了经典对识字很好,可我家孩子读了经典并没有提高他的认字水平...

  • 答疑解惑

    农历:七月十二 星期一 天气:晴 气温:27~38 学习内容:1、含德之家YY语音频道学习。 2、含德之家微信群...

  • 答疑解惑

    燕教授有什么好?这是自己问过自己的问题,也是顾客一来会问的问题。 燕教授的好太多,首先我看中的是它的安全,哺乳期小...

  • 答疑解惑

    1.替代法:用鼓励代替惩。比如孩子上课不能认真听讲,爱做小动作,就可以跟孩子一起去买一个笔记本,告诉孩子,如果...

  • 答疑解惑

    今天老首长在群里发了个疑难解图,我冒昧试解一下,倘若有误请指正。 题图如下: 其实並非难解,只需步...

网友评论

      本文标题:[083]Binder答疑解惑(一)

      本文链接:https://www.haomeiwen.com/subject/cntkvdtx.html