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.
Sürücü rutini bir döndürme kilidi tuttuğunda, sistemin çökmesine neden olmadan donanım veya yazılım istisnası oluşturamaz. Başka bir deyişle, sürücünün ISR'ı ve sürücünün KeSynchronizeExecution çağrısında sağladığı herhangi bir SynchCritSection rutini, sayfa hatası veya aritmetik özel durum gibi bir hataya veya tuzağa neden olmamalı ve yazılım özel durumu oluşturmasına izin vermemelidir. KeAcquireSpinLock veya KeAcquireInStackQueuedSpinLock çağıran bir yordam, yönetici dönüş kilidini serbest bırakmadıkça ve artık IRQL = DISPATCH_LEVEL'de çalışmıyor olmadıkça donanım özel durumuna neden olamaz veya yazılım özel durumu oluşturamaz.
Sayfalanabilir Veri ve Destek İşlemleri
Bir döndürme kilidi tutarken sürücülerin sayfalanabilir verilere erişen yordamları çağırmaması gerekir. Sürücülerin, çağrılabilir verilere erişen belirli destek yordamlarını yalnızca IRQL, DISPATCH_LEVEL'den kesinlikle daha düşük seviyelerdeyken çağırabileceğini unutmayın. Bu IRQL kısıtlaması, bir spin kilidi tutarken bu destek yordamlarının çağrılmalarını önler. Belirli destek yordamlarına ait IRQL gereksinimlerini görmek için, bu yordamın başvuru sayfasına bakın.
Özyineleme
Yinelemeli olarak bir döndürme kilidi alma girişiminin kilitlenmeye neden olduğu garanti edilir: Özyinelemeli bir yordamın bekletme örneği, ikinci bir örnekleme dönerken döndürme kilidini serbest bırakamaz ve aynı döndürme kilidini almaya çalışır.
Aşağıdaki yönergelerde özyinelemeli prosedürlerle döndürme kilitlerini kullanmanız açıklanmaktadır.
Özyinelemeli rutin, bir spin kilidi tutarken kendisini çağırmamalı veya sonraki çağrılarda aynı spin kilidini edinmeye çalışmamalıdır.
Özyinelemeli yordam bir döndürme kilidi tutarken, eğer özyineleme bir kilitlenmeye neden olabilir ya da çağıranın döndürme kilidini 25 mikrosaniyeden uzun süre tutmasına yol açabilirse, başka bir sürücü yordamı bu özyinelemeli yordamı çağırmamalıdır.
Özyinelemeli sürücü yordamları hakkında daha fazla bilgi için bkz. Çekirdek Yığınını Kullanma.
İç İçe Spin Lock Alımları
Başka bir döndürme kilidini tutarken ikinci bir döndürme kilidi almaya çalışmak da kilitlenmelere veya düşük sürücü performansına neden olabilir.
Aşağıdaki yönergelerde sürücülerin spin kilitlerini nasıl tutması gerektiği açıklanmaktadır:
Sürücü, kilitlenme oluşmadığı sürece bir döndürme kilidi kullanan bir destek yordamı çağırmamalıdır.
Kilitlenme oluşamasa bile, alternatif kodlama teknikleri benzer sürücü performansı ve işlevselliği sağlayamadığı sürece sürücü, döndürme kilidi kullanan bir destek yordamı çağırmamalıdır.
Bir sürücü döndürme kilitlerini almak için iç içe çağrılar yaparsa, her seferinde döndürme kilitlerini aynı sırayla almalıdır. Bu sipariş kilitlenmeleri önlemeye yardımcı olur.
Genel olarak, çakışan alt kümeleri veya ayrı ya da paylaşılan veri ve kaynak kümelerini korumak için iç içe geçmiş spin kilitleri kullanmaktan kaçının. Bir sürücü, çeşitli sürücü yordamları tarafından tek tek ve toplu olarak ayarlanabilen zamanlayıcı nesneleri çifti gibi ayrık kaynakları korumak için iki yönetici spin kilidi kullandığında neler olabileceğini düşünün. Sürücü, biri spin kilidi tutan iki yordamdan her biri diğer spin kilidini almaya çalıştığında, bir SMP üzerinde belirli aralıklarla sıkışır.
İç içe dönüş kilitleri alma hakkında daha fazla bilgi için bkz. Kilitler, Kilitlenmeler ve Senkronizasyon.