Hibák és holtpontok megelőzése pörgetési zárolások használata közben

Bár az illesztőprogram-rutin rendelkezik spin lockmal, nem okozhat hardverkivételt, és nem emelhet szoftverkivételt a rendszer leállása nélkül. Más szóval az illesztőprogram ISR-jének és a SynchCritSection rutinnak, amelyet az illesztőprogram a KeSynchronizeExecution hívásában biztosít, nem okozhat hibát vagy csapdát, például oldalhibát vagy számtani kivételt, és nem okozhat szoftverkivételt. A KeAcquireSpinLockot vagy a KeAcquireInStackQueuedSpinLockot meghívó rutin szintén nem okozhat hardverkivételt, és nem emelhet szoftverkivételt, amíg ki nem adta a végrehajtó spin lockját, és már nem fut az IRQL = DISPATCH_LEVEL.

Lapozható adatok és támogatási rutinok

Spin lock tartása közben az illesztőprogramok nem hívhatnak olyan rutinokat, amelyek hozzáférnek a lapozható adatokhoz. Ne feledje, hogy az illesztőprogramok meghívhatnak bizonyos támogatási rutinokat, amelyek csak akkor és csak akkor férnek hozzá a lapozható adatokhoz, ha a hívásaik a szigorúan DISPATCH_LEVEL-nél kisebb IRQL-en való végrehajtás során történnek. Ez az IRQL-korlátozás megakadályozza ezen támogatási rutinok meghívását spin lock birtoklása közben. Az adott támogatási rutinra vonatkozó IRQL-követelményekért tekintse meg a rutin referenciaoldalát.

Rekurzió

A spin lock rekurzív megszerzésének kísérlete garantáltan holtpontot okoz: a rekurzív rutin által tartott példány nem tudja elengedni a spin lockot, miközben egy másik példány próbálja megszerezni ugyanazt a spin lockot.

Az alábbi irányelvek ismertetik, hogyan használja a forgózárakat rekurzív rutinokkal.

  • A rekurzív rutin nem hívhatja meg magát, amíg pörgetési zárat tart, vagy nem kísérelheti meg ugyanazt a pörgetési zárat megszerezni a későbbi hívásoknál.

  • Bár a rekurzív rutin spinzárat tartalmaz, egy másik illesztőprogram-rutin nem hívhatja meg a rekurzív rutint, ha a rekurzió holtpontot okozhat, vagy ha a hívó 25 mikroszekundumnál hosszabb ideig tartja a spinzárat.

A rekurzív illesztőprogram-rutinokról további információt a Kernel Stack használata című témakörben talál.

Beágyazott Spin Lock-beszerzések

Ha egy második pörgetési zárat próbál meg beszerezni, miközben egy másik pörgetési zárat tart, holtpontot vagy gyenge illesztőprogram-teljesítményt is okozhat.

Az alábbi irányelvek leírják, hogyan kell az illesztőprogramoknak tartaniuk a spinlockokat:

  • Az illesztőprogram nem hívhat meg olyan támogatási rutint, amely pörgetési zárat használ, hacsak nem biztos, hogy holtpont nem fordulhat elő.

  • Még akkor sem, ha holtpont nem fordulhat elő, az illesztőprogram nem hívhat meg olyan támogatási rutint, amely spin lockot használ, kivéve, ha más kódolási technikák nem tudnak hasonló illesztőprogram-teljesítményt és funkciókat biztosítani.

  • Ha egy illesztőprogram beágyazott hívásokat tesz a pörgetési zárak megszerzésére, akkor azokat mindig ugyanabban a sorrendben kell megszereznie minden egyes alkalommal. Ez a sorrend segít elkerülni a holtpontok.

Általában ne használjon egymásba ágyazott pörgetőzárakat, hogy megvédje az átfedésben lévő részhalmazokat vagy a megosztott adatok és erőforrások különálló halmazait. Gondolja át, mi történhet, ha egy illesztőprogram két vezetői spin-zárolással védi a különálló erőforrásokat, például egy időzítőobjektumot, amelyeket egyenként és együttesen különböző illesztőprogram-rutinok állíthatnak be. Az illesztő időnként holtpontot okozott egy SMP-gépen, amikor a két rutin közül bármelyik, amelyik már birtokolta az egyik spinzárat, megpróbálta megszerezni a másik spinzárat.

A beágyazott pörgetési zárolások beszerzéséről további információt a Zárolások, a Holtpontok és a Szinkronizálás című témakörben talál.