返回顶部
首页 > 资讯 > 移动开发 >剖析Android中进程与线程调度之nice
  • 879
分享到

剖析Android中进程与线程调度之nice

nice进程线程Android 2022-06-06 12:06:35 879人浏览 八月长安
摘要

  在计算机操作系统中,进程是进行资源分配和调度的基本单位,同时每个进程之内也可以存在多个线程。那么在Android系统(linux Kernel)中,进程是如何去抢占资源

  在计算机操作系统中,进程是进行资源分配和调度的基本单位,同时每个进程之内也可以存在多个线程。那么在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值。   nice -n 10 adb loGCat   对于已经创建的进程,我们可以使用renice来修改nice值   sudo renice -n 0 -p 24161   该命令需要使用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 API   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 () {   @Override   public void run() {   super.run();   android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);   }   }.start();   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的线程优先级和Java原生API的优先级是相对独立的,比如使用 android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND) 后,使用Java原生API,Thread.getPriority()得到的值不会改变。如下面代码:   new Thread() {   @Override   public 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   由于上面的这一点缺陷,导致我们在分析ANR trace时需要注意,在下面的ANR日志信息中,prio=5中proi的值对应的Java原生API的线程优先级。而nice=-6中的nice表示的Android API版本的线程优先级。   "main" prio=5 tid=1 NATIVE   | group="main" sCount=1 dsCount=0 obj=0x41690f18 self=0x4167e650   | sysTid=1765 nice=-6 sched=0/0 cgrp=apps handle=1074196888   | state=S schedstat=( 0 0 0 ) utm=5764 stm=3654 core=2   #00  pc 00022624  /system/lib/libc.so (__futex_syscall3+8)   #01  pc 0000f054  /system/lib/libc.so (__pthread_cond_timedwait_relative+48)   #02  pc 0000f0b4  /system/lib/libc.so (__pthread_cond_timedwait+64)   避免ANR   我在之前的文章说说Android中的ANR中提到使用WorkerThread处理耗时IO操作,同时将WorkerThread的优先级降低,对于耗时IO操作,比如读取数据库,文件等,我们可以设置该workerThread优先级为THREAD_PRIORITY_BACKGROUND,以此降低与主线程竞争的能力。


--结束END--

本文标题: 剖析Android中进程与线程调度之nice

本文链接: https://lsjlt.com/news/28588.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 剖析Android中进程与线程调度之nice
      在计算机操作系统中,进程是进行资源分配和调度的基本单位,同时每个进程之内也可以存在多个线程。那么在Android系统(Linux Kernel)中,进程是如何去抢占资源...
    99+
    2022-06-06
    nice 进程 线程 Android
  • 怎么剖析Linux进程调度时机
    怎么剖析Linux进程调度时机,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Linux在众多进程中是怎么进行调度的,这个牵涉到Linux进程调度时机的概念,由Linux内核...
    99+
    2023-06-16
  • Go语言kube-scheduler深度剖析与开发之pod调度
    目录正文感知 Pod取出 Pod调度 Pod正文 为了深入学习 kube-scheduler,本系从源码和实战角度深度学 习kube-scheduler,该系列一共分6篇文章,如下:...
    99+
    2023-05-17
    Go kube-scheduler开发剖析 Go kube-scheduler
  • 深度解析Python线程和进程
    目录什么是进程什么是线程线程与进程的区别并行与并发Python中的多进程Python中进程操作线程Python的threading模块锁Lock:全局解释器锁(GIL)参考文章:什么...
    99+
    2024-04-02
  • FreeRTOS进阶之调度器启动过程分析
    目录FreeRTOS基本程序架构启动FreeRTOS调度器Cortex-M3中断优先级SVC中断服务函数FreeRTOS基本程序架构 int main(void) { 必...
    99+
    2024-04-02
  • python之多线程与多进程
    1. 多进程与多线程 (1)背景:为何需要多进程或者多线程:在同一时间里,同一个计算机系统中如果允许两个或者两个以上的进程处于运行状态,这便是多任务。多任务会带来的好处例如用户边听歌、边上网、边打印,而这些任务之间丝毫不会互相干扰。使用多...
    99+
    2023-01-31
    之多 线程 进程
  • android中UI主线程与子线程深入分析
    本文较为深入的分析了android中UI主线程与子线程。分享给大家供大家参考。具体如下: 在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,...
    99+
    2022-06-06
    线程 Android
  • 图解分析Javaweb进程与线程
    目录一、认识进程1,线程初识2,进程属性二、为什么要有线程三、认识线程与进程的区别四、Linux中的线程1,内核态与用户态2,PCB描述线程五、多种类型1,单进程单线程2,多进程单线...
    99+
    2024-04-02
  • Android编程之Activity中onDestroy()调用分析
    本文分析了Android编程之Activity中onDestroy()调用方法。分享给大家供大家参考,具体如下: 刚刚一个BUG让我发现,如果 activity 实现了一个回调...
    99+
    2022-06-06
    调用 activity Android
  • 操作系统线程剖析:用户级线程与内核级线程的异同
    线程简介 线程是进程中独立执行的基本单元,可以共享进程的数据,并具有独立的程序计数器、堆栈和寄存器等。线程的引入使得程序可以并发执行,从而提高了程序的执行效率。 用户级线程与内核级线程 线程可以分为用户级线程和内核级线程。用户级线程由用...
    99+
    2024-02-06
    线程 用户级线程 内核级线程 进程 并发 调度
  • Python3 异步编程之进程与线程-1
    Python3 异步编程之进程与线程-1一、了解进程间通信进程间通信进程线程线程 vs 进程IO模型并发 vs 并行异步 vs 同步二、多线程与多进程的用法计算密集型 vs I/O密集型GIL多线程多进程三、协程的好处与用法协程yieldy...
    99+
    2023-01-31
    线程 进程
  • 分析Android中线程和线程池
    目录前言HandlerThreadIntentService线程池的好处ThreadPoolExecutor线程池的分类FixedThreadPoolCachedThreadPool...
    99+
    2024-04-02
  • Android应用程序模型之应用程序,任务,进程,线程分析
    本文讲述了Android应用程序模型之应用程序,任务,进程,线程。分享给大家供大家参考,具体如下: 大多数操作系统,在应用程序所寄存的可执行程序映像(如Windows系统里的....
    99+
    2022-06-06
    进程 程序 模型 线程 Android
  • Android平台上的进程调度探讨
      一由来近在翻阅MediaProvider的时候,突然想起之前碰到的一个问题,该问题是这样的:   一个Pad上有很多媒体文件,然后每次开机后的一段时间内,Home ...
    99+
    2022-06-06
    进程 进程调度 Android
  • Javaweb进程与线程的示例分析
    这篇文章将为大家详细讲解有关Javaweb进程与线程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、认识进程1,线程初识一个可执行程序运行起来,就可以看作是一个进程进程也是操作系统分配资源的最...
    99+
    2023-06-29
  • android编程之多线程编程实例分析
    本文实例讲述了android编程之多线程编程实现方法。分享给大家供大家参考。具体分析如下: 该功能与前面《android开发socket编程之udp发送实例分析》中一样,当按下...
    99+
    2022-06-06
    程之 多线程编程 多线程 线程 Android
  • Node.js 事件循环中的线程调度与并发
    ...
    99+
    2024-04-02
  • JUC并发编程中进程与线程的示例分析
    这篇文章将为大家详细讲解有关JUC并发编程中进程与线程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,...
    99+
    2023-06-29
  • Linux的进程线程及调度的概念是什么
    这篇“Linux的进程线程及调度的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux的进程线程及调度的概念是...
    99+
    2023-06-28
  • 深入剖析 Java 线程池的原理与实践
    原理 线程池维护一个固定大小的线程池,这些线程处于空闲状态,等待处理任务。当一个任务提交给线程池时,它会分配一个空闲线程来执行它。如果所有线程都处于繁忙状态,则新任务将放入队列中等待执行。 线程池的常见参数包括: 核心线程数:线程池中最...
    99+
    2024-03-13
    线程池
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作