Hoe kan het gebeuren dat een wachtrij met een lagere prioriteit eerder toegang krijgt tot bronnen dan een wachtrij met een hogere prioriteit?
sobes.tech AI
Antwoord van AI
Dit kan gebeuren door een inversie van prioriteiten.
Prioriteitsinversie treedt op wanneer een taak met lage prioriteit een bron (bijvoorbeeld een mutex) vasthoudt die nodig is voor een taak met hoge prioriteit. De taak met hoge prioriteit wordt geblokkeerd terwijl hij wacht tot de bron wordt vrijgegeven. Tegelijkertijd kan een taak met middelmatige prioriteit worden gepreëmpt door een andere taak die deze bron niet nodig heeft. Als gevolg hiervan wordt de taak met middelmatige prioriteit uitgevoerd terwijl de taak met lage prioriteit, die de bron vasthoudt, en de taak met hoge prioriteit, die geblokkeerd is, wachten. In werkelijkheid wacht de taak met hoge prioriteit erop dat de taken met middelmatige en lage prioriteit de bron vrijmaken.
Oplossingen voor het prioriteitsinversieprobleem:
- Prioriteitserfelijkheid (Priority Inheritance): Wanneer een taak met lage prioriteit een bron vasthoudt die nodig is voor een taak met hoge prioriteit, krijgt hij tijdelijk de prioriteit van de geblokkeerde taak met hoge prioriteit. Na het vrijgeven van de bron keert de prioriteit terug naar de oorspronkelijke.
- Prioriteitsplafondprotocol (Priority Ceiling Protocol): Aan elke bron wordt een "plafondprioriteit" toegekend — de hoogste prioriteit onder alle taken die deze bron kunnen gebruiken. Een taak kan alleen toegang krijgen tot de bron als haar huidige prioriteit hoger is dan het plafondprioriteit van alle momenteel gebruikte bronnen (inclusief die welke ze al vasthoudt).
Op iOS beschikken Grand Central Dispatch (GCD) en Operation Queues over mechanismen om prioriteitsinversie te minimaliseren, maar in complexe scenario's met blokkades kunnen dergelijke situaties nog steeds voorkomen als ze verkeerd worden gebruikt.