A: 当 按 电 源 键 触 发 开 机 , 首 先 会 从 ROM 中 预 定 义 的 地 方 加 载 引 导 程 序 BootLoader 到 RAM 中 , 并
执 行 BootLoader 程 序 启动 Linux Kernel, 然后启动用户级别的第一个进程: init 进程。init 进
程会解析init.rc 脚 本 做一些初始化工作,包括挂载文件系统、创建工作目录以及启动系统服务进程等,其中系
统服务进程包括 Zygote、service manager、media 等 。在 Zygote 中 会 进 一 步 去 启 动 system_ server
进 程 , 然 后 在 system_server 进 程 中 会 启 动 AMS、WMS、PMS 等 服 务 ,等 这 些 服 务 启 动 之 后 ,
AMS 中 就 会 打 开 Launcher 应 用 的 home Activity, 最 终 就 看 到 了 手 机 的 "桌 面 "。
A:Zygote 作为一个孵化器,可以提前加载一些资源,这样 fork() 时基于 Copy-On-Write 机制创建的其他进程就能 直接使用这些资源,而不用重新加载。 比如 system_server 就可以直接使用 Zygote 中的 JNI 函数、共享库、常用 的类、 以及主题资源。
在 POSIX 标准中,fork 的行为是这样的:复制整个用户空间的数据 (通常使用 copy-on-write 的策略, 所以可以 实现的速度很快) 以及所有系统对象,然后仅复制当前线程到子进程。这里:所有父进程中别 的线程,到了子进程 中都是突然蒸发掉的
对于锁来说,从 OS 看,每个锁有一个所有者,即最后一次 lock 它的线程。假设这么一个环境,在 fork 之前,有 一个子线程 lock 了某个锁,获得了对锁的所有权。fork 以后,在子进程中,所有的额外线程都人间蒸发了。而锁却
被正常复制了,在子进程看来,这个锁没有主人,所以没有任何人可以对它解锁。 当子进程想 lock 这个锁时,不
再有任何手段可以解开了。程序发生死锁
A:Binder 机制中存在 Binder 线程池,是多线程的,如果 Zygote 采用 Binder 的话就存在上面说的 fork() 与 多线程的问题了。其实严格来说,Binder 机制不一定要多线程,所谓的 Binder 线程只不过是在循环读 取 Binder 驱动的消息而已,只注册一个 Binder 线程也是可以工作的, 比如 service manager 就是这样的。实际 上 Zygote 尽管没有采取 Binder 机制,它也不是单线程的,但它在 fork() 前主动停止了其他线程,fork() 后重 新启动了。
还有更多面试题解析可以来我的卫星公众号踩踩:https://mp.weixin.qq.com/s?__biz=Mzg3ODY2MzU2MQ==&mid=2247486092&idx=1&sn=16d6b68384a0ea7e9b861d63d08b5c04&chksm=cf11086af866817cfa552e9c2ef6025610355cb8d9abb42e6eaae675227027bd3b3bff430b30&token=1405822203&lang=zh_CN#rd
#面试题刺客退退退##面试时最害怕被问到的问题#