7

优先级反转是由于与它们关联的优先级而在调度线程/进程期间可能发生的问题。Android中可能发生优先级反转

优先级反转是调度问题的方案,其中一个 高优先级任务是间接通过有效中等优先级任务 “反相”抢占两个任务的相对优先级 - Wikipedia

我奇怪的是,Android中可以优先倒置,因为我们知道Android提供了不同优先级的进程see this post。此外,我们可以创建多个线程(在活动和服务中)具有不同的优先级,它们如何适合这种情况?我看到一篇文章谈到Thread Scheduling in Android。如果发生优先倒置,我们如何检测并避免它?

当我在寻找这个问题的答案时,我发现了Android的this页面,它告诉我们如何避免Android音频系统中的优先倒置。

+1

这是你应该担心的。大致上每个有优先级的系统都有这个功能。但是只有当你编写“不好”的代码时才会发生这种情况,要求它以特定的顺序/某些优先级执行。此外音频系统链接也回答你的问题(“*试图避免优先倒置*”):) – zapl

+0

优先倒置通常不会发生由于错误的代码,而是取决于如何通过操作系统(或某些语言的编译器)而且它确实关系到开发者,如果语言保证不会发生优先级反转,那么我们就不必担心它的回避/预防等。 – penguin

+0

s /坏代码/坏系统设计。您不必编写同时竞争共享资源的代码。另外,如果争用(很大程度上受到系统设计的影响)足够高,它只会变得很糟糕。偶尔的优先级反转调度不会损害大多数系统。 – zapl

回答

5

简短的答案

,可发生于Android的优先级反转,如您所提供的link详细说明。

的问题

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

优先级反转带来的主要问题是较低优先级的任务被给予较少的CPU周期来执行。如果时间敏感的高优先级任务被低优先级任务阻塞,那么它可能需要等待无法接受的长时间才能执行,并导致系统某处发生故障或降低用户体验。

传统的解决方案

传统的解决方案是优先级继承。通过优先级继承,保存共享资源的任务(线程或进程)将临时继承在该资源上阻塞的最高优先级任务的优先级。这解决了这个问题,因为低优先级任务的执行速度要快得多,为时间敏感的任务释放资源。

具有此功能的互斥锁(快速用户空间互斥锁)在Linux Kernel中可用。但是,他们是而不是在Android标准C库中可用,因为security concerns因为它们涉及大量的开销。

的Android解决方案

的Android开源项目recommends几种不同的方法来处理的优先级反转问题。

  • “尝试锁定”/超时锁定 - 在低优先级任务持续多久时间内强制执行一段超时时间,使得高优先级任务更有可能及时获得访问权限。缺点是如果有一系列不相关的低优先级任务具有较长的累积超时时间。
  • 在某些情况下,互斥或其他同步原语可以用适当的原子操作集合以及对称多处理来代替。有关这方面的指导提供here
  • 您还可以实现无锁定的单读取器,单写入器FIFO任务队列。这被描述为herehere

共同所有的这些方法的基本主题是,以尽量减少对高和低优先级rasks之间共享资源的锁的数量,或减轻其影响,如果他们真的不能被删除。目前,这些技术都在Android中用于减少优先级反转问题。

检测

这是很难发生之前自动检测优先级反转。如果您怀疑它正在发生,您可以使用诸如systraceps -t -p等工具来测试您的假设,以检查您的不同进程花费在执行和阻止上的时间。最好的建议是对你正在处理的系统的不同部分以及优先级反转问题有一个很好的理解。