更多问答 >>
-
2019-12-04 00:18
-
每日一问 Android 签名机制 v1 v2 v3 , 卧槽都 v3 了?
2019-12-09 23:52 -
2019-12-15 23:55
-
2019-12-20 00:08
-
每日一问 Activity 都重建了,你 Fragment凭什么活着?
2019-12-23 23:19 -
2019-11-26 00:12
-
2019-11-22 00:10
-
每日一问 | Kotlin 中不需要写“ ; ”,但是有个场景意外?
2019-11-22 00:12 -
每日一问 | 控件不都是矩形么?遇到多边形,这个怎么绘制,事件分发怎么处理嘞?
2019-11-13 01:08 -
2019-11-08 23:06

老哥,你的回答简直棒极了
第一条说反了吧,看 init.rc 脚本里,servicemanager 明明是在 zygote 之前启动的
Zygote是通过fork生成进程的,而多线程是不允许使用fork,可能造成死锁,同时Binder又是多线程的,所以就干脆不用Binder转而使用socket了
老哥,这里不是讨论的多进程吗?
进程通过fork生成的能了解? fork不允许多线程能了解?fork限制住了不能使用Binder。
听你这么一说,似乎立马懂了。抱拳!
这个角度不成立,SM 使用 Binder,但没有使用 libbinder 而是自实现的 Binder 通信,这也是单线程模型。Binder 和 单线程,并不冲突。 同时 Zygote 也并非单线程,它 ...查看更多
这个角度不成立,SM 使用 Binder,但没有使用 libbinder 而是自实现的 Binder 通信,这也是单线程模型。Binder 和 单线程,并不冲突。 同时 Zygote 也并非单线程,它还有一些守护线程,只是在 fork 前先停止,fork 后又恢复了。
搞一下午代码没让你给我整蒙圈了 。。。你这说的是啥玩意。。了解下fork下和binder的冲突先
你说的SM啥玩意,ServiceManager ?我感觉你对它有误解吧,ServiceManager不用binder用什么。实际上ServiceManager应该更名为BinderManager 。 ...查看更多
你说的SM啥玩意,ServiceManager ?我感觉你对它有误解吧,ServiceManager不用binder用什么。实际上ServiceManager应该更名为BinderManager 。。。
别激动。我理解你的意思是“因为 Binder 是多线程模型,而 fork 一个多线程的进程会造成死锁,所以 Zygote 不能使用 Binder”,对吧?我们就基于这个结论讨论。 1. Binder ...查看更多
别激动。我理解你的意思是“因为 Binder 是多线程模型,而 fork 一个多线程的进程会造成死锁,所以 Zygote 不能使用 Binder”,对吧?我们就基于这个结论讨论。 1. Binder 和单线程并不冲突。例如 ServiceManager 使用的 Binder 就是自己实现与驱动通信的一套逻辑,而非使用主流的 libbinder 库,代码在同目录的 binder.c 中,ServiceManager 就是单线程的 Binder 模型,对外提供服务。 2. Zygote 也不是单线程。Zygote 还有 4 个守护线程,例如 HeapTaskDaemon、ReferenceQueueDaemon 等,这些在 fork 前会先停止,fork 后又恢复。这个你可以看下 Zygote 的 forkAndSpecialize() 方法,先 perFork() → fork → postForkCommon() 恢复。 那么如果我们不采用存在即合理的先决条件去看问题,"Zygote 已经用 Socket 实现了,所以它是合理的",然后去找合理的原因。如果换个思路,如果一定要用 Binder 实现,可行吗?ServiceManager 的 handler 固定为 0,所以其他进程可以直接找到它,如果 Zygote 也参照 ServiceManager 的实现,用单线程启动后不断 loop,也弄个固定的特殊 handle,例如1024,其他进程基于 1024 去找 Zygote,这样 Zygote 无需去 ServiceManager 中注册,是否也可行?当然这些 fork 后肯定也伴随着一些清理工作,这个是没法避免的。
fork不能在多线程中使用是设计准则。 真要尝试用binder会发现根本就通不了信。 ServiceManager的作用是添加和查找binder server,可以说也不是用binder通信,是个调制 ...查看更多
fork不能在多线程中使用是设计准则。 真要尝试用binder会发现根本就通不了信。 ServiceManager的作用是添加和查找binder server,可以说也不是用binder通信,是个调制解调器的作用。 我要是说服不了你,你去看看UNIX上C++程序设计准则吧,第几条记不清了。 如果你觉得对应那条准则没啥用或者觉得可行,那你实现出来吧,大家都会认识你。
因为zygote 没有启动binder啊,为啥不启动binder呢,因为zygote是android系统的受精卵进程。必须保证单线程,因为linux 使用fork函数创建一个进程时,如果进程中存在多个线程时 由于copy on write 机制,可能会死锁。