nice与进程调度

Linux中,使用nice value(以下成为nice值)来设定一个进程的优先级,系统任务调度器根据nice值合理安排调度。

nice的取值范围为-20到19。
通常情况下,nice的默认值为0。视具体操作系统而定。
nice的值越大,进程的优先级就越低,获得CPU调用的机会越少,nice值越小,进程的优先级则越高,获得CPU调用的机会越多。
一个nice值为-20的进程优先级最高,nice值为19的进程优先级最低。
父进程fork出来的子进程nice值与父进程相同。父进程renice,子进程nice值不会随之改变。

线程调度

虽然对于进程的优先级,我们无法控制,但是我们可以控制进程中的线程的优先级。在Android中有两种线程的优先级,一种为Android API版本,另一种是 Java 原生版本。

  • Android API

Process优先级:priority:负20  ------>  +19 ,对应最高优先级------> 最低优先级。

Android中的线程优先级别目前规定了如下,了解了进程优先级与nice值的关系,那么线程优先级与值之间的关系也就更加容易理解。

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。

new Thread () {@Overridepublic void run() {super.run();android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);}
}.start();
  • Java原生API

Java优先级:priority:1 --------------> 10,最低优先级 -----------> 最高优先级。

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可以获得某个线程的优先级。

Runnable r = ....
Thread  thread = new Thread(r);
thread.setPriority(Thread.MAX_PRIORITY);

在Android系统中,不建议使用Java原生的API,因为Android提供的API划分的级别更多,更适合在Android系统中进行设定细致的优先级。
注意Android API的线程优先级和Java原生API的优先级是相对独立的,比如使用android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)后,使用Java原生API,Thread.getPriority()得到的值不会改变。如下面代码:


new Thread() {@Overridepublic void run() {super.run();Log.i(LOGTAG, "Java Thread Priority Before=" + Thread.currentThread().getPriority());Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);Log.i(LOGTAG, "Java Thread Priority=" + Thread.currentThread().getPriority());}
}.start();

上述代码的运行日志为

I/MainActivity( 3679): Java Thread Priority Before=5
I/MainActivity( 3679): Java Thread Priority=5

该用谁?

建议使用Process.setThreadPriority(int priority)

分析ANR 对应的日志文件 /data/anr/traces.txt 时,会遇到两个权限

性能优化专题十一--线程优化相关推荐

  1. Android系统性能优化(54)---Android性能分析专题

    Android性能分析专题 1.  背景:Android App优化, 要怎么做? 2.  Android App优化之性能分析工具 3.  Android App优化之提升你的App启动速度之理论基 ...

  2. 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优

    目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...

  3. 性能优化专题 - MySql 性能优化 - 04 - MySql调优

    目录导航 前言 Undo-log与Redo-log 案例 当前读.快照读 Redo Log的落盘配置 MySQL配置优化 MySQL服务器参数类型 快速定位MySql配置文件 MySQL内存参数配置 ...

  4. Android性能优化之使用线程池处理异步任务

    说到线程,我想大家都不陌生,因为在开发时候或多或少都会用到线程,而通常创建线程有两种方式: 1.继承Thread类 2.实现Runnable接口 虽说这两种方式都可以创建出一个线程,不过它们之间还是有 ...

  5. Java性能-线程和同步-JVM线程优化和线程优先级

    线程和同步-JVM线程优化 优化线程栈大小 每个线程都有一个原生栈,操作系统会在这里存储线程的调用栈信息,如果空间不足可以通过调整线程使用的内存. 64位机器默认原生栈大小1MB 如果将线程栈设置的非 ...

  6. App性能优化(布局优化,线程优化,app瘦身优化,页面切换优化,App启动优化,内存优化)

    Android APP性能优化(最新总结) 在目前Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性.复杂度也随之增长,这样使得UI布局的优化,显得至关重要 ...

  7. 【linux性能优化】内核线程CPU利用率高分析

    在排查网络问题时经常碰到的一个问题,就是内核线程的CPU使用率很高 比如,在高并发的场景中内核线程ksoftirqd的CPU使用率通常就会比较高,根据CPU和网络模块知识可以得知,这是网络收发的软中断 ...

  8. 性能优化 -- 优化SurfaceView的线程调用

    性能优化 – 优化SurfaceView的线程调用 目录 性能优化 – 优化SurfaceView的线程调用 目录 SurfaceView的基本用法 问题 解决方案 为了防止Handler引发的内存泄 ...

  9. Android性能优化系列:CPU收敛优化(线程优化)

    文章目录 线程调度 线程调度的原理 线程调度模型 Android 的线程调度 线程调度小结 Android 异步方式汇总 Thread HandlerThread IntentService Asyn ...

最新文章

  1. 算法 | RASAC 入门
  2. CentOS 初体验十:文件权限查看和修改
  3. asp.net oracle 问号,ASP.NET中文变问号问题解决方案
  4. gpu云服务器运行游戏_99元起!华为云鲲鹏云手机正式发布:流畅运行大型游戏...
  5. Fiddler抓包工具之详细使用步骤(超详细)
  6. 《自己动手写操作系统》实践(一)
  7. 262-C++ C11标准
  8. 大学计算机之软件设计程序框图,《程序框图、顺序结构》教学设计
  9. Python大数据分析系列
  10. 中国地产商寻找下一个春天
  11. Windows 10展开速度升级!智慧桌面在科技和资安双重优势
  12. 云服务器ECS常见的计费方式
  13. Qt加载高德在线地图
  14. PowerManagerService类大致解读
  15. fckeditor文档库
  16. 2022年湖南省证券从业资格(证券投资基金)练习题及答案
  17. 自动控制原理之自动控制的基本概念
  18. 【大话Java面试】-如何通俗易懂的理解Redis的回收算法LRU?
  19. 磁盘性能--IOPS和吞吐量
  20. 《机器学习》周志华课后习题答案——第五章(1-7已完结)

热门文章

  1. xdoj 1202 The Offer - Lunatic
  2. 163.net是什么邮箱?这种个人邮箱你足够了解么?
  3. 文件监控——watchdog详解
  4. 使用pysam读取DNA序列
  5. Python获取前一天的日期,前一个月的第一天,前一个月的最后一天
  6. 计算机网络之因特网概述
  7. 使用install安装应用的时候出现INSTALL_FAILED_SHARED_USER_INCOMPATIBLE问题的解决方法
  8. html弹幕代码135,弹幕代码详解
  9. TCP/IP协议,HTTP协议,get和post请求的关联与区别
  10. ThinkPHP文件包含漏洞分析