全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
剖析Android中进程与线程调度之nice在计算机操作系统中,进程是进行资源分配和调度的基本单位,同时每个进程之内也可以存在多个线程。那么在Android系统(Linux Kernel)中,进程是如何去抢占资源,线程又是如何根据优先级切换呢,本文将尝试剖析这个问题,研究nice在Linux以及Android系统中的应用。一些概念 进程 是计算机系统中,程序运行的实体,也是线程的容器。 线程 是进程中实际执行单位,一个线程是程序执行流的最小单元。在一个进程中可以有多个线程存在。nice与进程调度Linux中,使用nice value(以下成为nice值)来设定一个进程的优先级,系统任务调度器根据nice值合理安排调度。 nice的取值范围为-20到19。 通常情况下,nice的默认值为0。视具体操作系统而定。 nice的值越大,进程的优先级就越低,获得CPU调用的机会越少,nice值越小,进程的优先级则越高,获得CPU调用的机会越多。 一个nice值为-20的进程优先级最高,nice值为19的进程优先级最低。 父进程fork出来的子进程nice值与父进程相同。父进程renice,子进程nice值不会随之改变。词源考究nice这个命令的来源几乎没有资料提到,于是便尝试自己来推断一下。在诸如词霸,沪江等词典给出的意思均为好的;美好的;可爱的;好心的,友好的。而有道词典则稍微给出了一个其他词典没有的和蔼的。个人认为有道给出的这个比较合理。要想做到和蔼,就需要做到谦让,因此或多或少牺牲自己一点,成全他人。所以nice值越高,越和蔼,但是自己的优先级也会越低。renice对于一个新的进程我们可以按照下面的代码为一个进程设定nice值。1. nice-n10adblogcat对于已经创建的进程,我们可以使用renice来修改nice值1. sudorenice-n0-p24161该命令需要使用root权限,-p对应的值为进程id。注意renice命令在Linux发行版中-n 的值应该为进程的目标优先级。而Mac下-n,则是代表对当前权限的增加值。 比如在Mac下,讲一个进程的nice值由19改成10,可以这样操作sudo renice -n -9 -p 24161,这一点需要注意,避免掉进坑里。Android中的nice由于Android基于Linux Kernel,在Android中也存在nice值。但是一般情况下我们无法控制,原因如下: Android系统并不像其他Linux发行版那样便捷地使用nice命令操作。 renice需要root权限,一般应用无法实现。线程调度虽然对于进程的优先级,我们无法控制,但是我们可以控制进程中的线程的优先级。在Android中有两种线程的优先级,一种为Android API版本,另一种是 Java 原生版本。Android APIAndroid中的线程优先级别目前规定了如下,了解了进程优先级与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。1. newThread()2. Override3. publicvoidrun()4. super.run();5. android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);6. 7. .start();Java原生APIJava为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的线程优先级和Java原生API的优先级是相对独立的,比如使用 android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND) 后,使用Java原生API,Thread.getPriority()得到的值不会改变。如下面代码:1. newThread()2. Override3. publicvoidrun()4. super.run();5. Log.i(LOGTAG,JavaThreadPriorityBefore=+Thread.currentThread().getPriority();6. Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);7. Log.i(LOGTAG,JavaThreadPriority=+Thread.currentThread().getPriority();8. 9. .start();上述代码的运行日志为1. I/MainActivity(3679):JavaThreadPriorityBefore=5I/MainActivity(3679):JavaThreadPriority=5由于上面的这一点缺陷,导致我们在分析ANR trace时需要注意,在下面的ANR日志信息中,prio=5中proi的值对应的Java原生API的线程优先级。而nice=-6中的nice表示的Android API版本的线程优先级。1. mainprio=5tid=1NATIVE2. |group=mainsCount=1dsCount=0obj=0x41690f18self=0x4167e6503. |sysTid=1765nice=-6sched=0/0cgrp=appshandle=10741968884. |state=Sschedstat=(000)utm=5764stm=3654core=25. #00pc00022624/system/lib/libc.so(_futex_syscall3+8)6. #01pc0000f054/system/lib/libc.so(_pthread_cond_timedwait_relative+48)7. #02pc0000f0b4/system/lib/libc.so(_pthread_cond_timedwait+64)避免ANR我在之前的文章说说Android中的ANR中提到使用WorkerThread处理耗时IO操作,同时将WorkerThread的优先级降低,对于耗时IO操作,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安徽中澳科技职业学院单招职业倾向性测试题库及答案1套
- 2026年上海财经大学浙江学院单招职业适应性测试必刷测试卷及答案1套
- 2026年吉林省四平市单招职业适应性测试题库附答案
- 2026年海南健康管理职业技术学院单招职业倾向性考试题库附答案
- 2026年内蒙古巴彦淖尔盟单招职业倾向性测试题库新版
- 2026年广西经济职业学院单招职业技能测试题库新版
- 2026年运城幼儿师范高等专科学校单招职业适应性考试必刷测试卷新版
- 2026年吉林工程职业学院单招职业技能测试必刷测试卷必考题
- 2026年贵州护理职业技术学院单招职业技能考试题库必考题
- 2026年玉溪农业职业技术学院单招职业技能测试题库必考题
- 咏史完整版本
- 汉字笔画练习字帖
- 塔磨机安全操作规程
- 消防水泵房巡检签到表
- 全科医师转岗培训理论考试试题及答案
- 公会之间挂靠主播合作协议书
- 实验三基因组序列分析
- 2022年澄迈县辅警招聘笔试试题及答案解析
- 小学语文人教三年级上册 童话中有趣的角色
- 2022年临沧边境经济合作区国有资本投资运营有限公司招聘笔试试题及答案解析
- 思想道德与法治课件:第六章 第三节 维护宪法权威
评论
0/150
提交评论