Kako može doći do situacije u kojoj red sa nižim prioritetom dobija pristup resursima pre reda sa višim prioritetom?
sobes.tech АИ
Одговор од АИ
Ovo se može dogoditi zbog inverzije prioriteta.
Inverzija prioriteta nastaje kada zadatak niske prioriteta drži resurs (npr. mutex) koji je potreban zadatku visoke prioriteta. Zadatak visoke prioriteta je blokiran čekajući da se resurs oslobodi. Istovremeno, zadatak srednje prioriteta može biti preemptovan od strane drugog zadatka koji ne treba taj resurs. Kao rezultat, zadatak srednje prioriteta se izvršava dok zadatak niske prioriteta, koji drži resurs, i zadatak visoke prioriteta, koji je blokiran, čekaju. U stvarnosti, zadatak visoke prioriteta čeka da zadaci srednje i niske prioriteta oslobode resurs.
Rešenja problema inverzije prioriteta:
- Nasleđivanje prioriteta (Priority Inheritance): Kada zadatak niske prioriteta drži resurs potreban zadatku visoke prioriteta, privremeno mu se dodeljuje prioritet blokiranog zadatka visoke prioriteta. Nakon oslobađanja resursa, prioritet se vraća na originalni.
- Protokol plafona prioriteta (Priority Ceiling Protocol): Svakom resursu se dodeljuje "plafon prioriteta" — najviši prioritet među svim zadacima koji mogu koristiti taj resurs. Zadatak može pristupiti resursu samo ako je njegov trenutni prioritet viši od plafona prioriteta svih zauzetih resursa u tom trenutku (uključujući one koje već drži).
Na iOS-u, Grand Central Dispatch (GCD) i Operation Queues imaju mehanizme za minimiziranje inverzije prioriteta, ali u složenim scenarijima sa blokadama, takve situacije i dalje mogu nastati ako se koriste pogrešno.