android cpu调度策略_随笔之Android平台上的进程调度探讨

本文详细探讨了Android平台上进程调度的原理,从Java层的API到Linux内核的实现,包括进程优先级设置、调度策略和Linux的CFS调度算法。通过对MediaScannerService中线程优先级设置的实例分析,揭示了Android如何利用Linux OS的调度机制,并介绍了Linux进程调度的基础知识和CFS算法的完美多任务模型。
摘要由CSDN通过智能技术生成

http://blog.csdn.net/innost/article/details/6940136

随笔之Android平台上的进程调度探讨

一由来

最近在翻阅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。下图是整体调用流程和相关文件位置。

图1 进程调度的API以及调用分发流程

从上图我们可知:

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

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

2.1 设置调度优先级

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

l         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) 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值