Sdílet prostřednictvím


Zabránění chybám a deadlockům při používání spinlocků

Zatímco rutinní ovladač drží spinlock, nemůže způsobit hardwarovou výjimku ani vyvolat softwarovou výjimku, aniž by způsobil pád systému. Jinými slovy, ISR ovladače a jakákoli rutina SynchCritSection, kterou ovladač dodává ve volání KeSynchronizeExecution, nesmí způsobit chybu nebo výjimku, jako je chyba stránky nebo aritmetická výjimka, ani nemůže vyvolat softwarovou výjimku. Rutina, která volá KeAcquireSpinLock nebo KeAcquireInStackQueuedSpinLock, také nemůže způsobit hardwarovou výjimku nebo vyvolat softwarovou výjimku, dokud neuvolní svůj výkonnostní zámek typu spin lock a již neběží na IRQL = DISPATCH_LEVEL.

Stránkovatelná data a podpůrné rutiny

Při držení otáčkového zámku nesmí ovladače volat rutiny, které přistupují ke stránkovatelným datům. Nezapomeňte, že ovladače mohou volat určité rutiny podpory, které přistupují ke stránkovatelným datům, pouze pokud k těmto voláním dochází při provádění na úrovni IRQL, která je striktně nižší než DISPATCH_LEVEL. Toto omezení IRQL brání volání těchto rutin podpory při držení zámku otáčení. Požadavky IRQL pro každou konkrétní rutinu podpory najdete na referenční stránce rutiny.

Rekurze

Pokus o rekurzivní získání spinového zámku zaručeně povede ke zablokování: zatímco držící instance rekurzivní rutiny nemůže uvolnit spinový zámek, druhá instance se točí a pokouší se získat tentýž spinový zámek.

Následující pokyny popisují, jak používat zámky otáčení s rekurzivními rutinami:

  • Rekurzivní rutina nesmí volat sama sebe, když drží zámek číselníku, nebo se nesmí pokoušet získat stejný zámek číselníku při následných voláních.

  • Zatímco rekurzivní rutina drží zámek spinu, jiná rutina ovladače nesmí volat rekurzivní rutinu, pokud rekurze může způsobit deadlock nebo způsobit, že volající drží zámek spinu déle než 25 mikrosekund.

Další informace o rekurzivních rutinách ovladačů naleznete v tématu Použití zásobníku jádra.

Vnořené přebírání spinlocků

Pokus o získání druhého spinlocku při držení jiného spinlocku může také způsobit zablokování nebo špatný výkon ovladače.

cs-CZ: Následující pokyny popisují, jak by ovladače měly držet spin locky:

  • Ovladač nesmí volat rutinu podpory, která používá zámek otáčení, pokud nemůže dojít k zablokování.

  • I když k zablokování nemůže dojít, ovladač by neměl volat rutinu podpory, která používá zámek otáčení, pokud alternativní techniky kódování nemohou poskytnout srovnatelný výkon a funkčnost ovladače.

  • Pokud ovladač provádí vnořené volání pro získání spinových zámků, musí vždy získat spinové zámky ve stejném pořadí při každém jejich získání. Toto pořadí pomáhá vyhnout se zablokování.

Obecně platí, že k ochraně překrývajících se podmnožin nebo samostatných sad sdílených dat a prostředků se vyhněte používání vnořených spinlocků. Zamyslete se nad tím, co se může stát, když ovladač používá dva výkonné spinové zámky k ochraně diskrétních prostředků, jako je dvojice objektů časovače, které mohou být nastaveny jednotlivě a souhrnně různými rutinami ovladače. Ovladač by se občas zablokoval na SMP počítači pokaždé, když se některá ze dvou rutin pokusila získat druhý spinlock, přičemž každá z nich už držela jeden spinlock.

Další informace o získání vnořených spinlocků naleznete v tématu Zámky, zablokování a synchronizace.