iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android平台上的进程调度探讨
  • 761
分享到

Android平台上的进程调度探讨

进程进程调度Android 2022-06-06 12:06:59 761人浏览 安东尼
摘要

  一由来近在翻阅MediaProvider的时候,突然想起之前碰到的一个问题,该问题是这样的:   一个Pad上有很多媒体文件,然后每次开机后的一段时间内,Home

  一由来近在翻阅MediaProvider的时候,突然想起之前碰到的一个问题,该问题是这样的:

  一个Pad上有很多媒体文件,然后每次开机后的一段时间内,Home Screen的反应都特别慢,有时候还会报出ANR的错误。从ANR文件/data/anr/traces.txt分析,发现系统打印的cpu占有率中,Android.process.media占用非常高。所以怀疑是MediaProvider做文件扫描占用CPU太多资源导致。

  但是我们实际测试的时候,通过top –m 5查看cpu占有率的时候,发现只要一操作Home,android.process.media进程cpu占有率会下降很多。

  当时看到这个现象,直观感觉是MediaProvider抢占CPU能力不够。直接把该现象告诉领导,这个事情也结了。但是一直没在代码中找到依据:总有地方设置进程的优先级吧??

  后来,时间充裕了,想起这个问题。果不其然,在MediaScannerService中,找到答案:

public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND +                 Process.THREAD_PRIORITY_LESS_FAVORABLE);      …… }   上面代码显示得将本进程的优先级设置为BACKGROUND+LESS_FAVORABLE。

  那么这个优先级是什么呢?

  本随笔将关注两个问题:

  ● Android平台提供的调度接口及其它的实现

  ● 调度一定是依靠linux OS的,那么本随笔也会顺便介绍一下Linux OS中的进程调度相关的知识。

  二、Android平台中的进程调度接口

  从上的Java层看,Anroid提供的Process类封装了进程调度优先级,调度策略等一些api。下图是整体调用流程和相关文件位置。

  从上图我们可知:

  ● 重点讨论Process.java提供的setThreadPriority和setThreadGroup函数。

  ● 调用分发顺序从Java一直贯穿JNI,Native层后,setThreadPriority直接转移到setpriority系统调用,而setThreadGroup通过set_sched_policy处理后,再转移给sched_setscheduler系统调用。

  2.1 设置调度优先级

  进程调度的优先级,这个应该不难理解。简单地说:

  OS在调度进程的时候是遵循一定规则的,优先级高的进程分配CPU的时间多,而优先级低的进程相对分配的CPU时间少。(这个仅是理论上的,具体如何分配是和OS相关的)

  下面我们看看androidSetThreadPriority的实现。

int androidSetThreadPriority(pid_t tid, int pri) { #if defined(HAVE_PTHREADS)  //目前仅支持POSIX //phtread_once保证这个线程创建时会首先执行一次(,类似Class的constructor) //checkDoSchedulingGroup函数,该函数判断系统是否设置了”debug.sys.noschedgroups”     pthread_once(&gDoSchedulingGroupOnce, checkDoSchedulingGroup);     if (gDoSchedulingGroup) {         if (pri >= ANDROID_PRIORITY_BACKGROUND) {             //设置调度策略。这个我们待会会碰到。             rc = set_sched_policy(tid, SP_BACKGROUND);         } else if (getpriority(PRIO_PROCESS, tid) >= ANDROID_PRIORITY_BACKGROUND) {             rc = set_sched_policy(tid, SP_FOREGROUND);         }     }   ……    //设置调度优先级。    if (setpriority(PRIO_PROCESS, tid, pri) < 0) {         rc = INVALID_OPERATION; } …… }


--结束END--

本文标题: Android平台上的进程调度探讨

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作