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内核剖析》
Zygote浅谈的更多相关文章
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- 浅谈Angular的 $q, defer, promise
浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00 博客园-原创精华区 原文 http://www.cnblogs.com/big-snow/ ...
随机推荐
- 【IOS】从android角度来实现(理解)IOS的UITableView
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3403124.html 本人从在学校开始到现在上班(13年毕 ...
- leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- Android上传图片到PHP服务器并且支持浏览器上传文件(word、图片、音乐等)
暑假已经过了一半了,这才完成计划当中的第二个任务.虽然进度是慢了点.但也算是暑假的收获吧.下面我就把我学习当中的收获记录在此. 还是跟以往一样,先上图片. 操作的步骤:打开程序---->选择上传 ...
- UITableView增加和删除、移动
复习一下: 1.在控制器上添加一个UITableView, 暂时该UITableView控件变量名命名为为tableView, 设置控件代理,实现控制器的UITableViewDataSource, ...
- Swift开发第二篇——extension及fatalError
本篇分两部分: 一.extension在 Swift 中的使用 二.Swift 中的 fatalError 一.extension在 Swift 中的使用 在 swift 中我们可以通过 extens ...
- iOS 为视图添加抖动效果
抖动效果在开发中比较少用到,不过有时使用了确有个很好的装逼效果,用的时候就例如一些用户错误操作之类的 效果如下,不过gif看到的效果没实际的好看 上代码 - (void)shakeAnimationF ...
- 【转载】Linux NFS服务器的安装与配置
一.NFS服务简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操 ...
- coursera机器学习笔记-机器学习概论,梯度下降法
#对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
- pt-diskstats 报错 Can't locate Time/HiRes.pm in @INC
调用 pt-diskstats 时报错如下Can't locate Time/HiRes.pm in @INC [root@localhost ~]# pt-diskstats Can't locat ...
- 记录Sqlserver2012附加Sqlserver2008的数据库出错的解决方案
一.摘要 最近在实验里面用台式编写好了一个软件,想移植到家里的笔记本上.在附加数据的时候却出现了错误,具体也没有提示什么错误,反正就是附加失败了. 二.解决方案 在网上看了一些资料,有的说[低版本不能 ...