Sobes.tech
Middle+

Jak může dojít k situaci, kdy fronta s nižší prioritou získá přístup k prostředkům dříve než fronta s vyšší prioritou?

sobes.tech AI

Odpověď od AI

To se může stát kvůli inverzi priorit.

Inverze priorit nastává, když úkol s nízkou prioritou drží zdroj (například mutex), který je potřebný pro úkol s vysokou prioritou. Úkol s vysokou prioritou je zablokován, čekajíc na uvolnění zdroje. Zároveň může být úkol se střední prioritou předběhnut jiným úkolem, který tento zdroj nepotřebuje. Výsledkem je, že úkol se střední prioritou běží, zatímco úkol s nízkou prioritou, který zdroj drží, a úkol s vysokou prioritou, který je zablokován, čekají. Ve skutečnosti úkol s vysokou prioritou čeká, až úkoly se střední a nízkou prioritou uvolní zdroj.

Řešení problému inverze priorit:

  • Dědičnost priorit (Priority Inheritance): Když úkol s nízkou prioritou drží zdroj potřebný pro úkol s vysokou prioritou, dočasně mu je přiřazena priorita blokovaného úkolu s vysokou prioritou. Po uvolnění zdroje se priorita vrátí na původní.
  • Protokol stropu priority (Priority Ceiling Protocol): Každému zdroji je přiřazena "stropní priorita" — nejvyšší priorita mezi všemi úkoly, které mohou tento zdroj používat. Úkol může získat přístup ke zdroji pouze tehdy, pokud je jeho aktuální priorita vyšší než stropní priorita všech právě používaných zdrojů (včetně těch, které již drží).

Na iOS mají Grand Central Dispatch (GCD) a Operation Queues mechanismy pro minimalizaci inverze priorit, ale v složitých scénářích s blokováním se takové situace stále mohou vyskytnout, pokud jsou nesprávně používány.