Sobes.tech
Middle+

Como pode ocorrer uma situação em que uma fila com prioridade menor acede aos recursos antes de uma fila com prioridade mais alta?

sobes.tech IA

Resposta da IA

Isto pode acontecer devido à inversão de prioridades.

A inversão de prioridades ocorre quando uma tarefa de baixa prioridade mantém um recurso (por exemplo, um mutex) necessário para uma tarefa de alta prioridade. A tarefa de alta prioridade fica bloqueada esperando que o recurso seja liberado. Ao mesmo tempo, uma tarefa de prioridade média pode ser preemptada por outra tarefa que não necessita desse recurso. Como resultado, a tarefa de prioridade média executa-se enquanto a tarefa de baixa prioridade, que mantém o recurso, e a tarefa de alta prioridade, que está bloqueada, aguardam. A tarefa de alta prioridade na verdade espera que as tarefas de prioridade média e a de baixa prioridade liberem o recurso.

Soluções para o problema de inversão de prioridades:

  • Herança de prioridades (Priority Inheritance): Quando uma tarefa de baixa prioridade mantém um recurso necessário para uma tarefa de alta prioridade, ela recebe temporariamente a prioridade da tarefa bloqueada de alta prioridade. Após liberar o recurso, a prioridade retorna à original.
  • Protocolo de teto de prioridade (Priority Ceiling Protocol): A cada recurso é atribuído um "teto de prioridade" — a prioridade mais alta entre todas as tarefas que podem usar esse recurso. Uma tarefa só pode acessar o recurso se sua prioridade atual for superior ao teto de prioridade de todos os recursos ocupados no momento (incluindo aqueles que ela já mantém).

No iOS, Grand Central Dispatch (GCD) e Operation Queues possuem mecanismos para minimizar a inversão de prioridades, mas em cenários complexos com bloqueios, tais situações ainda podem ocorrer se forem usados incorretamente.