可以在 Android 中发生优先级反转吗

Can priority inversion occur in Android

优先级倒置 是在安排 threads/processes 期间可能发生的问题,因为与它们相关联的优先级。

Priority inversion is a problematic scenario in scheduling in which a high priority task is indirectly preempted by a medium priority task effectively "inverting" the relative priorities of the two tasks - Wikipedia

我想知道,我们知道 Android 可以提供具有不同优先级 进程 的不同 Android 中的优先级反转 see this post. Also we can create multiple threads (in activities and services) with different priorities, how they fit in this scenario? I saw an article which talks about Thread Scheduling in Android。如果发生优先级倒置,我们如何检测和避免?

当我在寻找这个问题的答案时,我找到了 Android 的 this 页面,它告诉我们如何在 Android 的音频系统的上下文中避免优先级反转.

简答

,在Android中可能会发生优先级反转,详见您提供的link

问题

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

优先级倒置带来的主要问题是较低优先级任务的执行周期较少CPU。如果一个时间敏感的高优先级任务被一个低优先级任务阻塞,它可能不得不等待一段不可接受的长时间来执行,这可能会导致系统某处出现故障或降低用户体验。

传统解决方案

传统的解决方案是优先级继承。通过优先级继承,持有共享资源的任务(线程或进程)将暂时继承阻塞在该资源上的最高优先级任务的优先级。这解决了问题,因为低优先级任务将执行得更快,从而为时间敏感的任务释放资源。

具有此功能的 Futexes(快速用户 space 互斥锁)在 Linux 内核中可用。但是,由于 security concerns 并且它们涉及大量开销,因此 在 Android 标准 C 库中 不可用。

Android 解决方案

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

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

所有这些方法的共同基本主题是尽量减少高优先级和低优先级 rask 之间共享的资源锁的数量,或者如果它们确实无法删除则减轻它们的影响。目前,这些技术都在 Android 中使用,以减少优先级反转问题。

检测

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