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

Zygote浅谈的更多相关文章

  1. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  3. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  4. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  5. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  6. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  7. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  8. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

随机推荐

  1. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q29-Q31)

    Question 29 You are designing a SharePoint 2010 intranet site at your company. The accounting depart ...

  2. 【iOS】环形渐变进度条实现

    之前有人在找渐变进度条的效果,闲来无事就顺手写了一个,然后画了视图层级,方便讲解. 环境信息: Mac OS X 10.10.3 Xcode 6.3.1 iOS 8.3 效果图: 源码下载地址: ht ...

  3. kubernetes听云实战发布版

    ➠更多技术干货请戳:听云博客 听云线上使用k8s已经有一段时间了,下面对一些听云使用过程中的问题进行一些梳理,包括架构设计,安装部署和后期维护. 目录结构如下: 下面进入正题: 我们以听云系统的一个报 ...

  4. android 加载自定义图片并在图片上绘图

    来源:毕设 关键词:Bitmap Canvas //毕设中需要自定义室内地图,并且在地图上绘制轨迹 //此处是一个测试Demo,实现图片的加载和记录手指在屏幕上的运动轨迹 图片的载入 使用系统提供的内 ...

  5. RDVTabBarController的基本使用 以及tabbar的防止双点击方法

    RDVTabBarController这个库写得相当不错,所以今天就简单介绍下它的基本使用,看里面可以清楚的知道代码规范的重要性,这个库的使用方法和官方的相识 下载地址:https://github. ...

  6. WPF学习之路(十二)控件(HeaderedContent控件)

    GroupBox 用来组织多种控件的常见控件,因为是内容空间,只能直接包含一项,需要使用面板一类的中间空间. Header和Content可以是任意元素 <GroupBox> <Gr ...

  7. Java Gradle入门指南之gretty插件(安装、命令与核心特性)

        Java Web应用开发时常使用Gradle来进行项目管理,可以十分便利地解决包依赖等问题.war插件的出现,让项目部署成为一个复制粘贴的过程,那有没有办法让Java web应用的部署,就像w ...

  8. Cross-Origin Resource Sharing协议介绍

    传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本.但是Javascript脚 ...

  9. JavaScript Patterns 6.5 Inheritance by Copying Properties

    Shallow copy pattern function extend(parent, child) { var i; child = child || {}; for (i in parent) ...

  10. HDFS

    1.HDFS shell 1.0查看帮助 hadoop fs -help <cmd> 1.1上传 hadoop fs -put <linux上文件> <hdfs上的路径& ...