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.
Frontové rotační zámky jsou variantou rotačních zámků, které dobře fungují pro vysoce sporné zámky. Tradiční, nekolejové spinové zámky jsou lepší volbou pro lehce využívané nebo zámky s kratší dobou trvání.
Mezi výhody použití zamykání přes frontový zámek patří:
Omezení kolize procesoru: Tradiční spinové zámky můžou vést k významné kolizí procesoru, když se více vláken pokusí zámek získat současně, protože kontrolují stav zámku nepřetržitě (nebo "spin"). To může snížit výkon systému, zejména u multiprocesorových systémů. Zámky spinu ve frontě se zmírňují uspořádáním vláken do fronty. Když vlákno získá zámek, bude se aktivně otáčet pouze další řádek, který čeká na získání zámku. Tím se sníží počet cyklů procesoru, které se při otáčení plýtají, zejména pokud je zámek přidržován po delší dobu.
Férovost a zabránění hladovění: Jedním z problémů se základními spin locky je nedostatek férovosti; vlákno může strádat a nikdy nezískat zámek, pokud ostatní vlákna neustále získávají a uvolňují. Spinové zámky ve frontě to řeší tím, že zajistí, aby vlákna získávala zámek v pořadí, v jakém se pokusila. Tato sekvenční zpracování zabraňuje vyhladovění a zajišťuje, že všechna vlákna jsou postupně obsluhována.
Škálovatelnost: S rostoucím počtem procesorů nebo jader v systému se zvyšuje efektivita synchronizačních mechanismů pro výkon. Frontové spin locky jsou škálovatelnější než tradiční spin locky, protože snižují režijní náklady na procesory minimalizací aktivního otáčení mezi všemi jádry. To je zvlášť důležité v vysoce výkonných vícejádrových systémech, kde efektivita ovladačů může přímo ovlivnit celkový výkon systému.
Efektivní použití systémových prostředků: Snížením nepotřebného otáčení procesoru umožňují zamykací mechanismy ve frontě, aby systém efektivněji využíval své prostředky. To nejen zlepšuje výkon ovladače zařízení, ale má také pozitivní dopad na celkovou odezvu a spotřebu energie systému, což je zvláště výhodné v prostředích citlivých na výkon.
Jednoduchost a spolehlivost: Navzdory jejich výhodám při omezení kolizí a zlepšení spravedlnosti frontové spinové zámky odstraňují složitost pro vývojáře. Poskytují jednoduchý a spolehlivý mechanismus pro ochranu sdílených prostředků, aniž by vývojář musel implementovat složitou logiku uzamykání. Tato jednoduchost snižuje pravděpodobnost chyb souvisejících s nesprávným zpracováním zámků, což zvyšuje spolehlivost ovladače.
Níže je zjednodušený fragment kódu, který demonstruje popsané operace s řazeným spinlockem v ovladači režimu jádra Windows. Tento příklad ukazuje, jak deklarovat a inicializovat spinlock pomocí KeInitializeSpinLock, a pak získat a uvolnit zámek pomocí KeAcquireInStackQueuedSpinLock a KeReleaseInStackQueuedSpinLock, v uvedeném pořadí.
KSPIN_LOCK SpinLock;
KLOCK_QUEUE_HANDLE LockHandle;
// Initialize the spin lock
KeInitializeSpinLock(&SpinLock);
// Assume this function is called in some kind of context where
// the below operations make sense, e.g., in a device I/O path
// Acquire the queued spin lock
KeAcquireInStackQueuedSpinLock(&SpinLock, &LockHandle);
// At this point, the current thread holds the spin lock.
// Perform thread-safe operations here.
// ...
// Release the queued spin lock
KeReleaseInStackQueuedSpinLock(&LockHandle);
Ovladač přidělí strukturu KLOCK_QUEUE_HANDLE, kterou předává jako ukazatel na KeAcquireInStackQueuedSpinLock. Ovladač předává stejnou strukturu prostřednictvím ukazatele na KeReleaseInStackQueuedSpinLock, když uvolňuje spinlock.
Ovladače by obvykle měly přidělovat strukturu v zásobníku při každém získání zámku. Ovladač by neměl přidělovat strukturu jako součást kontextu zařízení a pak sdílet stejnou strukturu z více vláken.
Ovladače nesmí kombinovat volání rutin pro zařazení do fronty se spinovým zámkem a běžných rutin KeXxxSpinLock na stejném spinovacím zámku.
Pokud je ovladač již v IRQL = DISPATCH_LEVEL, může místo toho volat KeAcquireInStackQueuedSpinLockAtDpcLevel a KeReleaseInStackQueuedSpinLockFromDpcLevel.