android framework 面试---zygote进程学习

启动三段式:进程都是这样的

1.进程启动 2. 准备动作 3.loop循环

目标:

1.Zygote的作用是什么

    启动systemserver 启动 进程

2.zygote进程怎么启动的

zygote的启动流程:

1.init进程fork出zygote 进程

2.启动虚拟机,注册jni函数

3.预计加载系统资源

4.启动systemServer

5.进入socket loop

init 进程是linux启动之后用户空间第一个进程,首先启动一个配置文件,init.rc,然后需要启动那些系统服务,zygote就是要启动的系统服务。

使用fork程序来启动进程,蓝色的部分是启动进程的地方,黄色的部分是其中的参数

启动的方式是使用fork启动。

启动进程的方式

fork+handle

fork会返回二次,子进程返回为0,父进程会返回子进程的pid

fork函数会让子进程继承父进程的资源,如果使用 execve的方式去加载进程,会让子进程从父进程继承的资源被清除掉。

pid_t pid =fork();
if(pid==0){
     //child process
}else{
    //parent process
}

fork+execve

pid_t pid = fork();
if(pid==0){
    //child process
    execve(path,argv,env);//可执行程序路径 带的参数 环境变量
}
else{
    //parent process
}

信号处理

sigchld

父进程 ------fork ------子进程

如果子进程挂了,那么父进程就会收到这个信号。父进程就可以让子进程重启。

Zygote的Native世界

为了之后进入java世界作准备

启动Android虚拟机 。 注册Android的jni函数 。 jni调用进入Java世界

int main(int argc,char * atgv[])){
    JavaVm *jvm;
    JniEnv *env;
    JNI_CreateJavaVm(&jvm,(void**)&env,&vm_args);//在zygote进程会创建java虚拟机,普通进程是zygote进程孵化出来的,会继承java虚拟机。
    只需要重制状态就好。
    jclass clazz = env->FindClass("ZygoteInit");
    jmethodID method = env->GetStaticMethodID(clazz,"Main","([Ljava/lang/Sting;)V");
    env->CallStaticVoidMethod(clazz,method,args);
    jvm->DestoryJavaVm());
    
}

Zygote的java世界

preload Resources (预加载资源 ,比如主题相关的资源)---fork---systemServer

Zygote和System server 采用socket通信

Loop 中怎么处理socket请求,关键代码:

 Loop socket循环,新请求过来的时候 执行 runOnce
boolean runOnce(){
    String[] args = readArgumentList();//读取参数
    int pid = Zygote.forkAndSpecialize();//创建子进程
    if(pid==0){
        //in child
        handleChildProc(args,...);//ActivityThread.mian(); 这就是进程启动之后需要做的事情。
        return true;
    }
}

1.zygote 在fork要保持单线程

父进程里面在fork的时候有多少个线程,子进程在创建的时候只有一个线程,所以在fork之后子进程里面的线程不见了。但是子进程会复制父进程的资源,

如果父进程是多线程,会导致很多奇怪的问题。

所以在fork在创建子线程的时候,把主线程之外的停掉。

Zygote也是这么做的。

2.zygote的ipc没有采用binder

binder机制是应用程序创建之后自己启动的binder

zygote 采用的socket

问题:

孵化应用进程的事为什么不交给systemserver去做,而设置zygote:

我们知道,应用在启动的时候需要做很多准备工作,包括启动虚拟机,加载各类系统资源等等,这些都是非常耗时的,如果能在zygote里就给这些必要的初始化工作做好,子进程在fork的时候就能直接共享,那么这样的话效率就会非常高。这个就是zygote存在的价值,这一点SystemServer是替代不了的,主要是因为SystemServer里跑了一堆系统服务,这些是不能继承到应用进程的。所以给SystemServer和应用进程里都要用到的资源抽出来单独放在一个进程里,也就是这的zygote进程,然后zygote进程再分别孵化出SystemServer进程和应用进程。

zygote的ipc通信机制为什么不采用binder,采用binder会有什么问题。

3.进程启动之后做了什么

问题:

谈谈你对zygote的理解:

1.what ,干嘛的:zygote 的作用是什么?

2.how:怎么做的。 zygote的启动流程。

3.why:zygote工作原理。 怎么孵化进程,怎么通信。

zygote 采用fork的方式孵化子进程,子进程会复制父进程中的资源

这个是本人总结的,mkw的framework面试的资料,需要具体的视频和其他的资料,TB店铺 纳新工作室  中找framework 资料就好哈。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值