Java 优先级反转会在Android中发生吗

Java 优先级反转会在Android中发生吗,java,android,multithreading,operating-system,priority-inversion,Java,Android,Multithreading,Operating System,Priority Inversion,优先级反转是一个在线程/进程调度过程中可能出现的问题,因为优先级与线程/进程相关 优先级反转是调度中的一个问题场景,其中 高优先级任务被中等优先级任务间接抢占 有效地“颠倒”两项任务的相对优先级: 我想知道,优先级反转是否会在Android中发生,因为我们知道Android提供了不同优先级的进程。此外,我们还可以创建多个具有不同优先级的线程(在活动和服务中),它们如何适应此场景?我看了一篇文章,其中谈到。如果发生优先级反转,我们如何检测并避免它 当我在寻找这个问题的答案时,我找到了安卓的page

优先级反转是一个在线程/进程调度过程中可能出现的问题,因为优先级与线程/进程相关

优先级反转是调度中的一个问题场景,其中 高优先级任务被中等优先级任务间接抢占 有效地“颠倒”两项任务的相对优先级:

我想知道,优先级反转是否会在Android中发生,因为我们知道Android提供了不同优先级的进程。此外,我们还可以创建多个具有不同优先级的线程(在活动和服务中),它们如何适应此场景?我看了一篇文章,其中谈到。如果发生优先级反转,我们如何检测并避免它


当我在寻找这个问题的答案时,我找到了安卓的page,它告诉我们如何在安卓的音频系统环境中避免优先级反转。

简短的答案

,优先级反转可以在Android中发生,如您提供的中所述

问题

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

优先级反转带来的主要问题是,低优先级任务的CPU执行周期更少。如果时间敏感的高优先级任务被低优先级任务阻止,它可能需要等待不可接受的长时间才能执行,并可能导致系统中的某个地方出现故障或降低用户体验

传统解决方案

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

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

Android解决方案

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

  • “try lock”/lock with timeout-对低优先级任务可以保持互斥锁的时间强制执行一些超时,使高优先级任务更有可能及时获得访问权限。缺点是,如果存在一系列不相关的低优先级任务,且累积超时时间较长
  • 在某些情况下,可以用一组适当的原子操作以及对称多处理来替换互斥或其他同步原语。提供了关于这方面的指南
  • 您还可以实现无锁的单读取器、单写入器FIFO任务队列。这是描述和描述的
所有这些方法的共同基本主题是最大限度地减少高优先级和低优先级锉刀之间共享的资源上的锁的数量,或者在它们确实无法移除时减轻它们的影响。目前,这些技术都在Android中使用,以减少优先级反转问题

检测


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

这不需要担心。几乎每个有优先权的系统都有优先权。但是,只有当您编写了“糟糕”的代码,要求它以特定的顺序/优先级执行时,才会发生这种情况。此外,音频系统链接也回答了您的问题(“尝试避免优先级反转”):)优先级反转通常不会因为错误代码而发生,而是取决于操作系统(或某些语言中的编译器)如何执行调度,这确实会关系到开发人员,如果一种语言保证不会发生优先级反转,那么我们就不必担心它的避免/预防等问题,您也不必编写同时竞争共享资源的代码——这不是答案。在多线程中,线程/进程争夺共享资源是不可避免的,但可以使用信号量、锁等进行管理。实际上,这不是我的实际问题,我们正在讨论避免/预防,我的问题是,由于进程和线程相关联的优先级,Android中是否真的会发生优先级反转“这不是答案“因此,我只是在评论:),有一些关于Android调度的细节。@Oren谢谢,你提出了一个中断点。我同意不同的制造商可能有或没有不同版本的安卓操作系统,但他们不太可能有不同的操作系统内核。通常,制造商会调整Android的UI部分,即使他们有不同的内核,每个内核都会有相同的线程调度算法和线程优先级,而这些是导致优先级反转的最重要因素。