欢迎来到天天文库
浏览记录
ID:37708216
大小:195.50 KB
页数:23页
时间:2019-05-29
《Android 7.0 ActivityManagerService(7) 进程管理相关流程分析(1)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Android7.0ActivityManagerService(7)进程管理相关流程分析(1)Android框架定义了四大组件,一般的功能都是基于这些组件的。 因此,在Android平台上开发时,很少会接触到进程的概念。但根据前面分析Activity、Service和BroadcastReceiver的流程, 我们可以清晰地看到,所有这些组件最终还是要运行在具体的进程之中。 于是,AMS作为管理四大组件的核心服务,也承担起了进程管理的责任。在AMS中,进程管理相关的函数分别为updateLruProcessLocked和u
2、pdateOomAdjLocked。 这两个函数在之前的流程分析中多次遇到过,从这篇博客开始,我们一起来看看它们具体的工作流程。一、Linux进程管理的基本概念 Android中进程管理相关的工作,实际上依赖于Linux的进程管理策略。 因此,先简单地了解一下Linux进程管理的基本概念。1、Linux进程调度优先级和调度策略 调度优先级和调度策略,是操作系统对CPU资源进行管理和控制的依据。调度优先级: 我们知道,操作系统上运行的进程数量较多,同时CPU的资源是有限的。 因此,操作系统需要合理地为不同进程分配CPU资源。调
3、度优先级就是操作系统分配CPU资源给进程时,需要参考的一个重要指标。 一般而言,优先级较高的进程将更有机会得到CPU资源。调度策略: 调度策略用于描述,操作系统的调度模块,分配CPU资源给应用进程时,所遵循的规则。 即用于描述,将CPU控制权交给调度模块时,它如何决定下一个要运行的进程。由于多个进程可能具有相同的调度优先级,因此调度模块不能仅按照各进程的调度优先级进行决策。 一个良好的调度策略,一定要兼顾到效率和公平性。LinuxAPI: Linux提供了两个API用于设置调度优先级及调度策略。1)设置调度优先级的API为:
4、 intsetpriority(intwhich,intwho,intprio) 其中,which和who联合使用。当which为PRIO_PROGRESS时,who代表一个进程,即pid; 当which为PRIO_PGROUP时,who代表一个进程组,即gid; 当which为PRIO_USER时,who代表一个用户,即uid。prio用于设置进程的nice值,取值范围为-20~+19。 该值越大表示进程越友好(nice),即对CPU资源的依赖越低。 于是,进程的prio值越大,其被调用的优先级越低。2)设置调度策略的AP
5、I为: intsched_setscheduler(pid_tpid,intpolicy,conststructsched_param*param); 其中,pid表示进程id;policy表示调度策略。 Linux定义了很多种调度策略,具体的内容可以参考相关的资料。param参数中,最重要的是该结构体中的sched_priority变量。 该变量用于设置该调度策略下,进程的优先级。2、Linux进程oom_adj的介绍 从Linuxkernel2.6.11开始,内核提供了进程的OOM控制机制。 目的是: 当系统出现内存不足
6、的情况时,内核可以根据进程的oom_adj值, 来选择杀死一些进程,以回收内存。oom_adj用于表示Linux进程内存资源的优先级,其可取值范围为-16至+15,数值越小,被kill的可能性越低。 此外,还有一个特殊值-17,表示禁止系统在OOM情况下杀死该进程。Linux没有提供单独的API用于设置进程的oom_adj,一般是向/proc/[pid]/oom_adj文件中写入对应的oom_adj值。在Linuxkernel2.6.36后,/proc/[pid]/oom_adj被弃用了,改为/proc/[pid]/oom_
7、score_adj。 oom_score_adj对应的取值范围变为-1000到1000,仍然是数值越小,被kill概率越小。 此时,-1000表示禁止系统在OOM情况下杀死该进程。AMS的updateOomAdjLocked函数,就借用了Linux中oom_adj的概念。此外,Android为linuxkernel新增了LowMemoryKiller(LMK)机制。 LMK的配置文件中,预先定义了不同的内存阈值及对应的oom_adj。当LMK监控到系统内存下降到某个阈值时,就会kill掉当前系统内, oom_adj超过该阈值
8、预定义oom_adj的所有进程。例如,预定义一组对应关系,内存剩余2048KB时,oom_adj为0。 那么,当LMK监控到系统内存少于2048KB时,将kill掉系统内所有oom_adj大于0的进程。以上是Linux进程管理的一些基本概念, 如果需要深入理解对应的过程,还是需要阅读相关源
此文档下载收益归作者所有