Binder

丶灬走出姿态 提交于 2020-03-23 09:33:11

3 月,跳不动了?>>>

Binder是IPC(进程间通信)方式的一种

为啥要用多进程呢?

    每个应用占有单独的进程,虚拟机给每个应用分配的内存的有限的,也就是分配给每个进程的内存是有限的,如果我们把所有功能都放在一个进程中,向下载,加载大图片等很消耗内存,很容易造成主进程的内存耗尽,导致oom,所以可以另起一个进程来处理这些操作,并且在新的进程中,即便这些操作出bug了,也不会影响主进程运行

进程间如何通信的?

    首先进程间是不能直接通信的,每个应用也就是进程分为用户空间和内核空间,用户空间之间是隔离的,但是内核空间是相通的,所以我们就可以将数据从用户空间A先传到内核空间,然后从内核空间再把数据传递到用户空间B进行接收,这样就形成了进程间的数据传递,也就是通信了

在binderservice时候,传递的第二个参数ServiceConnection中,asInterface, 这时候会调系统给生产的aidl文件中Proxy

这个Proxy类就是传递数据的,进入这个类里,就会看到我们自己写的aidl中的方法,我这里是addinfo

而通过Proxy中transcat方法将数据传递进binder,在binder中又会调用ontranscat中addinfo ,一调用这个方法这时候就会进入到服务端的stub中,stub是接收数据

一调这个addInfo就会调服务端的

这就形成了通信

Binder相比socket性能较好,相比共享内存较差, 因为Binder是一次拷贝,socket是两次,共享内存不拷贝

拷贝是指 数据传递时,从用户空间调用copy_from_user将数据拷贝到内核空间,或者从内核空间调用copy_to_user到接收数据的用户空间

而Binder只有拷贝到内核空间的一个拷贝,在内核空间中有内存映射,mmap将虚拟内存和接收数据的用户空间映射了一块物理内存,所以不需要再次拷贝,直接映射到用户空间接收

共享内存是传输数据的用户空间,binder和接收数据的用户空间三者形成一块映射空间,直接将数据放进去,所以无需拷贝了

socket是没有映射,用户空间拷贝到binder,binder又拷贝到用户空间接收,所以是两次拷贝

binder中系统会为每个app分配pid,所以会更加安全,而socket是依赖共享协议的,将pid打包进数据包中,然后发送给对方,这个pid是app控制的,系统不知道,不安全

理解的较为浅显,后续继续深入

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!