NIVEL DE EXPEDIERE

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 17 mai 2019; verificările necesită 4 modificări .

NIVEL DE DISPATCH (în sistemul de operare Windows ) este nivelul de prioritate (modul de operare) al firului în care este suspendat multitasking preventiv .

Execuția în acest mod este posibilă numai în nucleul sistemului de operare , codul în modul utilizator nu are nicio modalitate de a se executa în acest mod.

Nivelul DISPATCH, ca și nivelurile de prioritate inferioară (APC și PASIV), nu are legătură cu modurile hardware ale procesorului și este furnizat doar de software.

Acest nivel este folosit pentru a efectua acțiuni care nu permit încălcarea corespondenței dintre firul de execuție curent și procesor ( nucleul procesorului ) - ambele comutând procesorul la un alt fir și firul de execuție la alt procesor. Pe un sistem cu uniprocesor, acest lucru înseamnă pur și simplu că niciun cod în modul utilizator nu va fi executat până când nivelul de prioritate este coborât. Pe un sistem multiprocesor , acest lucru este valabil doar pentru procesorul curent (nucleu), dar asigură și faptul că firul curent nu este mutat la alt procesor (nucleu).

În special, nivelul DISPATCH este utilizat la implementarea Spin Locks . Dacă blocarea este obținută în timp ce se menține multitasking preventiv , atunci firul de execuție curent poate fi întrerupt în orice moment, cu trecerea procesorului la un fir nou. Deoarece nu se știe ce acțiuni va efectua noul fir, este posibil ca acesta să recaptureze același Spin Lock, ceea ce va duce la blocarea reciprocă a ambelor fire. Deoarece numai codul de sistem este executat la niveluri de prioritate mai ridicate, este foarte probabil ca acest lucru să ducă la o blocare completă (blocare ) a întregului sistem.

Pentru a evita acest lucru, sistemul de operare întrerupe multitasking preventiv înainte de a apuca Spin Lock. Mai mult, în cazul unui singur procesor, acest lucru este suficient pentru a asigura semantica de captare a blocării ; blocarea reală nu mai este necesară și nu este utilizată în nucleul OS construit pentru un singur procesor.

Dezactivarea comutării firelor evită, de asemenea, o buclă lungă de așteptare pentru eliberarea blocării pe un sistem multiprocesor, ceea ce ar duce la utilizarea neproductivă a resurselor procesorului. Ridicarea nivelului de prioritate asigură că un fir care a dobândit o blocare pe un alt procesor/nucleu poate fi întrerupt doar de către manipulatorii de întreruperi , al căror timp de rulare nu trebuie să depășească câteva zeci de microsecunde .

Cod care se execută pe DISPATCH_LEVEL:

Restricții la DISPATCH_LEVEL:

Codul care se execută la DISPATCH_LEVEL poate fi încă întrerupt de orice întrerupere , deși cu garanția că întreruperea nu va schimba firul curent. Dacă este necesară sincronizarea accesului la registrele de date și hardware utilizate atât dintr-o întrerupere, cât și din alt cod, trebuie să utilizați o blocare legată de întrerupere, adică KeSynchronizeExecution sau KeAcquireInterruptSpinLock. Este interzisă utilizarea încuietorilor normale în această situație, precum și în manipulatorii de întreruperi.

Un analog aproximativ în Linux este „codul care nu poate fi blocat” (nu poate fi blocat). Regula Linux conform căreia codul care deține un spinlock nu poate bloca este exact aceeași cu regula corespunzătoare din Windows.

Literatură