Aracılığıyla paylaş


Spin kilitlerine giriş

Döndürme kilitleri, çekirdek tanımlı, sadece çekirdek modu eşitleme mekanizmalarıdır ve KSPIN_LOCK adlı opak bir tür olarak dışarı aktarılır. Paylaşılan verileri veya kaynakları aynı anda erişimden korumak için bir döndürme kilidi kullanılabilir. IRQL <= DISPATCH_LEVEL'de çalışırken bir sürücü, döndürme kilidini kuyruğa alınmış döndürme kilidi olarak almak ve serbest bırakmak için KeAcquireInStackQueuedSpinLock ve KeReleaseInStackQueuedSpinLock kullanabilir.

Alternatif olarak, IRQL >= DISPATCH_LEVEL çalışan arayanlar daha iyi sürücü performansı için KeAcquireSpinLockAtDpcLevel ve KeReleaseSpinLockFromDpcLevel'i çağırabilir.

Birçok bileşen, sürücüler de dahil olmak üzere spin kilitleri kullanır. Herhangi bir türde sürücü bir veya daha fazla yönetici spin kilidi kullanabilir. Örneğin, çoğu dosya sistemi, hem dosya sisteminin çalışan iş parçacığı geri çağırma yordamları hem de FSD tarafından işlenen IRP'leri depolamak için dosya sistemi sürücüsünün (FSD) aygıt uzantısında senkronize edilmiş bir iş kuyruğu kullanır. Kilitlenmiş bir iş kuyruğu, IRP'leri kuyruğa eklemeye çalışan FSD ve aynı anda IRP'leri kaldırmaya çalışan tüm iş parçacıkları arasındaki çekişmeyi çözen bir yönetici döndürme kilidi ile korunur. Başka bir örnek olarak, sistem disket denetleyicisi sürücüsü iki yönetici spin kilidi kullanır. Bir yönetici spin kilidi, bu sürücünün cihaza ayrılmış iş parçacığıyla paylaşılan kilitlenmiş bir iş kuyruğunun korunmasını sağlar; diğeri, üç sürücü yordamı tarafından paylaşılan bir zamanlayıcı nesnesini korur.

Kuyruğa alınan döndürme kilitleri, çok işlemcili makinelerde yüksek çekişme kilitleri için sıradan spin kilitlerinden daha iyi performans sağlar. Daha fazla bilgi için bkz. Kuyruğa Alınmış Döndürme Kilitleri. Sürücüler ayrıca keAcquireSpinLock ve KeReleaseSpinLock'u kullanarak bir spin kilidini sıradan bir spin lock olarak alabilir ve serbest bırakabilir.

Sürücüler, basit veri yapılarına erişimi eşitlemek için exInterlockedXxx yordamlarından herhangi birini kullanarak veri yapısına atomik erişim sağlayabilir. Bu yordamları kullanan sürücülerin spin kilidini açıkça alması veya serbest bırakması gerekmez.

ISR'ye sahip her sürücü, STARTIo ve DpcForIsr yordamlarından çağrılan ISR ile SynchCritSection yordamları arasında paylaşılan tüm verileri veya donanımı korumak için kesme döndürme kilidi kullanır. Bir kesme döndürme kilidi, ISR kaydetme bölümünde açıklandığı gibi sürücü IoConnectInterrupt'ı çağırdığında oluşturulan kesme nesneleri kümesiyle ilişkilendirilir.

Sürücülerde spin kilitlerini kullanmak için şu yönergeleri izleyin:

  • Yerleşik sistem alanı belleğinde ( Sanal Bellek Alanları ve Fiziksel Bellek şeklinde gösterildiği gibi, disk belleği olmayan bellek havuzu), bir döndürme kilidi tarafından korunan herhangi bir veri veya kaynak ve ilgili döndürme kilidi için depolama alanı sağlayın. Sürücü, kullandığı tüm yönetici spin kilitleri için depolama alanı sağlamalıdır. Ancak, isr kaydetme bölümünde açıklandığı gibi çok faktörlü ISR'ye veya birden fazla ISR'ye sahip olmadığı sürece bir cihaz sürücüsünün kesme döndürme kilidi için depolama sağlaması gerekmez.

  • Sürücü tarafından depolama sağlanan her döndürme kilidini, koruduğu paylaşılan veri veya kaynağa erişimi senkronize etmek için kullanmadan önce başlatmak üzere KeInitializeSpinLock çağrısını yapın.

  • Her destek yordamını, genellikle yönetici spin kilitleri için <= DISPATCH_LEVEL veya sürücünün kesme nesneleriyle ilişkili bir kesme spin kilidi için <= DIRQL olmak üzere, uygun bir IRQL düzeyinde çağırın.

  • Bir döndürme kilidi tutarken mümkün olan en kısa sürede yürütülecek yordamları uygulayın. Hiçbir rutin, 25 mikrosaniyeden daha uzun bir süre boyunca bir döndürme kilidi tutmamalıdır.

  • Bir döndürme kilidi tutarken aşağıdakilerden herhangi birini gerçekleştiren yordamları hiçbir zaman uygulamayın:

    • Donanım özel durumlarına neden olun veya yazılım özel durumlarını yükseltin.

    • Sayfalanabilir belleğe erişmeyi deneme.

    • Kilitlenmeye neden olabilecek veya 25 mikrosaniyeden uzun süre boyunca bir döndürme kilidinin tutulmasına neden olabilecek özyinelemeli bir çağrı yapın.

    • Kilitlenmeye yol açabilecekse başka bir döndürme kilidi edinmeye çalış.

    • Herhangi bir önceki kuralı ihlal eden bir dış yordam çağırın.