可以在Android中发生优先级倒置

7 java multithreading android operating-system priority-inversion

由于与它们相关的优先级,优先级倒置是在线程/进程的调度期间可能发生的问题.

优先级倒置是调度中的一个有问题的场景,其中高优先级任务被中等优先级任务间接抢占,有效地"反转"两个任务的相对优先级 - 维基百科

我想知道,Android中可以发生优先级倒置,因为我们知道Android提供了不同优先级的不同进程,请参阅这篇文章.我们还可以创建具有不同优先级的多个线程(在活动和服务中),它们如何适应这种情况?我看到一篇文章讨论Android中的线程调度.如果发生优先级倒置,我们如何检测并避免它?

当我在寻找这个问题的答案时,我通过Android 找到了这个页面,它告诉我们如何在Android的音频系统环境中避免优先级倒置.

Jac*_*hie 5

简答

是的,Android中可以发生优先级倒置,详见您提供的链接.

问题

任何允许具有不同优先级的任务来锁定同一共享资源的系统都容易受到优先级倒置的影响,除非采取措施来防止它.您提到了线程和进程 - 在Android中,状态可以在进程和线程之间共享,这使得它们都容易受到优先级倒置的影响.

优先级倒置带来的主要问题是较低优先级的任务被给予较少的CPU周期来执行.如果低优先级任务阻止了时间敏感的高优先级任务,则可能需要等待不可接受的长时间执行,并导致系统某处出现故障或降低用户体验.

传统解决方案

传统的解决方案是优先级继承.使用优先级继承,保存共享资源的任务(线程或进程)将临时继承在该资源上阻塞的最高优先级任务的优先级.这解决了这个问题,因为低优先级任务将更快地执行,从而为时间敏感的任务释放资源.

具有此功能的Futexes(快速用户空间互斥)可在Linux内核中使用.但是,由于存在安全问题,并且因为它们涉及大量开销,因此它们在Android标准C库中不可用.

Android解决方案

Android开源项目推荐了几种不同的方法来处理优先级倒置问题.

  • "try lock"/ lock with timeout - 对低优先级任务可以保存互斥锁的时间强制执行一些超时时间,使高优先级任务更有可能及时获得访问权限.缺点是如果存在一系列具有长累积超时的不相关低优先级任务.
  • 在某些情况下,互斥或其他同步原语可以由适当的原子操作集以及对称多处理替换.这里提供了相关指南.
  • 您还可以实现无锁单读取器,单写入器FIFO任务队列.这里这里描述了一点.

所有这些方法的共同基本主题是最大限度地减少高优先级和低优先级rasks之间共享资源的锁定量,或者在真正无法删除它们时减轻其影响.目前,这些技术都在Android中使用,以减少优先级倒置问题.

发现

在发生优先级倒置之前很难自动检测优先级倒置.如果您怀疑它正在发生,您可以使用诸如此类的工具来测试您的假设,systraceps -t -p检查您的不同流程执行和阻止所花费的时间.最好的建议是要很好地理解你正在处理的系统的不同部分,以及优先级倒置的问题.