Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kuyruğa alınmış döndürme kilitleri, yüksek rekabete maruz kalan kilitler için iyi çalışan bir döndürme kilidi çeşididir. Geleneksel, sırasız döndürme kilitleri, az çekişmeli veya daha kısa süreli kilitler için daha iyi bir seçimdir.
Kuyruğa alınmış döndürme kilidi kullanmanın avantajları şunlardır:
Azaltılmış İşlemci Çekişmesi: Geleneksel spin kilitleri, birden çok iş parçacığı aynı anda kilidi almaya çalıştığında, kilit durumunu sürekli kontrol ettiklerinden (veya "döndürdüklerinden") önemli işlemci çekişmesine neden olabilir. Bu, özellikle çok işlemcili sistemlerde sistem performansını düşürebilir. Kuyruğa alınan spin kilitleri, iş parçacıklarını bir kuyruğa düzenleyerek bunun olumsuz etkilerini azaltır. Bir iş parçacığı bir kilit aldığı zaman, kilidi almak için bekleyen yalnızca sonraki satır etkin olarak döner. Bu, özellikle kilit daha uzun süre tutulduğunda, boşta dönen CPU döngülerini azaltır.
Adil Olma ve Açlıktan Kaçınma: Temel spin kilitleri ile ilgili sorunlardan biri adil olmanın eksikliğidir; bir iş parçacığı, diğer iş parçacıkları sürekli olarak kilidi alıp serbest bırakıyorsa yoksun bırakılabilir ve kilidi asla elde edemez. Kuyruğa alınan döndürme kilitleri, iş parçacıklarının kilidi deneme sırasına göre almasını sağlayarak bu sorunu giderir. Bu sıralı işleme, aç kalmayı önler ve tüm iş parçacıklarının zaman içinde işlem görmesini sağlar.
Ölçeklenebilirlik: Sistemde işlemci veya çekirdek sayısı arttıkça eşitleme mekanizmalarının verimliliği performans açısından kritik hale gelir. Sıralı döndürme kilitleri, tüm çekirdeklerde aktif döndürmeyi en aza indirerek işlemcilerin yükünü azalttığı için geleneksel döndürme kilitlerine göre daha ölçeklenebilir. Bu, sürücü verimliliğinin genel sistem performansını doğrudan etkilediği yüksek performanslı, çok çekirdekli sistemlerde özellikle önemlidir.
Sistem Kaynaklarının Verimli Kullanımı: Gereksiz işlemci dönmesini azaltarak kuyruğa alınan spin kilitleri, sistemin kaynaklarını daha verimli kullanmasına olanak sağlar. Bu yalnızca cihaz sürücüsünün performansını geliştirmekle kalmaz, aynı zamanda sistemin genel yanıt verme hızı ve güç tüketimi üzerinde olumlu bir etkiye sahiptir ve bu da özellikle güç açısından hassas ortamlarda faydalıdır.
Basitlik ve Güvenilirlik: İçerik yanlış anlamayı azaltma ve adaleti geliştirme avantajlarına rağmen, kuyruğa alınmış spin kilitleri, geliştiriciden karmaşıklığı gizler. Bunlar, geliştiricinin karmaşık kilitleme mantığı uygulamasına gerek kalmadan paylaşılan kaynakları korumak için basit ve güvenilir bir mekanizma sağlar. Bu basitlik, hatalı kilit işleme ile ilgili hataların olasılığını azaltarak sürücünün güvenilirliğini artırır.
Aşağıda, Windows Çekirdek Modu Sürücüsünde kuyruğa alınmış bir döndürme kilidiyle açıklanan işlemleri gösteren basitleştirilmiş bir kod parçacığı yer almaktadır. Bu örnek, KeInitializeSpinLock kullanarak bir döndürme kilidi nasıl bildirileceğini ve başlatılacağını, ardından KeAcquireInStackQueuedSpinLock ve KeReleaseInStackQueuedSpinLock kullanarak bu kilidin sırasıyla nasıl alınacağını ve bırakılacağını göstermektedir.
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);
Sürücü, KLOCK_QUEUE_HANDLE yapısını ayırır ve işaretçi olarak KeAcquireInStackQueuedSpinLock işlevine aktarır. Sürücü, döndürme kilidini serbest bıraktığında KeReleaseInStackQueuedSpinLock işaretçisi ile aynı yapıyı geçirir.
Sürücülerin normalde kilidi her edindiklerinde yığındaki yapıyı ayırması gerekir. Bir sürücü, yapıyı cihaz bağlamının bir parçası olarak ayırmamalı ve birden çok iş parçacığından aynı yapıyı paylaşmamalıdır.
Sürücüler, sıralı spin lock rutinlerine ve normal KeXxxSpinLock rutinlerine yönelik çağrıları aynı spin lock üzerinde karıştırmamalıdır.
Sürücü zaten IRQL = DISPATCH_LEVEL konumundaysa, bunun yerine KeAcquireInStackQueuedSpinLockAtDpcLevel ve KeReleaseInStackQueuedSpinLockFromDpcLevel çağrıları yapabilir.