请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

binder和socket

1、binder和socket的区别是什么啊
2、为什么SystemServer和应用通信用binder,而与zygote通信要用socket呀

正在回答

1回答

同学你好,很好的问题。

第一个问题,binder和socket的区别:

socket是一种通信方式。服务端先建立监听,客户端再向服务端发起请求,最后确定链接建立,是一种相对轻量级的跨进程通信方式。

binder是Android中四大组件之间的跨进程通信方式。基于共享内存的机制,通信时要先启动binder机制,打开binder驱动,获得描述符,进行内存映射,接受方需要开启binder线程、通过无线循环等待任务。发送方要找的目标进程,向任务队列插入任务,完成通信,相对来说准备工作比较繁琐。

第二个问题,为什么system_server和zygote之间不使用binder通信:

第一个原因,就像上一个问题中说的,socket相对比较轻量级,system_server通知zygote创建系统进程这个场景,比较单一和简单,所以socket足以胜任。

第二个原因,zygote进程自身并没有启动binder机制。system_server进程的binder机制,是在被zygote进程fork出来之后才启动的。zygote进程不去启动binder机制的原因,是因为如果提前启动了binder机制,子进程就会共用zygote进程的描述符和数据结构,这样就无法正常通信了。

第三个原因,为了避免多线程fork产生死锁,所以在fork这个操作执行时,会停掉其他线程,并且只把当前线程对应的内存拷贝到子线程。这就会导致binder机制无法工作,采用socket就不会受倒影响。

其实对于谷歌的工程师来说,这些问题如果一定要解决,都是可以解决的,选择socket,是一种综合考虑,用最合适的、成本最低的技术方案解决问题。




1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号