Android进程线程调度nice等优先级讨论
来源:互联网 发布:南通东华软件 编辑:程序博客网 时间:2024/06/18 11:54
进程调度nice值
关于nice的基本概念:
Linux中,使用nice value来设定一个进程的优先级,android 也会用这一套机制。系统任务调度器根据nice值合理安排调度。
>nice的取值范围为-20到19。>通常情况下,nice的默认值为0。视具体操作系统而定。>nice的值越大,进程的优先级就越低,获得CPU调用的机会越少,nice值越小,进程的优先级则越高,获得CPU调用的机会越多。>一个nice值为-20的进程优先级最高,nice值为19的进程优先级最低。>父进程fork出来的子进程nice值与父进程相同。父进程renice,子进程nice值不会随之改变。
这个并不是最终的优先级, 真正的进程优先级是要经过一定的计算, 也就是说nice会影响静态优先级。 看代码:/kernel/kernel/sched/sched.h (Android 7.0)
/** Convert user-nice values [ -20 ... 0 ... 19 ]* to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],* and back.*/#define NICE_TO_PRIO(nice) (MAX_RT_PRIO + (nice) + 20)#define PRIO_TO_NICE(prio) ((prio) - MAX_RT_PRIO - 20)
其中 MAX_RT_PRIO = 100 。
android中nice的用法:
$ niceusage: nice [-n PRIORITY] command [args...]Run a command line at an increased or decreased scheduling priority.Higher numbers make a program yield more CPU time, from -20 (highestpriority) to 19 (lowest). By default processes inherit their parent'sniceness (usually 0). By default this command adds 10 to the parent'spriority. Only root can set a negative niceness level.nice: Needs 1 argument
renice使用:
对于一个新的进程我们可以按照下面的代码为一个进程设定nice值。
$ reniceusage: renice [-gpu] -n increment ID ...renice: Needs 1 argument
不能root不能使用, 通常我们调试性能会在user 版本上调试, 不能root,我们刷能root的boot image进行验证行的调试, 并不能作为重要正式结果。
线程调度API
我们在app层和framework层是有机制与nice机制相对应的, nice是对进程的, 以下是可对线程的, 效果异曲同工。
分为Java API 和 Android API
Java API:
Java为Thread提供了三个级别的设置。
MAX_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY,值为10。MIN_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_LOWEST,值为0。NORM_PRIORITY,相当于android.os.Process.THREAD_PRIORITY_DEFAULT,值为5。
使用setPriority我们可以为某个线程设置优先级,使用getPriority可以获得某个线程的优先级。
在Android系统中,不建议使用Java原生的API,因为Android提供的API划分的级别更多,更适合在Android系统中进行设定细致的优先级。
Android API:
THREAD_PRIORITY_DEFAULT,默认的线程优先级,值为0。THREAD_PRIORITY_LOWEST,最低的线程级别,值为19。THREAD_PRIORITY_BACKGROUND 后台线程建议设置这个优先级,值为10。THREAD_PRIORITY_FOREGROUND 用户正在交互的UI线程,代码中无法设置该优先级,系统会按照情况调整到该优先级,值为-2。THREAD_PRIORITY_DISPLAY 也是与UI交互相关的优先级界别,但是要比THREAD_PRIORITY_FOREGROUND优先,代码中无法设置,由系统按照情况调整,值为-4。THREAD_PRIORITY_URGENT_DISPLAY 显示线程的最高级别,用来处理绘制画面和检索输入事件,代码中无法设置成该优先级。值为-8。THREAD_PRIORITY_AUDIO 声音线程的标准级别,代码中无法设置为该优先级,值为 -16。THREAD_PRIORITY_URGENT_AUDIO 声音线程的最高级别,优先程度较THREAD_PRIORITY_AUDIO要高。代码中无法设置为该优先级。值为-19。THREAD_PRIORITY_MORE_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微优先,值为-1。THREAD_PRIORITY_LESS_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微落后一些,值为1。
使用Android API为线程设置优先级也很简单,只需要在线程执行时调用android.os.Process.setThreadPriority方法即可。这种在线程运行时进行修改优先级,效果类似renice。
Java API 与Android API的关系:
Android API的线程优先级和Java原生API的优先级是相对独立的,比如使用android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)后,使用Java原生API,Thread.getPriority()得到的值不会改变。
启发优化策略:
在framework层进行对所有进程的监控和行为分析(核心算法实现暂不开源 TODO),给进程进行分类,区别进行类似于再renice处理。让IO消费型进程再提高优先级, 响应用户操作的线程得到较高优先级, CPU消费型进程再降低优先级。
风险:
此feature打破原有打分机制, 可能对进程类型评估是准确,导致不可预知的抢占不到资源。
欢迎大家讨论
- Android进程线程调度nice等优先级讨论
- linux进程调度,优先级、进程nice值
- 剖析Android中进程与线程调度之nice
- Android中进程线程调度的命令之nice
- Android nice在进程与线程调度中的作用
- 剖析Android中进程与线程调度之nice
- Android nice在进程与线程调度中的作用
- 进程调度(进程优先级和nice值)
- 进程调度(进程优先级和nice值)
- 进程优先级、nice值
- 进程优先级 nice
- nice设置进程优先级
- 进程调度的目标,nice值,静态优先级,动态优先级,实时优先级,时间片 .
- 窥探 kernel --- 进程调度的目标,nice值,静态优先级,动态优先级,实时优先级,时间片
- 窥探 kernel --- 进程调度的目标,nice值,静态优先级,动态优先级,实时优先级,时间片
- 窥探 kernel --- 进程调度的目标,nice值,静态优先级,动态优先级,实时优先级,时间片
- 进程、线程调度、优先级与关联性
- linux 提高进程优先级nice
- 第三方ORM框架GreenDao
- linux软件管理
- ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接)
- Ubuntu 16.04 安装有道词典解决方法
- nginx负载均衡初探
- Android进程线程调度nice等优先级讨论
- POJ 3414
- 重命名表名和列名sql语句
- 轻量级框架SSH应用与开发——Struts2之学习总结(进阶)
- C++primer阅读笔记---------特殊工具与技术
- UVA 679
- IAT和导入表关系
- 一个rootkit程序--隐藏文件和进程
- 剑指offer——32.把数组排成最小的数