IRQL ( Interrupt Request Level ) - svítí. " úroveň požadavku na přerušení ". Mechanismus upřednostňování hardwaru a softwaru používaný pro synchronizaci v operačních systémech řady Windows NT .
IRQL je softwarový atribut (kvůli tomu, že není podporován hardwarem) procesoru a označuje prioritu spouštění kódu na tomto procesoru s ohledem na přerušení a jiné asynchronní události. U hardwarových přerušení je IRQL ve většině případů implementováno v hardwaru (příklad: koncept priority přerušení v řadiči i8259A nebo priorita úlohy specifikovaná v registru TPR v APIC), samotný kód operačního systému však může být logicky odlišný priority, v takovém případě jsou v softwaru implementovány další úrovně IRQL. Například priorita plánovače vláken nebo DPC je vyšší než priorita uživatelských vláken. Pokud by tomu tak nebylo, pak by vlákna mohla zabránit plánovači a tím „vypnout“preemptivní multitasking , plánovač může být zase přerušitelný hardwarovými přerušeními. Windows NT používá 32 úrovní IRQL (čísla v závorkách):
To například znamená, že plánovač (běžící na úrovni DPC/DISPATCH) může být přerušen hardwarovými přerušeními, meziprocesorovými přerušeními (IPI) atd., ale nemůže být přerušen asynchronními procedurami (APC) a normálními vlákny běžícími na PASIVNÍ úroveň.. Přerušení IPI meziprocesoru může být přerušeno výpadkem napájení (Power fail level interrupt), ale nelze je přerušit běžnými hardwarovými přerušeními ze zařízení atd.
IRQL také pomáhá sledovat a identifikovat logické chyby v návrhu OS. Legendární chyba se zprávou IRQL_NOT_LESS_OR_EQUAL znamená následující situaci: ovladač nebo jiný privilegovaný kód s IRQL >= DPC/DISPATCH přistoupil na stránku, která v paměti chybí [1] , je vyžadováno volání subsystému, který načítá stránky z disku , ale tento subsystém v souladu s architekturou Windows NT má IRQL menší než DPC/DISPATCH. Nemá tedy právo přerušit kód, který závadu stránky způsobil. Zároveň privilegovaný kód nemůže pokračovat v provádění, dokud se stránka nenačte. Existuje logická slepá ulička, která ve skutečnosti vede ke kolapsu OS.
Při provádění kódu s IRQL >= DPC/DISPATCH způsobí jakýkoli stav čekání na synchronizačním primitivu ( mutex , semafor ) pád operačního systému; Když aktuální vlákno vstoupí do tohoto stavu, plánovač vláken musí naplánovat další vlákno na aktuálním jádře procesoru. Ale protože prioritou plánovače je DPC/DISPATCH, nebude moci přerušit aktuální vlákno .
Linux používá podobné mechanismy. Například kód obsluhy přerušení lze rozdělit na dvě „poloviny“: horní polovinu a spodní polovinu, „horní“ část je ekvivalentní samotné obsluze, „dolní“ část je odložená procedura (analogem ve Windows je DPC ) . Procedura dolní poloviny může být přerušena procedurou horní poloviny, ale ne naopak. Horní polovina a spodní polovina jsou tedy logicky ekvivalentní úrovním IRQL zařízení IRQL a DPC/DISPATCH.
Technická dokumentace systému Windows NT ( knihovna MSDN ) omezuje nepřetržitou dobu běhu kódu při zvýšených úrovních IRQL. Pro úrovně hardwarového přerušení (DIRQL) je limit 10-20 µs [2] . Pro úroveň programu DISPATCH_LEVEL jsou uvedeny konfliktní hodnoty 25 [3] a 100 [4] µs .
Tyto limity jsou však často porušovány i nativním jádrem Windows a kódem ovladačů, natož ovladačů třetích stran, což vytváří skryté zpoždění . Na běžný chod systému to nemá znatelný vliv, nicméně může to značně zhoršit výkon v reálném čase - například u streamovaných médií (to je patrné zejména u zvuku [5] [6] ). K detekci takových porušení byly vyvinuty programy DPC Latency Checker (nepřístupný odkaz) (anglicky) a LatencyMon (anglicky) . Analýza fungování různých verzí systému Windows pomocí takových programů ukazuje, že tato porušení jsou postupně napravována.