Android zygote与进程创建(一)

本文详细解读了Android系统中zygote的定义、作用及其创建进程的详细过程,包括zygote如何建立运行时环境、启动虚拟机、创建SystemService和应用程序进程。通过分析zygote的主要作用和创建流程,为开发者提供了深入理解Android系统架构的基础知识。

转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=82883


在android中,应用程序的入口是ActivityThead中的main函数,那么之后系统是怎样为应用程序创建进程的呢?SystemService又是怎样创建的?答案是:zygote

        zygote翻译成中文是受精卵的意思,名字比较奇怪、但是很有意思。在android中,大部分的应用程序进程都是由zygote来创建的,为什么用大部分,因为还有一些进程比如系统引导进程、init进程等不是有zygote创建的。相反,zygote还是在init进程之后才被创建的。在android中提到zygote,主要两块,一个是C/C++编写的zygote,主要用来为应用和SystemService fork进程的。一个是java编写的zygote接口,负责为应用和service调用C/C++ zygote的接口执行fork,从而创建VM进程。说明:在android中,service主要有NativeService和SystemService。SystemService主要是指系统中service,比如,InputMethodService、ActivityManagerService等。

       zygote在android中主要有两个作用:

       1.建立运行时环境并启动虚拟机,执行com.android.internal.os.ZygoteInit的main函数,从而fork SystemService

java代码:

  1. runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); 
复制代码

       2.为应用程序创建DVM进程。

       启动SystemServer:

       我们来看看zygote是怎样创建SystemService进程的。在../base/cmds/app_process/app_main.cpp的主函数中,有这样一段代码,它执行了runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);   //runtime继承自AndroidRuntime也就是说,在主函数中,初始化了运行时环境,并且建立虚拟机,然后运行再com.android.internal.os.ZygoteInit的main函数

       再来看看com.android.internal.os.ZygoteInit的main中都做了哪些事情。在看ZygoteInit之前,有必要先来看下相关的类,类图如下:


       在ZygoteInit的main函数中,主要执行了:

java代码:
  1. registerZygoteSocket();//登记Listen端口 
  2. startSystemServer();//启动SystemServer 
复制代码

       startSystemServer()调用Zygote的native方法 forkSystemServer(); 到这里,java端的Zygote的准备工作就结束了,接下来就交给C/C++端的Zygote来执行fork任务了。来看下代码:

       在 ../dalvik/vm/native/dalvik_system_Zygote.c 中

java代码:
  1. static void Dalvik_dalvik_system_Zygote_forkSystemServer( 
  2. const u4* args, JValue* pResult) 

  3. pid_t pid; 
  4. /*调用forkAndSpecializeCommon,执行fork */ 
  5. pid = forkAndSpecializeCommon(args, true); 
  6. /* 检查fork后返回的进程pid */ 
  7. if (pid > 0) { 
  8. int status; 
  9. LOGI("System server process %d has been created", pid); 
  10. gDvm.systemServerPid = pid; 
  11. if (waitpid(pid, &status, WNOHANG) == pid) { 
  12. LOGE("System server process %d has died. Restarting Zygote!", pid); 
  13. kill(getpid(), SIGKILL); 


  14. RETURN_INT(pid); 

复制代码

【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念分析方法;②掌握利用Simulink进行电力系统建模仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值