android启动流程面试题目


你了解Android系统启动流程吗?

A:当按电源键触发开机,首先会从ROM中预定义的地方加载引导程序BootLoader到RAM中,并执行Bootl oader程序启动Linux Kernel,然后启动用户级别的第一个进程: init 进程。init 进程会解析init.c 脚本做一些初始化工作,包括挂载文件系统、创建工作目录以及启动系统服务进程等,其中系统服务进程包括Zygote、service manager. media 等。在Zygote中会进一步去启动 system. server进程,然后在system server进程中会启动AMS、WMS、PMS等服务,等这些服务启动之后,AMS中就会打开Launcher应用的home Activity, 最终就看到了手机的"桌面"。

面试官: system. server为什么要在Zygote中启动,而不是由init直接启动呢?

A: Zygote作为-一个孵化器,可以提前加载一些资源, 这样fork()时基于Copy-On-Write机制创建的其他进程就能直接使用这些资源,而不用重新加载。比如system. server就可以直接使用Zygote中的JNI函数、共享库、常用的类、以及主题资源。面试官:为什么要专门使用Zygote进程去孵化应用进程,而不是让system. server去孵化呢?A:首先system server 相比Zygote多运行了AMS、WMS 等服务,这些对-一个应用程序来说是不需要的。另外进程的fork()对多线程不友好,仅会将发起调用的线程拷贝到子进程,这可能会导致死锁,而system. server中肯定是有很多线程的。

面试官:能说说具体是怎么导致死锁的吗?

在POSIX标准中,fork 的行为是这样的:复制整个用户空间的数据(通常使用copy-on-write的策略,所以可以实现的速度很快)以及所有系统对象,然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的

对于锁来说,从OS看,每个锁有一一个所有者,即最后一-次lock它的线程。假设这么一 一个环境,在fork之前,有一一个子线程lock了某个锁,获得了对锁的所有权。fork 以后,在子进程中,所有的额外线程都人间蒸发了。而锁却被正常复制了,在子进程看来,这个锁没有主人,所以没有任何人可以对它解锁。当子进程想lock这个锁时,不再有任何手段可以解开了。程序发生死锁

面试官: Zygote为什么不采用Binder机制进行IPC通信?

A: Binder机制中存在Binder线程池,是多线程的,如果Zygote采用Binder的话就存在上面说的fork0与多线程的问题了。其实格来说Binder 机制不- -定要多线程, 所谓的Binder线程只不过是在循环读取Binder驱动的消息而已,只注册一个Binder线程也是可以工作的,比如service manager就是这样的。实际上Zygote尽管没有采取Binder机制,它也不是单线程的,但它在fork0前主动停止了其他线程,fork0后重新启动了。

你可能感兴趣的:(android启动流程面试题目)