Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Operační systém microsoft Windows NT je navržen tak, aby běžel jednotně na platformách s jednoprocesorem a symetrickým multiprocesorem (SMP) a ovladače režimu jádra by měly být navrženy tak, aby fungovaly podobně.
V jakékoli multiprocesorové platformě Windows existují následující podmínky:
Všechny procesory jsou identické a buď všechny nebo žádné procesory musí mít identické spoluprocesory.
Všechny procesory sdílejí paměť a mají jednotný přístup k paměti.
Na symetrické platformě má každý procesor přístup k paměti, přerušení a registru řízení vstupně-výstupních operací. (Naproti tomu v asymetrickém multiprocesorovém počítači přebírá jeden procesor všechny přerušení pro sadu podřízených procesorů.)
Pokud chcete bezpečně spouštět na platformě SMP, operační systém musí zaručit, že kód spuštěný na jednom procesoru nemá současně přístup k datům, ke kterým přistupuje a upravuje jiný procesor. Pokud například isr ovladače nejnižší úrovně zpracovává přerušení zařízení na jednom procesoru, musí mít výhradní přístup k registrům zařízení nebo kritickým datům definovaným ovladačem, pokud zařízení přeruší současně na jiném procesoru.
Vstupně-výstupní operace ovladačů, které jsou serializované v jednoprocesorovém počítači, se navíc dají překrývat v počítači SMP. To znamená, že rutina ovladače, která zpracovává příchozí vstupně-výstupní požadavky, může být spuštěna na jednom procesoru, zatímco jiná rutina, která komunikuje se zařízením souběžně na jiném procesoru. Bez ohledu na to, jestli se ovladače režimu jádra spouští na jednoprocesorovém nebo symetrickém multiprocesorovém počítači, musí synchronizovat přístup ke všem datům definovaným ovladačem nebo systémovým prostředkům sdíleným mezi rutinami ovladačů a synchronizovat přístup k fyzickému zařízení( pokud existuje).
Komponenta jádra Systému Windows NT exportuje synchronizační mechanismus označovaný jako zámek číselníku, který mohou ovladače použít k ochraně sdílených dat (nebo registrů zařízení) před souběžným přístupem pomocí jedné nebo více rutin, které běží souběžně na symetrické multiprocesorové platformě. Jádro vynucuje dvě zásady týkající se použití spinlocků.
V každém okamžiku může jednu konkrétní zámku typu spin lock držet jen jedna rutina. Před přístupem ke sdíleným datům se musí každá rutina, která na data odkazuje, nejprve pokusit získat zámek číselníku dat. Aby bylo možné získat přístup ke stejným datům, musí další rutina získat spinlock, ale spinlock nelze získat, dokud ho aktuální držitel neuvolní.
Jádro přiřadí hodnotu IRQL každému spinlocku v systému. Rutina režimu jádra může získat konkrétní spinlock pouze tehdy, když je rutina spuštěna na přiřazené úrovni IRQL pro spinlock.
Tyto politiky brání rutině ovladače, která se obvykle spouští při nižším IRQL, ale v současné době drží spinlock, před tím, aby byla nahrazena rutinou ovladače s vyšší prioritou, která se pokouší získat stejný spinlock. Proto se vyhnete vzájemnému zablokování.
IRQL, které je přiřazeno spin locku, je obecně to, které odpovídá rutině s nejvyšším IRQL, jež může spin lock získat.
Například ISR nejnižší úrovně často sdílí paměťovou oblast s rutinou DPC ovladače. Rutina DPC volá rutinu kritické sekce dodanou ovladačem pro přístup ke sdílené oblasti. Spinlock, který chrání sdílenou oblast, má IRQL rovný DIRQL, při kterém zařízení generuje přerušení. Pokud rutina kritického oddílu uchovává zámek typu spinlock a přistupuje ke sdílené oblasti v rámci DIRQL, nelze ISR spustit na jednoprocesorové nebo SMP konfiguraci.
IsR nelze spustit v jednoprocesorovém počítači, protože přerušení zařízení je maskované, jak je popsáno v části Always Preemptible a Always Interruptible.
V počítači SMP nemůže ISR získat zámek spinu, který chrání sdílená data, zatímco rutina kritické části obsahuje zámek číselníku a přistupuje ke sdíleným datům v DIRQL.
Sada vláken režimu jádra může synchronizovat přístup ke sdíleným datům nebo prostředkům tím, že čeká na jeden z objektů dispečera jádra: událost, mutex, semaphore, časovač nebo jiné vlákno. Většina ovladačů si však nenastavuje vlastní vlákna, protože dosahují lepšího výkonu, když se vyhýbají přepínání kontextu vláken. Kdykoli jsou rutiny a ovladače režimu jádra kritické vůči času spuštěné na úrovni IRQL = DISPATCH_LEVEL nebo DIRQL, musí použít spinový zámek jádra k synchronizaci přístupu ke sdíleným datům nebo prostředkům.
Další informace naleznete v tématu Spin Locks, Managing Hardware Priority a Kernel Dispatcher Objects.