进程管理/程序启动/进程回收

上一节学习了linux kernelAndroid专用驱动,并重点介绍了三个最重要的驱动Logger Binder以及Ashmem,注意对应文件所在的目录和jni整体调用过程。

这一篇我们要学习的是内核中的进程管理机制。、

 

Android系统的启动过程:

这篇写得挺好:http://blog.jobbole.com/67931/

引用里面的一个图片,个人感觉很清晰,图片的错别字请忽略。

 

图解:启动电源,从ROM中把引导程序加载到RAM当中,然后执行引导程序,引导程序不是Android操作系统,但却是厂商加锁限制的地方,引导程序为加载内核做准备工作,之后就是加载内核了,内核之后就进入了最重要的一部分了,内核启动的第一个init进程。

Init进程会挂载一些目录,并且执行init.rc初始化脚本文件(系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。),这时候对应开机是显示Android logo。之后,由init进程创造出守护进程和service Manager(Binder机制的组件之一)以及最重要的zygote进程。然后复制zygote进程的地址空间为Dalvik虚拟机实例,并创建System Servers,之后的所有Android的进程都是通过Zygote进程fork出来的,这一阶段就是开机动画的时间。最后的最后,各种系统服务注册到service Manager当中,至此启动过程就到一段落了,成功进入Android系统了。

 

Android应用程序进程启动过程

acvitityManagerService会在需要启动组件时创建一个进程(组件思想篇)

当进程创建的时候,会加载ActivityThread这个类,进入main函数,就是执行消息循环的地方了,android的所有函数都是在一个消息循环中执行的;同时,会启动一个线程池来给server组件和binder驱动进行进程间通讯。

综上,一个进程的入口是activityTHread.main入口,并且支持Binder通讯。

 

 

Android应用程序进程回收机制:

LinuxOut of Memory Killer ,每一个进程都有一个oom_adj的值,目录在

/proc/<pid>/oom_adj ,取值范围为-1715,越小月不容易杀死。内存紧张时,OOM Killer综合进程的内存消耗量、CPU时间、存活时间和oom_adj值来决定是否要杀死一个进程来回收内存。

 

对于AndroidLow-Memory-killeroom_adj则是-16~15,内存紧张根据oom_adj和消耗内存数最大的杀死进程,同时,activityManagerServicewindowManagerService也会在特定情况下主动回收进程。

Oom_adj:init启动的守护进程服务进程(比如system servers)等都是-16android:persistent(常驻内存的意思)设置是为true的系统App进程为-12,前台activity0,其他....具体百度了。

那么什么时候oom_adj会变化呢?

一、Activity状态变为stop

二、setProcessLimit:设置进程数量限制

三、取消注册广播

四、finishReceiver:结束Broadcast Receiver

 

总结:andrid的启动过程(一个图,加深记忆),应用程序进程的启动过程,以及进程回收机制,启动到回收,形成一个闭环。

 

Android的启动过程,按下开机键,把ROM当中的引导程序加载到RAM当中,然后执行引导程序,引导程序是厂商加锁的地方,引导程序是为加载内核做准备的,内核加载完成,此时应该显示androidlogo。之后,内核启动init进程,手机表现为开始开机动画,init进程除了挂载目录之外,还启动了一个init.rc初始化脚本,用来启动一些服务进程等,然后守护进程,serviceManager以及很重要的Zygote就启动起来了,系统的服务(system Servers)以及之后的应用程序,都是由Zygote进程fock出来的,一提供一些比如共享内存的特性,davik虚拟机也是复制zygote内存空间来的,最后,系统服务再注册到serviceManager当中。

App的进程启动,进程入口是activityThrread.main,所有函数都是在消息循环中执行的;还在启动的过程启动线程池,以支持Binder通讯服务。

进程的回收,androidlmk,oom_adj的值决定回不回收,-16~15,一般前台就是0,系统app设置persistentTrue后为-12,init以及启动的系统进程为-16,特定情况下,activityManagerServicewindowManagerService也会回收掉进程。

你可能感兴趣的:(进程管理/程序启动/进程回收)