zoukankan      html  css  js  c++  java
  • Zygote浅谈

    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内核剖析》

  • 相关阅读:
    FastDFS的配置、部署与API使用解读(6)FastDFS配置详解之Storage配置(转)
    WEB服务器防盗链_HttpAccessKeyModule_Referer(Nginx&&PHP)
    php检查是否是数字和字母
    为什么要使用Docker?
    TP5整合 WorkerMan 以及 GatewayWorker
    PHP基于ThinkPHP5的砍价活动相关设计
    Git (gnome-ssh-askpass:3871): Gtk-WARNING **: cannot open display:
    B2B2C商品模块数据库设计
    PHP开发中多种方案实现高并发下的抢购、秒杀功能
    Linux CentOs集群LVS+Keepalived负载均衡的实现
  • 原文地址:https://www.cnblogs.com/ldq2016/p/6232359.html
Copyright © 2011-2022 走看看