Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A soros spinkulcsok a spinkulcsok olyan változatai, amelyek jól működnek nagy verseny miatt történő zárolások esetében. A hagyományos, nem sorolt pörgőzárak jobb választást jelentenek az enyhén versengett vagy rövidebb időtartamú zárolásokhoz.
A sorba állított pörgetési zár használatának előnyei a következők:
Csökkentett processzor-verseny: A hagyományos spinlockok jelentős processzor-versenyhez vezethetnek, ha több szál egyszerre próbál megszerezni egy zárat, mivel folyamatosan ellenőrzik a zár állapotát. Ez csökkentheti a rendszer teljesítményét, különösen többprocesszoros rendszereken. A sorba állított spinlockok a szálak sorba rendezésével csökkentik a problémát. Amikor egy szál megszerez egy zárat, csak a soron következő van aktív várakozásban, arra várva, hogy megszerezze a zárat. Ez csökkenti a pörgetésre pazarolt CPU-ciklusokat, különösen akkor, ha a zárolás hosszabb időtartamig van tartva.
Méltányosság és az éhezés elkerülése: Az alapvető spin lockok egyik problémája a méltányosság hiánya; egy szál éhezhet, és soha nem szerezheti meg a zárat, ha más szálak folyamatosan megszerzik és felszabadítják. A soros pörgetési zárolások ezt úgy oldják meg, hogy a szálak a próbált sorrendben szerezik be a zárolást. Ez a szekvenciális kezelés megakadályozza az éhezést, és biztosítja, hogy az összes szál idővel kiszolgálásra kerüljön.
Méretezhetőség: A processzorok vagy magok számának növekedésével a szinkronizálási mechanizmusok hatékonysága kritikus fontosságúvá válik a teljesítmény szempontjából. A sorolt pörgetési zárak méretezhetőbbek, mint a hagyományos pörgetési zárak, mivel csökkentik a processzorok terhelését azáltal, hogy minimalizálják az aktív pörgetést minden magon. Ez különösen fontos a nagy teljesítményű, többmagos rendszerekben, ahol a vezető hatékonysága közvetlenül befolyásolhatja a rendszer általános teljesítményét.
A rendszererőforrások hatékony használata: A szükségtelen processzorforgás csökkentésével a sorosított pörgetési zárolások lehetővé teszik, hogy a rendszer az erőforrásait hatékonyabban használja. Ez nem csak az eszközillesztő teljesítményét javítja, hanem pozitív hatással van a rendszer általános válaszkészségére és energiafogyasztására is, ami különösen hasznos az energiaérzékeny környezetekben.
Egyszerűség és megbízhatóság: A versengés csökkentésében és a méltányosság javításában nyújtott előnyeik ellenére az üzenetsoros pörgetési zárolások elrejtik az összetettséget a fejlesztő elől. Egyszerű és megbízható mechanizmust biztosítanak a megosztott erőforrások védelméhez anélkül, hogy a fejlesztőnek összetett zárolási logikát kellene implementálnia. Ez az egyszerűség csökkenti a nem megfelelő zárkezeléssel kapcsolatos hibák valószínűségét, ezáltal növeli a vezető megbízhatóságát.
Az alábbiakban egy egyszerűsített kódrészlet látható, amely a leírt műveleteket mutatja be egy sorba állított spin-zárolással egy Windows Kernel módú illesztőprogramban. Ez a példa bemutatja, hogyan deklarálhat és inicializálhat egy spin-zárolást a KeInitializeSpinLock használatával, majd hogyan szerezheti be és oldhatja fel a zárolást a KeAcquireInStackQueuedSpinLock és a KeReleaseInStackQueuedSpinLock használatával.
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);
Az illesztőprogram lefoglal egy KLOCK_QUEUE_HANDLE struktúrát, amelyet pointerként ad át a KeAcquireInStackQueuedSpinLock függvénynek. Az illesztő ugyanazt a struktúrát pointerként adja át a KeReleaseInStackQueuedSpinLock függvénynek, amikor felengedi a pörgetési zárat.
A meghajtóknak általában minden alkalommal le kell foglalniuk a szerkezetet a veremre, amikor megszerzik a zárat. Az illesztőprogramok nem foglalhatják le a struktúrát az eszközkörnyezet részeként, és nem oszthatják meg ugyanazt a struktúrát több szálból.
Az illesztőprogramok nem keverhetik a hívásokat a sorba állított spin lock rutinokhoz és a szokásos KeXxxSpinLock rutinokhoz ugyanazon a spin-lockon.
Ha az illesztőprogram az IRQL = DISPATCH_LEVEL szinten van, meghívhatja a KeAcquireInStackQueuedSpinLockAtDpcLevel és a KeReleaseInStackQueuedSpinLockFromDpcLevel parancsot.