每日一题:Zygote 为什么不采用Binder机制进行IPC通信呢?
在android面试中,我们常会遇到Framework面试相关问题,而今天要分享的就是Zygote 为什么不采用Binder机制进行IPC通信呢?
其主要考察的是程序员对binder的理解和zygote fork的理解。
问题正解:
这个很重要的原因是如果zygote采用binder 会导致 fork出来的进程产生死锁。
在UNIX上有一个 程序设计的准则:多线程程序里不准使用fork。
这个规则的原因是:如果程序支持多线程,在程序进行fork的时候,就可能引起各种问题,最典型的问题就是,fork出来的子进程会复制父进程的所有内容,包括父进程的所有线程状态。那么父进程中如果有子线程正在处于等锁的状态的话,那么这个状态也会被复制到子进程中。父进程的中线程锁会有对应的线程来进行释放锁和解锁,但是子进程中的锁就等不到对应的线程来解锁了,所以为了避免这种子进程出现等锁的可能的风险,UNIX就有了不建议在多线程程序中使用fork的规则。
在Android系统中,Binder是支持多线程的,Binder线程池有可以有多个线程运行,那么binder 中就自然会有出现子线程处于等锁的状态。那么如果Zygote是使用的binder进程 IPC机制,那么Zygote中将有可能出现等锁的状态,此时,一旦通过zygote的fork去创建子进程,那么子进程将继承Zygote的等锁状态。这就会出现子进程一创建,天生的就在等待线程锁,而这个锁缺没有地方去帮它释放,子进程一直处于等待锁的状态。
作者:派大星不吃蟹
链接:https://juejin.cn/post/7251857574526451770
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://juejin.cn/post/7251857574526451770
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。