Android进程管理

来源:互联网 发布:如何认定利用网络犯罪 编辑:程序博客网 时间:2024/06/05 14:24

从调度角度看

Android进程/线程的调度基于Linux OS的调度,并使用了Linux提供的cgroup对进程进行分组管理。4.4.2版本系统提供了3个cpu cgroup分组:

SYSTEM、FOREGROUND和BACKGROUND,

3个cpu cgroup分组有层次关系,依次为父子关系。对应的cgroup目录如下:

/dev/cpuctl/tasks

/dev/cpuctl/apps/tasks

/dev/cpuctl/apps/bg_non_interactive/tasks

对外接口上提供5个调度策略类别:

SYSTEM、AUDIO_APP 、AUDIO_SYS 、FOREGROUND和BACKGROUND

前面3个类别在实现上目前纳入都到SYSTEM对应的cgroup分组

 

Android为什么使用了cgroup?

通过搜索学习,发现一种比较靠谱的解释,总结下就是:Android系统天生存在前后台的概念(有屏幕,可见的APP可以理解为前提APP,其他为后台),cgroup的增加就是为了前台APP流畅运行提供保证的。结合init.rc可以有比较直观的理解,

    write /dev/cpuctl/apps/cpu.shares1024

    write /dev/cpuctl/apps/cpu.rt_runtime_us800000

    write /dev/cpuctl/apps/cpu.rt_period_us1000000

    # 5.0 %

    write /dev/cpuctl/apps/bg_non_interactive/cpu.shares52

    write /dev/cpuctl/apps/bg_non_interactive/cpu.rt_runtime_us700000

    write /dev/cpuctl/apps/bg_non_interactive/cpu.rt_period_us1000000

从cpu.share可以看出,Android给后台APP分配的竞争cpu为52,约前台APP的5%。

另外还有1个根cgroup,是给系统进程服务的,配置跟前台APP类似,但在实时处理上优于前台APP。

    write /dev/cpuctl/cpu.shares1024

    write /dev/cpuctl/cpu.rt_runtime_us950000

    write /dev/cpuctl/cpu.rt_period_us1000000

 

Android的APK的工作时,除了UI主线程被加入前台APP cgroup组,其他的线程都被放入后台APP cgroup。

 

从进程回收角度看

相关资料一般讲Android将进程分为6个等级,它们按优先级顺序由高到低依次是:

1.前台进程( FOREGROUND_APP)

2.可视进程(VISIBLE_APP )

3.次要服务进程(SECONDARY_SERVER )

4.后台进程 (HIDDEN_APP)

5.内容供应节点(CONTENT_PROVIDER)

6.空进程(EMPTY_APP)

这里的优先级是指进程在系统中存在的优先级,也有讲5个级别,刨去5内容供应(CONTENT_PROVIDER)。在4.4.2源码中给出了很多级别,存在优先级高到低(被omm-killer选择杀掉优先级由低到高)等级依次为:

NATIVE_ADJ = -17

SYSTEM_ADJ = -16

PERSISTENT_PROC_ADJ = -12

FOREGROUND_APP_ADJ = 0

VISIBLE_APP_ADJ = 1

PERCEPTIBLE_APP_ADJ = 2

BACKUP_APP_ADJ = 3

HEAVY_WEIGHT_APP_ADJ = 4

SERVICE_ADJ = 5

HOME_APP_ADJ = 6

PREVIOUS_APP_ADJ = 7

SERVICE_B_ADJ = 8

CACHED_APP_MIN_ADJ = 9

CACHED_APP_MAX_ADJ = 15

UNKNOWN_ADJ = 16

从对应关系上来看,网上查询资料所讲的进程级别是对于app来讲的。APP进程等级确定原则:

1.如果一个进程里面同时包含service和可视的activity,那么这个进程应该归于可视进程,而不是service进程.

2.另外,如果其他进程依赖于它的话,一个进程的等级可以提高.例如,一个A进程里的service被绑定到B进程里的组件上,进程A将总被认为至少和B进程一样重要.

3.系统中的phone服务被划分到前台进程而不是次要服务进程.

 

在android中以进程的oom_adj值也就代表了它的优先级.

oom_adj值越高代表该进程优先级越低。在init.rc中为系统首进程1赋予了-16:

write /proc/1/oom_adj -16

如此,从继承的角度,系统中没有比root更高优先级的。

 

进程oom_adj值的更新:

android进程的oom_adj都在ActivityManagerService中更新

1

2

3

4

updateOomAdjLocked() =>

int adj = computeOomAdjLocked(app, hiddenAdj, TOP_APP, false);

Process.setOomAdj(app.pid, adj) =>

android_os_Process_setOomAdj //android_util_Process.cpp

 

Android的工作策略:为保证APP的流畅运行,系统一般不主动杀掉不活动的APP,以便下次启动或运行时得到快速执行。

参考文档:http://stackvoid.com/Thread-Scheduling-in-Android/

0 0