systemserver为什么与zygote通过sock…

systemserver为什么与zygote通过socket通信,而不是binder,想知道一个满意的答案。[坏笑]

程序猿.欧鹏:双向

程序猿.杨铁心:这个有趣的。曾经面试被问过,两种观点。1 fork只支持单线程的拷贝 如果使用binder那么会造成已有的zygote进程信息不可用。2 只有binder驱动在内核空间,zygote和servicemanager是同时在framework层面初始化的,binder通信是需要server的 所以使用binder可能是不成功的

程序猿.杨铁心:又去查了下资料 觉得这个讲的不错 https://taou.cn/j0mjc

程序猿.杨铁心:这里第二点有问题

程序猿.猴王:M

楼主:copy on write呢?

程序猿.杨铁心:没懂你意思

蚂蚁金服员工:m

程序猿.骗了自己四年的二:这个问题很有意思,一下子把我问懵了,回答有个链接说了,是怕多线程中使用binder的时候有锁,fork会造成死锁

楼主:知乎上的解释,觉得合理吗,各位

楼主:原因是因为fork只能拷贝当前线程,不支持多线程的fork。如果zygote使用binder的多线程模型与system_server进程进行通讯的话,fork()出的App进程的binder通讯没法用,那么只能再使用exec()启动一个新进程。

楼主:但是exec()启动的新进程不再包含zygote进程的信息,那这样的就失去了fork的作用了,fork的原理就是copy-on-write机制,zygote进程中已经启动了虚拟机、进行资源和类的预加载以及各种初始化操作,App进程用时拷贝即可。所以最终zygote采用的方案就是socket + epoll,然后fork出子进程后再在子进程中启动binder线程池

网易云音乐员工:你们都这么精通吗。。。感觉我好菜啊

新浪员工:m

楼主:去抖音快手面试都问到了[冷汗]

网易云音乐员工:应用层也要问这么深吗。。你是几年经验

楼主:是啊,5年。

程序猿.欧鹏:Lmk 需要监听AMS传递来的消息,里面也是用的locksocket,所以我个人感觉主要是监听和双向通信,加上它可以跨java到native

程序猿.雷横:卧槽,我做系统应用锁屏都没想过这个问题。

程序猿.少林弟子:这个是不是从binder通信机制的原理和作用结合systemserver 和 zygote 的作用来分析?binder机制是Android OS 所特有的进程间通信机制,借鉴于 OpenBinder,为了解决移动设备进程间通信问题,高效、安全。而Android是基于Linux内核来实现的,因此,在binder通信机制正式起作用前,进程间的通信应该还是采用的传统的进程间通信机制,比如socket。

程序猿.少林弟子:当然,此时应该从Android OS启动过程结合源码分析(zygote, systemserver, binder)来看。而三者的关系、各自的作用、先后顺序、通信方式等从源码角度还需大佬来指导指导。

网易云音乐员工:我两年半,你说的这些我一点学过[笑哭]

程序猿.萧让:m

程昱:m