IRQL ( Interrupt Request Level ) - aprins. „ nivel de cerere de întrerupere ”. Un mecanism de prioritizare hardware-software utilizat pentru sincronizare în sistemele de operare din familia Windows NT .
IRQL este un atribut software (din cauza faptului că nu este suportat de hardware) al unui procesor și indică prioritatea executării codului pe acel procesor în ceea ce privește întreruperile și alte evenimente asincrone. Pentru întreruperile hardware , în cele mai multe cazuri, IRQL este implementat în hardware (de exemplu: conceptul de prioritate de întrerupere în controlerul i8259A sau prioritatea sarcinii specificată în registrul TPR din APIC), cu toate acestea, codul sistemului de operare în sine poate fi în mod logic la diferite priorități, caz în care niveluri suplimentare de IRQL sunt implementate în software. De exemplu, prioritatea thread - urilor sau DPC este mai mare decât prioritatea thread-urilor utilizatorului. Dacă acesta nu ar fi cazul, atunci firele de execuție ar putea anticipa programatorul și, prin urmare, ar putea „dezactiva”multitasking preventiv , la rândul său, planificatorul poate fi întrerupt prin întreruperi hardware. Windows NT utilizează 32 de niveluri IRQL (numerele între paranteze):
Aceasta înseamnă, de exemplu, că planificatorul (care rulează la nivel DPC/DISPATCH) poate fi întrerupt de întreruperi hardware, întreruperi interprocesor (IPI) etc., dar nu poate fi întrerupt de proceduri asincrone (APC) și fire normale care rulează la Nivel PASIV.. Întreruperile interprocesorului IPI pot fi întrerupte de o întrerupere a alimentării (Power fail level întrerupere), dar nu pot fi întrerupte de întreruperi hardware normale de la dispozitive etc.
IRQL ajută, de asemenea, la urmărirea și identificarea erorilor logice în proiectarea sistemului de operare. Eroarea legendară cu mesajul IRQL_NOT_LESS_OR_EQUAL înseamnă următoarea situație: un driver sau alt cod privilegiat cu IRQL >= DPC/DISPATCH a accesat o pagină care lipsește [1] în memorie, este necesar un apel către un subsistem care încarcă pagini de pe disc , dar acest subsistem, în conformitate cu arhitectura Windows NT, are IRQL este mai mic decât DPC/DISPATCH. Prin urmare, nu are dreptul de a întrerupe codul care a cauzat eroarea paginii. În același timp, codul privilegiat nu poate continua să se execute până când pagina este încărcată. Există un impas logic, care, de fapt, duce la prăbușirea sistemului de operare.
Când executați cod cu IRQL >= DPC/DISPATCH, orice stare de așteptare pe o primitivă de sincronizare ( mutex , semafor ) provoacă blocarea sistemului de operare; Când firul de execuție curent intră în această stare, planificatorul de execuții trebuie să programeze un alt fir de execuție pe miezul procesorului curent. Dar, deoarece prioritatea programatorului este DPC/DISPATCH, acesta nu va putea întrerupe firul curent .
Linux folosește mecanisme similare. De exemplu, codul de gestionare a întreruperilor poate fi împărțit în două „jumătăți”: jumătatea superioară și jumătatea inferioară, partea „superioară” este echivalentă cu gestionarea în sine, partea „inferioară” este procedura amânată (analogul în Windows este DPC ). . O procedură de jumătate inferioară poate fi întreruptă de o procedură de jumătate de sus, dar nu invers. Astfel, jumătatea superioară și jumătatea inferioară sunt echivalente logic cu nivelurile IRQL ale dispozitivului IRQL și, respectiv, DPC/DISPATCH.
Documentația tehnică Windows NT ( Bibliotecă MSDN ) limitează timpul de rulare continuă a codului la IRQL-uri ridicate. Pentru nivelurile de întrerupere hardware (DIRQL) limita este de 10-20 µs [2] . Pentru nivelul de program DISPATCH_LEVEL, valorile conflictuale sunt date la 25 [3] și 100 [4] µs .
Cu toate acestea, aceste limite sunt adesea încălcate chiar și de kernelul Windows nativ și de codul de driver, darămite drivere terțe, creând întârzieri ascunse . Acest lucru nu are un efect vizibil asupra funcționării normale a sistemului, cu toate acestea, poate degrada foarte mult performanța în timp real - de exemplu, în fluxul media (acest lucru este vizibil mai ales în sunet [5] [6] ). Pentru a detecta astfel de încălcări, au fost dezvoltate programele DPC Latency Checker (link inaccesibil) (engleză) și LatencyMon (engleză) . O analiză a funcționării diferitelor versiuni de Windows care utilizează astfel de programe arată că aceste încălcări sunt corectate treptat.