当前位置: 首页 > Linux

Linux自带多种进程通信方式,为什么Android都没采用偏偏使用Binder通信

时间:2023-04-06 22:56:45 Linux

Linux自带多种进程通信方式。为什么Android不使用Binder通信?一个目录,更多内容正在编辑中面试官:linux自带多种进程通信方式,为什么Android不用它而是用Binder通信心理分析:面试官绝对不会让你分析binder的源码spot,而且源码也很深很广,没有哪个面试官会傻到让你把binder的所有机制都分析一遍。他会问你为什么不用linux。从这个地方你会看到你在活页夹里有多深。这个问题通常是高级Android面试的必答题。所以求职的朋友们需要格外注意:要从linux自带的进程通信入手。然后各自突破,指出Android这种特殊系统的不足之处。最后,将Binder的优点介绍到Linux现有的所有进程间IPC方法中:1.管道:什么是管道:管道可以用于具有亲和性的进程之间的通信。管道是由内核管理的缓冲区,相当于把它放在内存中的一个注解。管道的一端连接到进程的输出。此过程将消息放入管道。管道的另一端连接到一个进程的输入,该进程获取放入管道的信息。一个缓冲区不需要很大,它被设计成一个循环的数据结构,这样流水线就可以循环使用。当管道中没有消息时,从管道中读取的进程会一直等待,直到另一端的进程放入消息。当管道充满消息时,试图放入消息的进程会一直等待,直到另一端的进程收到消息。当两个进程都终止时,管道自动消失。缺点:创建时分配管道时,缓冲区大小相对有限;不适合Android2中大量进程通信。消息队列:消息队列提供了一种从一个进程向另一个进程发送数据块的方式。每个数据块都被认为有一个类型,接收进程可以独立地接收包含不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列和命名管道一样,每个数据块都有最大长度限制。缺点:信息被复制两次,额外的CPU消耗;不适合频繁或大量的信息交流;3、共享内存:什么是共享内存:顾名思义,共享内存就是让两个不相关的进程访问同一逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常被安排为同一块物理内存。进程可以将同一块共享内存连接到自己的地址空间,所有进程都可以访问共享内存中的地址,无需复制,共享缓冲区直接依附于进程虚拟地址空间,速度快;缺点:通信需要复杂的设计机制保证各个进程之间通信的有效性。进程间的同步问题,操作系统无法实现,每个进程必须使用同步工具来解决;安全问题比较突出,如果Android使用Binder,无异于把每个App都放在一个内存里,很不安全4.SocketWord:作为一个比较通用的接口,传输效率低,主要用于用于机器之间或跨网络的通信;5.信号量:常被用作锁机制,在一个进程正在访问共享资源时,防止其他进程访问该资源。因此,它主要用作进程之间以及同一进程中不同线程之间的同步手段。6、Signal:不适合信息交互,更适合进程中断控制,比如非法访问内存,杀死某个进程等;那么正面回答这个问题,从5个角度分析Binder:(1)从性能的角度,数据副本的数量:Binder数据副本只需要一次,而管道、消息队列、socket都需要两次,但共享内存方式不需要内存副本;从性能上看,Binder性能仅次于共享内存。(2)从稳定性的角度:Binder是基于C/S架构的。简单解释C/S架构是指由客户端(Client)和服务器(Server)组成的架构。发送到服务端完成,结构清晰明了,服务端和客户端相对独立,稳定性好;而共享内存的实现比较复杂,但客户端和服务端没有区别,需要充分考虑访问关键资源的并发同步,否则可能会出现死锁等问题;从这个稳定性的角度来看,Binder架构优于共享内存。仅从以上两点来看,各有优缺点,不足以支持Google采用Binder的IPC机制。更重要的原因是:(3)从安全的角度来看:传统LinuxIPC的接收方无法获得对方进程的可靠信息。UID/PID使得无法识别对方身份;Android作为开源系统,开发平台众多,App来源广泛,手机的安全性显得格外重要;对于普通用户来说,绝对不想从应用商店下载传统的LinuxIPC对于偷窥隐藏数据、后台造成的手机耗电等没有任何保护措施,完全由上层协议保障.Android为每一个安装的应用程序都分配了自己的UID,所以进程的UID是识别进程身份的重要标志。上面说了,C/S架构在Android系统中只暴露了客户端,客户端发送任务到服务器端,服务器端会根据权限控制判断UID/PID是否满足访问权限战略。目前权限控件往往采用弹出权限查询对话框的方式让用户选择是否运行。Android6.0,也就是AndroidM,6.0之前的系统在第一次安装App的时候会一次性询问整个App涉及的所有权限。只要注意一下,你就会发现很多App根本就不用通讯录和短信,但是会包含在这个一次性权限权限里面,让用户无法拒绝,因为拒绝之后app就不能正常使用了,而且一旦授权,app就可以做任何错事了。针对这个问题,谷歌在AndroidM中做出了调整,不再在安装时询问所有权限,而是在应用运行时弹出一个框询问用户是否给予相应的权限,并做了对权限的更改。精细化的控制给了用户更多的可控性,但同时也带来了另一个让用户诟病的地方,那就是权限查询的弹框明显增多。针对AndroidM平台,一些应用开发者可能会编写让手机频繁异常弹出的应用,企图等待用户授权。部分用户可能成为安卓系统和手机厂商的粉丝。这需要广大安卓开发者和手机厂商的共同努力,共同打造安全性和体验极佳的安卓手机。传统IPC中,用户只能在数据包中填写UID/PID;另外,可靠的身份标记只能通过IPC机制本身在内核中添加。其次,传统IPC接入点是开放的,无法建立私有通道。从安全的角度来看,Binder更安全。说到这里,可能有人要反驳了,就算Android采用了Binder架构,现在Android手机上的各种流氓软件不就是在后台做这种偷窥、偷流量的事情吗?是的,确实存在,但这并不代表Binder的安全性不好,因为Android系统还是有总控的,可以控制这类App的流氓行为,但是应该用什么策略来控制.确实有很大的改进空间,这也是谷歌和各大手机厂商一直在努力改进的地方之一。在Android6.0中,谷歌在应用权限上做了更多的努力,大大收紧了应用权限;此外,在谷歌举办的AndroidBootcamp2016大会上,谷歌还表示,在Android7.0(也称AndroidN)的权限隐私方面进行了加固,比如SELinux、Memorysafelanguage(仍在研究中)等,来自今年5月18日到5月20日,谷歌将推出AndroidN。话题扯远了,我们继续说说Binder。(4)从语言层面来看:大家都知道Linux是基于C语言(面向过程语言),Android是基于Java语言(面向对象语句),Binder也符合面向对象的思想。相互通信通过对对象的引用转换为调用Binder对象的方法,其独特之处在于Binder对象是一个可以跨进程引用的对象。它的实体位于一个进程中,但它的引用却遍布在系统的各个进程中。它可以从一个进程传递到另一个进程,这样每个人都可以访问同一个Server,就像将一个对象或引用分配给另一个引用一样。Binder模糊了进程边界,淡化了进程间通信过程,整个系统仿佛运行在同一个面向对象程序中。从语言层面来说,Binder更适合基于面向对象语言的Android系统,对于Linux系统可能有点“水土不服”。另外,Binder是为Android等系统而生的,并不是Linux社区没有想到BinderIPC机制的存在。依然对Linux社区的广大开发者表示深深的敬佩,让世界拥有如此精湛而精彩的开源系统。并不是说Linux现有的IPC机制不够好。相反,经过这么多优秀的工程师不断打磨,还是很不错的。每一种LinuxIPC机制都有其自身的价值。同时,Android系统中仍然大量使用Linux。现有的IPC机制,根据每一种IPC的原理和特点,适应当前的情况,往往针对不同的场景特点采用最合适的。比如AndroidOS中Zygote进程的IPC使用的是Socket(套接字)机制,Android中的KillProcess使用的是signal(信号)机制等等。Binder更多的用在system_server进程与上App层IPC的交互中。(5)从公司战略来看:众所周知,Linux内核是一个开源系统,受开源代码许可协议GPL保护,具有“病毒感染”的能力。怎么理解这句话?受GPL保护的Linux内核在内核空间中运行。任何运行在上层用户空间的类库、服务、应用程序等,一旦进行SysCall(系统调用)调用底层Kernel,也必须遵循GPL协议。而安卓之父安迪·鲁宾显然不能接受GPL。为此,谷歌巧妙地在内核空间控制了GPL协议,而用户空间协议则采用了Apache-2.0协议(允许基于Android的开发者不向社区反馈源代码。),同时同时,GPL协议与Apache-2.0之间的Lib库采用了BSD许可授权方式,有效地切断了GPL的传染。争议还是很多,但至少现在,Android松了一口气,GPL停在了内核空间。是谷歌在GPLLinux下开源与商业化并存的成功范例。有了这些铺垫,我们再来说说Binder的现代前沿。Binder基于开源的OpenBinder。OpenBinder是一种开源系统IPC机制。它最初由BeInc.开发,后来由Palm,Inc.开发,现在OpenBinder的作者在谷歌工作。由于作者在谷歌,所以在用户空间采用Binder作为核心IPC机制,然后使用Apache-2.0协议进行保护。自然没有问题,而且降低了法律风险,也有利于开发成本,那么从公司战略的角度来看,Binder也是一个不错的选择。另外,稍微说说OpenBinder。2015年,OpenBinder被集成到LinuxKernel主线3.19版本中。这也算是Google对Linux的一点回馈。综合以上5点可以看出Binder是Android系统上层进程间通信的最佳选择。如果需要文章开头整理的面试目录中的资料+下面的视频教程,请加入我的QQ交流群:892872246