简短的回答
是的,Android 中可能会发生优先级反转,如您提供的链接中所述。
问题
任何允许具有不同优先级的任务锁定相同共享资源的系统都容易受到优先级倒置的影响,除非采取措施防止这种情况发生。您提到了线程和进程——在 Android 中,进程和线程之间可以共享状态,这使得它们都容易受到优先级反转的影响。
优先级反转带来的主要问题是较低优先级的任务被赋予较少的 CPU 周期来执行。如果一个时间敏感的高优先级任务被一个低优先级任务阻塞,它可能不得不等待非常长的时间才能执行,并且要么导致系统某处出现故障,要么降低用户体验。
传统解决方案
对此的传统解决方案是优先继承。通过优先级继承,持有共享资源的任务(线程或进程)将暂时继承阻塞在该资源上的最高优先级任务的优先级。这解决了问题,因为低优先级任务将执行得更快,从而为时间敏感的任务释放资源。
Linux 内核中提供了具有此功能的 Futexes(快速用户空间互斥锁)。但是,由于安全问题和涉及大量开销,它们在 Android 标准 C 库中不可用。
安卓解决方案
Android 开源项目推荐了几种不同的方法来处理优先级反转问题。
- "try lock" / lock with timeout - 对低优先级任务可以持有互斥锁的时间强制执行一些超时时间,使高优先级任务更有可能及时获得访问权限。缺点是如果有一系列不相关的低优先级任务具有较长的累积超时。
- 在某些情况下,互斥锁或其他同步原语可以被适当的原子操作集以及对称多处理替换。此处提供了这方面的指南。
- 您还可以实现无锁的单读取器、单写入器 FIFO 任务队列。这在此处和此处进行了描述。
所有这些方法的共同基本主题是最大限度地减少高优先级和低优先级 rasks 之间共享的资源锁的数量,或者在它们确实无法删除时减轻它们的影响。目前,这些技术都在 Android 中使用,以减少优先级反转问题。
检测
很难在优先级反转发生之前自动检测到它。如果您怀疑它正在发生,您可以使用工具来检验您的假设,例如检查不同进程执行systrace
和ps -t -p
阻塞所花费的时间。最好的建议是对您正在处理的系统的不同部分以及优先级反转问题有一个很好的了解。