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/
- android 进程管理
- Android进程管理详解
- Android进程管理详解
- Android进程的管理
- android的进程管理
- Android进程内存管理
- android 自动管理进程
- Android进程管理
- Android之进程管理
- Android进程管理
- Android进程管理详解
- android中进程管理
- Android进程管理详解
- android进程内存管理
- Android进程管理详解
- Android进程管理(详解)
- Android中进程管理
- Android进程管理学习
- SharePoint 2013 On Azure 解决 SCRIPT5: Access is denied. 问题
- Visual Studio 2013 Tools for Unity安装目录,Visual Studio 2013 Tools.unitypackage
- java中static作用详解
- ios之TableViewCell重用机制避免重复显示问题
- 正则表达式所有元字符及其使用方法一览表
- Android进程管理
- SSH2框架搭建 和 配置文件详解
- do not be evil. 不作恶
- [Object-C]iOS 形参个数可变的方法
- jQuery开发之DOM操作一
- GRE填空词汇——性格类
- 24种编程语言的Hello World程序
- 原来如此,哈哈
- LeetCode_32---Longest Valid Parentheses