我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android平台上的进程调度探讨

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

  从上图我们可知:

  ● 重点讨论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; } …… }


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android平台上的进程调度探讨

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

下载Word文档

猜你喜欢

Android平台上的进程调度探讨

一由来近在翻阅MediaProvider的时候,突然想起之前碰到的一个问题,该问题是这样的:一个Pad上有很多媒体文件,然后每次开机后的一段时间内,Home Screen的反应都特别慢,有时候还会报出ANR的错误。从ANR文件/data/a
2022-06-06

Linux平台上使用Python进行脚本调试的技巧

Linux平台上使用Python进行脚本调试的技巧在Linux平台上使用Python进行脚本调试是开发过程中常见的任务之一。脚本调试可以帮助我们快速定位和修复代码中的错误,提高开发效率。本文将介绍一些在Linux平台上使用Python进行脚
2023-10-22

基于微信小程序的网上购物平台小程序的设计与实现 服务器端口php+mysql(附源码 调试 文档)

基于微信小程序的网上购物平台小程序 一、引言二、国内外研究现状三、系统需求分析四、系统设计五、系统实现六、系统测试与评估七、结论八、界面展示九、源码获取 摘要 本文介绍了一种基于微信小程序的网上购物平台小程序,该系统主要分为两
基于微信小程序的网上购物平台小程序的设计与实现 服务器端口php+mysql(附源码 调试 文档)
2023-12-22

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录