Ako môže prísť k situácii, keď fronta s nižšou prioritou získa prístup k zdrojom skôr ako fronta s vyššou prioritou?
sobes.tech AI
Odpoveď od AI
Toto sa môže stať kvôli inverzii priorít.
Inverzia priorít nastáva, keď úloha s nízkou prioritou drží zdroj (napríklad mutex), ktorý je potrebný pre úlohu s vysokou prioritou. Úloha s vysokou prioritou je zablokovaná, čakajúc na uvoľnenie zdroja. Zároveň môže byť úloha so strednou prioritou preemptovaná inou úlohou, ktorá tento zdroj nepotrebuje. Výsledkom je, že úloha so strednou prioritou beží, zatiaľ čo úloha s nízkou prioritou, ktorá drží zdroj, a úloha s vysokou prioritou, ktorá je zablokovaná, čakajú. V skutočnosti úloha s vysokou prioritou čaká na uvoľnenie zdrojov od úloh so strednou a nízkou prioritou.
Riešenia problému inverzie priorít:
- Dedičstvo priorít (Priority Inheritance): Keď úloha s nízkou prioritou drží zdroj potrebný pre úlohu s vysokou prioritou, dočasne jej je pridelená priorita blokovanej úlohy s vysokou prioritou. Po uvoľnení zdroja sa priorita vráti na pôvodnú.
- Protokol stropu priorít (Priority Ceiling Protocol): Každému zdroju je pridelený "strop priorít" — najvyšší priorita medzi všetkými úlohami, ktoré môžu tento zdroj použiť. Úloha môže získať prístup ku zdroju iba vtedy, ak jej aktuálna priorita je vyššia ako strop priorít všetkých aktuálne obsadených zdrojov (vrátane tých, ktoré už drží).
Na iOS majú Grand Central Dispatch (GCD) a Operation Queues mechanizmy na minimalizáciu inverzie priorít, ale v zložitých scenároch s blokádami sa takéto situácie môžu stále vyskytnúť, ak sú nesprávne používané.