Android 进程管理篇(五)-调度策略与优先级

Android 进程管理篇(五)-调度策略与优先级,第1张

接上篇cpuset,这篇来看看进程优先级与调度策略管理。

Linux中,优先级号一共有0-139,其中0-99的是RT(实时)进程,100-139的是非实时进程。

数字越低优先级越高。

SCHED_IDLE idle状态低优先级进程调度

先看Process中调度策略的划分,与上面介绍的一样。

首先在AMS中封装了FIFO和NORMAL的两个策略,NORMAL好说,看看FIFO在哪用到

这里Process.setThreadScheduler并没有太多的应用,我们直接来看优先级设置吧。else中将top app的UI线程与render线程都设置为TOP_APP_PRIORITY_BOOST优先级,nice值为-10,非常高。

这里主要调用androidSetThreadPriority方法

这里通过set_sched_policy来调整调度策略,并通过setpriority设置进程优先级。这里不特意区分进程与线程了,反正在linux中都是进程。

这里与前面的cpuset非常相似,依然是写节点,节点前面也提了就是:

那么这里又引入了一个schedtune子系统,简单介绍下:

schedtune是ARM/Linaro为了EAS新增的一个子系统,主要用来控制进程调度选择CPU以及boost触发。通过权重来分配CPU负载能力来实现快速运行。高权重意味着会享受到更好的cpu负载来处理对应的任务,换句话说你能享受相对更好的cpu运行性能。

简单梳理下schedtune和不同类型SchedPolicy之间的对应关系:

看下具体文件夹内容:

系统配置:

这里/dev/stune相关配置只做了这么一个

在android应用开发时,我们经常会在后台开一个service,来处理一些业务 *** 作。最近公司的一个项目就是,通过service不断地和硬件设备交互,获取数据,在页面长时间停留在一个页面时,手机的屏幕会出项锁屏的状况,这时,我们的应用的优先级就会下降,很多次,等打开屏幕的瞬间,我发现原来的原来的进程被杀死了,应用又回到了首页,尤其是在Android高版本的系统中尤为突出。所以下面我们通过提成优先级的方式,来进行进程保活

2.在程序开始的地方注册这个广播接收者

4.定义这个activity的style属性 value - style.xml 文件

5.Androidmanifest文件中注册这个activity

大功告成!

经过测试,本人的华为荣耀9i,原来存在的问题被解决了,希望大家能互相交流经验。

在处理app启动速度的时候,可以设置主线程的优先级,保证主线程占用的cpu足够久。进程的oom_adj,决定了当内存不够的时候,lmk会根据oom_adj的大小依次释放内存。

android中对线程等级划分如下:

设置线程的优先级分为:android 提供的api和java sdk自带的api

注意: 要使用android提供的api设置,用java提供的作用不够显著

作用: 可以在主线程设置主线层等级;在Glide加载图片的时候设置低优先级。当图片量很大的时候可以降低加载图片线程的等级

android内存不够了,会触发oom机制,lowMemoryKiller会根据每个进程的oom_adj的等级,依次杀死进程,释放内存。

lom会根据free的内存的值,来判断kill掉哪个等级下的进程。例如当空闲内存只有64M了。会kill掉oom_adj 为12-15的进程

真实案例:应用A跳到第三方应用B,在第三方应用B中播放视频,加载大量图片,导致返回的时候,应用A走了SplashActivity。通过logcat发现A应用被kill掉了


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/7815439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存