Sobes.tech
Middle+

Kā var rasties situācija, kad zemākas prioritātes rinda saņem piekļuvi resursiem agrāk nekā augstākas prioritātes rinda?

sobes.tech AI

Atbilde no AI

Tas var notikt, ja notiek prioritāšu inversija.

Prioritāšu inversija rodas, kad zema prioritātes uzdevums turē resursu (piemēram, mutex), kas ir nepieciešams augstas prioritātes uzdevumam. Augstas prioritātes uzdevums tiek bloķēts, gaidot resursa atbrīvošanu. Tajā pašā laikā zemas prioritātes uzdevums var tikt pārtraukts ar vidējas prioritātes uzdevumu, kurš nevēlas šo resursu. Rezultātā vidējas prioritātes uzdevums tiek izpildīts, kamēr zemas prioritātes uzdevums, kas tur resursu, un augstas prioritātes uzdevums, kas ir bloķēts, gaida. Augstas prioritātes uzdevums faktiski gaida, kamēr tiek izpildīti vidējas prioritātes uzdevums un zemas prioritātes uzdevums, kas atbrīvo resursu.

Prioritāšu inversijas risinājumi:

  • Prioritāšu mantošana (Priority Inheritance): Kad zemas prioritātes uzdevums tur resursu, kas ir nepieciešams augstas prioritātes uzdevumam, tam uz laiku tiek piešķirta bloķētās uzdevuma prioritāte. Pēc resursa atbrīvošanas prioritāte atgriežas sākotnējā līmenī.
  • Prioritātes plafona protokols (Priority Ceiling Protocol): Katram resursam tiek piešķirts "prioritātes plafons" — augstākā prioritāte starp visiem uzdevumiem, kas var izmantot šo resursu. Uzdevums var piekļūt resursam tikai tad, ja tā pašreizējā prioritāte ir augstāka par visiem izmantotajiem resursu plafoniem (ieskaitot tos, kurus tas jau tur).

iOS, Grand Central Dispatch (GCD) un Operation Queues ir mehānismi prioritāšu inversijas mazināšanai, bet sarežģītākos bloķēšanas scenārijos šādas situācijas joprojām var rasties nepareizas lietošanas dēļ.