在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的等锁状态。这就会出现子进程一创建,天生的就在等待线程锁,而这个锁缺没有地方去帮它释放,子进程一直处于等待锁的状态。
今日分享到此结束,下期更精彩~
关注公众号:Android老皮
解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版
内容如下:
1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路
敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) ?