Zygote是什么

操作系统中,进程实际上是文件到地址空间的映射像。进程将要运行时,由操作系统将其映射到地址空间,完成这项工作的事物本质也应是一个进程,我们称这个进程为孵化进程,那么这个进程怎么收到消息创建新的进程呢?可以推测,在操作系统中应当存在一个全局监听创建新进程消息的监听进程,当它收到消息时,通知孵化进程进行孵化。在安卓中,负责孵化新进程的这个进程叫做Zygote,安卓上其他的APK进程都是由它孵化的。

世界的神

众所周知,安卓是Linux内核,安卓系统上运行的一切程序都是放在Dalvik虚拟机上的,Zygote也不例外,事实上,它是安卓运行的第一个Dalvik虚拟机进程。既然Zygote负责孵化其他的安卓进程,那么它自己是由谁孵化的呢?这个问题就像上帝创造了世界,那上帝是谁创造的呢?上帝一定是由我们这个世界之外,他自己所在的那个“新世界”的神所创造的。如果把安卓系统看做我们所在的这个世界,那么Zygote所在的那个“新世界”就是Linux内核,Zygote就是由Linux内核的“神”创造的,这个“神”就是Linux内核启动的用户级进程init,关于init这里不再讨论。

亚当和夏娃

上面的比喻将Zygote看做安卓世界的神,事实上,由于操作系统还需要一个监听创建新进程请求的进程,在安卓中,这个进程就是SystemServer,Zygote与负责监听新进程的SystemServer协同合作才能孵化APK进程,所以Zygote更恰当的比喻是亚当。

就像夏娃是由亚当身体里的一根肋骨创造的一样,SystemServer也是由Zygote孵化出来的第一个Dalvik虚拟机进程。SystemServer与Zygote都是一个程序在内存中映射的进程,这个程序就是app_process。

造人的过程

由于SystemServer与Zygote分属安卓操作系统中不同Davik虚拟机上运行的不同的进程,在安卓上不同进程之间通信是通过Binder机制来实现的(关于Binder的运行机制浅析在这里)。那么SystemServer与Zygote是不是分别有一个在需要孵化新进程时用于通信的Binder呢?就像亚当与夏娃分别有一个***用于造人。很遗憾的是,SystemServer与Zygote并不是通过Binder来进行通信的,而是利用更为原始的Socket传递消息,在SystemServer中有一个Socket客户端,Zygote中的Socket服务端负责接收孵化请求。

就像亚当和夏娃生出了许多孩子后,可能需要一个保姆来帮他们照顾小孩一样。安卓系统中有那么多运行中的进程,肯定需要有一个管家来帮助他们管理孵化出来的进程,这个管家就是AmS,事实上AmS的主要任务是负责管理Activity,兼职管理安卓系统的内存和运行中的进程。

下面将Zygote与SystemServer联合孵化新进程的大概流程梳理出来:SystemServer中负责管理进程的AmS利用Socket客户端向Zygote的Socket服务端发送创建新进程命令,Zygote收到命令后为APK创建进程ActivityThread,每个APK进程不仅有自己的数据资源和需要执行的代码,还与其他进程分享Android框架中通用的资源和代码,由于这些资源和代码是大部分APK都需要调用到的,并且比较重量级,所以安卓把它们都放在Zygote进程的空间中,当APK需要的时候就直接到里面去找就行了。

流程图如下:

------参考至《Android内核剖析》

最新文章

  1. ABP(现代ASP.NET样板开发框架)系列之14、ABP领域层——领域事件(Domain events)
  2. (转)JavaScript一:为什么学习JavaScript?
  3. Android开发学习总结(六)—— APK反编译
  4. ArcGIS使用Python脚本工具
  5. http请求详解
  6. ajax跨域请求,页面和java服务端的写法
  7. JSON对象配合jquery.tmpl.min.js插件,手动攒出一个table
  8. oracle函数、包、变量的定义和使用、重点”结构体和数组”
  9. Phantomjs安装
  10. cocos2d-x游戏开发系列教程-超级玛丽10-怪物与马里奥冲突检测
  11. 四、蛋炒饭(Egg fried rice)
  12. Linux filesystem
  13. 按照分层设计理念,完成《XXX需求征集系统》的概念结构设计
  14. Oracle 之 外部表
  15. java使用poi生成导出Excel(新)
  16. Js 百分比进度条
  17. 系统间通信——RPC架构设计
  18. Android Gradle 引入 aar 方式
  19. Gunicorn使用详解
  20. java三方---->dom4j解析xml数据

热门文章

  1. 渗透测试常规思路分析-FREEBUF
  2. 之三:CAAnimationGroup - 动画组
  3. JavaScript学习12 JS中定义对象的几种方式
  4. 小谈KVC中KeyPath的集合运算符
  5. Android draw9patch 图片制作与使用
  6. App开发流程之使用GCD
  7. iOS之 Xcode7下 bitcode的工作流程及安全评估
  8. ArrayList vs LinkedList vs Vector
  9. 单元测试中如何配置log4net
  10. mysql服务性能优化—my.cnf配置说明详解