Várólistán lévő pörgetési zárolások

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.