AMS防止优先级反转

ActivityManagerService中有这么两个方法,resetPriorityAfterLockedSection()和boostPriorityForLockedSection()。直接搜是看不到这两个方法在哪被调用的,这个涉及到ASM插桩,详细可以见:
Google教你用ASM:lockedregioncodeinjection

再此之前我们先理解一下什么叫优先级反转

我们先假设三个任务准备执行,A,B,C,它们的优先级依次是A>B>C;

首先:C处于运行状态,获得CPU正在执行,同时占有了某种资源。

其次:A进入就绪状态,因为A优先级比C高,所以A获得CPU,A转为运行状态;C进入就绪状态;

第三:执行过程中需要使用资源,而这个资源又被等待中的C占有的,于是A进入阻塞状态,C回到运行状态;

第四:此时B进入就绪状态,因为优先级比C高,B获得CPU,进入运行状态;C又回到就绪状态;

此时,我们的B任务反而优先于A任务运行。

ASM解决优先级的方式:将线程优先级提高到UI优先级

我们可以先看AMS中代码:

 private static ThreadPriorityBooster sThreadPriorityBooster = new ThreadPriorityBooster(
           THREAD_PRIORITY_FOREGROUND, LockGuard.INDEX_ACTIVITY);

THREAD_PRIORITY_FOREGROUND:Standard priority of threads that are currently running a user interface that the user is interacting with. Applications can not normally change to this priority; the system will automatically adjust your application threads as the user moves through the UI.
大意就是这是UI线程的标准优先级,当用户进行在操作UI时,系统会自动调整APP到此优先级。

接下来我们看调整优先级的方法:

839    static void boostPriorityForLockedSecti
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值