每日一题:SystemServer进程为什么要在Zygote中fork启动,而不是在init 进程中直接启动

506 阅读3分钟

在android面试中,我们常会遇到Framework面试相关问题,而今天要分享的就是SystemServer进程为什么要在Zygote中fork启动,而不是在init 进程中直接启动

其主要考察的是程序员对fork的理解以及对zygote进程的价值的理解。

问题正解:

首先我们分析什么是fork,然后再分析zygote fork并启动进程和 init启动进程的区别。

fork()机制

一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间,然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同,相当于克隆了一个自己。

所以fork()机制执行后会得到一个新进程,这个过程具有下面的特点:

1)这两个进程代码一致,而且代码执行到的位置也一致;

2)区别是进程ID(PID)不一样;

3)一次调用,两次返回。父进程返回的是子进程的PID,从而让父进程可以跟踪子进程的状态,以子进程PID作为函数参数,子进程返回的是0。

SystemServer进程的孵化和启动为什么在Zygote进程,那么我们就需要知道zygote进程做了哪些事,而这些事情是SystemServer进程需要的,而且在init进程中没有的。

总结

通过上面问题中关于《zygote进程的启动流程》的回答,大家不难发现Zygote 作为一个孵化器,可以提前加载一些资源,这样 fork() 时基于 Copy-On-Write 机制创建的其他进程就能直接使用这些资源,而不用重新加载。比如 system_server 就可以直接使用 Zygote 中的 JNI函数、共享库、常用的类、以及主题资源。然而,init进程缺没有这些资源提供,所以不能用init进程创建SystemServer。

今日分享到此结束,下期更精彩~

关注公众号: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零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔