进程介绍
先强化两个进程相关的概念
-
进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是操作系统动态执行的基本单元,是系统进行资源分配的基本单位,在面向线程设计的计算机结构中是线程的容器。
-
fork:fork函数UNIX及类UNIX系统中的分叉函数,一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
Android进程机制
下面介绍一下android的进程机制,Android进程实际上是Linux(类UNIX系统)进程,在Linux中所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。
在android系统中也有一个初始进程:Zygote进程,是在系统启动的过程,由init进程创建的,启动Zygote之后, init进程会启动runtime进程。Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。 Zygote进程初始化了第一个VM, 并且预加载了framework和App所需要的通用资源。它会创建一个超级管理进程SystemServer进程,SystemServer进程会启动所有系统的核心服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService,硬件相关的Service等。然后它开启一个Socket接口来监听请求, 根据请求fork新的VM来管理新的App进程. 一旦收到新的请求, Zygote会基于自身预先加载的VM来fork一个新的VM创建一个新的进程。 需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。
具体启动细节:每一个App应用都是由ActivityManagerService通过Socket与Zygote进程进行通信,ActivityManagerService调用startProcessLocked()方法来创建新的进程, 该方法会通过前面讲到的socket通道传递参数给Zygote进程。Zygote会fork一个子进程出来作为这个即将要启动的应用程序的进程, 并调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。 接下来要做的就是将进程和指定的Application绑定起来. 这个是通过ActivityThread对象中调用bindApplication()方法完成的. 该方法发送一个BINDAPPLICATION的消息到消息队列中, 最终通过handleBindApplication()方法处理该消息. 然后调用makeApplication()方法来加载App的classes到内存中。 经过前两个步骤之后, 系