Kaip gali atsitikti situacija, kai žemesnio prioriteto eilė gauna prieigą prie išteklių anksčiau nei aukštesnio prioriteto eilė?
sobes.tech AI
Atsakymas iš AI
Tai gali įvykti dėl prioritetų inversijos.
Prioritetų inversija įvyksta, kai žemo prioriteto užduotis laiko išteklių (pvz., mutex), kuris yra būtinas aukšto prioriteto užduočiai. Aukšto prioriteto užduotis yra užblokuota, laukdama išteklių atlaisvinimo. Tuo pačiu metu, vidutinio prioriteto užduotis gali būti praleista kita užduotis, kuri nereikalauja šio ištekliaus. Dėl to, vidutinio prioriteto užduotis vyksta, kol žemo prioriteto užduotis, kuri laiko išteklių, ir aukšto prioriteto užduotis, kuri yra užblokuota, laukia. Iš tikrųjų, aukšto prioriteto užduotis laukia, kol vidutinio ir žemo prioriteto užduotys atlaisvins išteklius.
Sprendimai prioritetų inversijos problemai:
- Prioritetų paveldėjimas (Priority Inheritance): Kai žemo prioriteto užduotis laiko išteklių, reikalingą aukšto prioriteto užduočiai, jai laikinai priskiriamas aukšto prioriteto užduoties prioritetas. Po išteklių atlaisvinimo, prioritetas grįžta į pradinį.
- Prioritetų lubų protokolas (Priority Ceiling Protocol): Kiekvienam ištekliui priskiriama "lubų prioritetas" — aukščiausias prioritetas tarp visų užduočių, kurios gali naudoti šį išteklių. Užduotis gali pasiekti išteklių tik tada, jei jos dabartinis prioritetas yra aukštesnis nei lubų prioritetas visų šiuo metu užimtų išteklių (įskaitant tuos, kuriuos ji jau laiko).
iOS, Grand Central Dispatch (GCD) ir Operation Queues turi mechanizmus, skirtus sumažinti prioritetų inversiją, tačiau sudėtinguose scenarijuose su užrakinimais tokios situacijos vis dar gali įvykti, jei jie naudojami netinkamai.