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.
Çekirdek modu sürücüleri, paylaşılan sistem belleğindeki başka bir çekirdek modu sürücüsü tarafından oluşturulan ve silinen nesnelere güvenli bir şekilde erişmek için kullanım süresi koruması kullanabilir.
Eğer bir nesnenin tüm bekleyen erişimleri tamamlanmışsa ve nesneye erişmek için yeni istekler verilmeyecekse, nesnenin tamamlandığı söylenir. Örneğin, paylaşılan bir nesnenin silinebilmesi ve yeni bir nesneyle değiştirilebilmesi için aşağı çalıştırılması gerekebilir.
Paylaşılan nesnenin sahibi olan sürücü, diğer sürücülerin nesne üzerinde sonlandırma koruması almasına ve bırakmasına olanak sağlayabilir. Çökme koruması etkin olduğunda, sahibi dışındaki başka bir sürücü, sahibin nesneyi erişim tamamlanmadan önce silme riski olmadan nesneye erişebilir. Erişim başlamadan önce, erişim sürücüsü nesne üzerinde hareketsizlik koruması istemektedir. Uzun ömürlü bir nesne için bu istek neredeyse her zaman verilir. Erişim tamamlandıktan sonra, erişim sürücüsü nesne üzerinde daha önce edindiği run-down korumasını serbest bırakır.
Birincil run-down koruma yordamları
Bir nesneyi paylaşmaya başlamak için, nesnenin sahibi olan sürücü nesnede aşağı açılan korumayı başlatmak için ExInitializeRundownProtection yordamını çağırır. Bu çağrıdan sonra, nesneye erişen diğer sürücüler nesne üzerinde run-down koruması alabilir ve serbest bırakabilirsiniz.
Paylaşılan nesneye erişen bir sürücü, nesne üzerinde run-down koruması istemek için ExAcquireRundownProtection yordamını çağırır. Erişim tamamlandıktan sonra, bu sürücü nesnede aşağı açılan korumayı serbest bırakmak için ExReleaseRundownProtection yordamını çağırır.
Sahip olan sürücü paylaşılan nesnenin silinmesi gerektiğini belirlerse, nesnenin tüm bekleyen erişimleri tamamlanana kadar bu sürücü nesneyi silmek için bekler.
Paylaşılan nesneyi silme hazırlığında, sahibi olan sürücü nesnenin tamamlanmasını beklemek için ExWaitForRundownProtectionRelease yordamını çağırır. Bu çağrı sırasında ExWaitForRundownProtectionRelease , nesne üzerinde daha önce verilen tüm run-down koruması örneklerinin yayımlanmasını bekler, ancak nesne üzerinde yeni aşağı doğru koruma isteklerinin verilmesini engeller. Son korumalı erişim tamamlandıktan ve tüm çalışma koruması örnekleri serbest bırakıldıktan sonra ExWaitForRundownProtectionRelease fonksiyonu döner ve sahibi olan sürücü nesneyi güvenli bir şekilde silebilir.
ExWaitForRundownProtectionRelease , paylaşılan nesnede run-down korumasını tutan tüm sürücüler bu korumayı serbest bırakana kadar çağıran sürücü iş parçacığının yürütülmesini engeller. ExWaitForRundownProtectionRelease'ın aşırı uzun süre yürütmeyi engellemesini önlemek için, paylaşılan nesneye erişen sürücü iş parçacıkları nesne üzerinde aşağı doğru çalışma koruması tutarken askıya alınmamalıdır. Bu nedenle, sürücüler IRQL = APC_LEVEL'de çalışırken veya kritik bir bölge ya da korumalı bir bölge içinde, ExAcquireRundownProtection ve ExReleaseRundownProtection fonksiyonlarını çağırmalıdır.
Run-down korumasının kullanım alanları
Aşağı çalıştırma koruması, neredeyse her zaman kullanılabilir olan ancak bazen silinmesi ve değiştirilmesi gerekebilecek paylaşılan bir nesneye erişim sağlamak için kullanışlıdır. Verilere erişen veya bu nesnedeki yordamları çağıran sürücülerin silindikten sonra nesneye erişmeyi denememesi gerekir. Aksi takdirde, bu geçersiz erişimler öngörülemeyen davranışlara, veri bozulmasına ve hatta sistem hatasına neden olabilir.
Örneğin, işletim sistemi çalışırken genellikle bir virüsten koruma sürücüsü bellekte yüklü kalır. Bazen bu sürücünün kaldırılması ve sürücünün güncelleştirilmiş bir sürümüyle değiştirilmesi gerekebilir. Diğer sürücüler, bu sürücüdeki verilere ve yordamlara erişmek için virüsten koruma sürücüsüne G/Ç istekleri gönderir. G/Ç isteği göndermeden önce, dosya sistemi filtre yöneticisi gibi bir çekirdek bileşeni, G/Ç isteğini işlerken virüsten koruma sürücüsünün erken kaldırılmasına karşı koruma sağlamak için run-down koruması alabilir. G/Ç isteği tamamlandıktan sonra tükenme koruması kaldırılabilir.
Run-down koruması, paylaşılan bir nesneye erişimi seri hale getirmez. İki veya daha fazla erişim sürücüsü aynı anda bir nesne üzerinde run-down korumasını barındırabiliyorsa ve nesneye erişimler seri hale getirilmeliyse, erişimleri serileştirmek için karşılıklı dışlama kilidi gibi başka bir mekanizma kullanılmalıdır.
EX_RUNDOWN_REF yapısı
EX_RUNDOWN_REF yapısı, paylaşılan bir nesnede çalışmayı durdurma korumasının durumunu takip eder. Bu yapı sürücüler için opaktır. Sistem tarafından sağlanan azaltma koruma yordamları, nesne üzerinde mevcut olan azaltma koruması örneklerinin sayısını belirlemek için bu yapıyı kullanır. Bu rutinler, nesnenin yıpranmış olup olmadığını veya yıpranma sürecinde olup olmadığını izlemek için de bu yapıyı kullanır.
Bir nesneyi paylaşmaya başlamak için, nesnenin sahibi olan sürücü ExInitializeRundownProtection'ı çağırarak nesneyle ilişkili EX_RUNDOWN_REF yapısını başlatır. Başlatmadan sonra, sahibi olan sürücü bu yapıyı nesneye erişim gerektiren diğer sürücülerin kullanımına açabilir. Erişen sürücüler bu yapıyı, nesne üzerinde run-down koruması alan ve serbest bırakan ExAcquireRundownProtection ve ExReleaseRundownProtection çağrılarına parametre olarak geçirir. Sahibi olan sürücü, nesnenin sorunsuz bir şekilde sona ermesini bekleyen ve böylece güvenle silinebilmesini sağlayan ExWaitForRundownProtectionRelease çağrısına bu yapıyı parametre olarak geçirir.
Kilitle karşılaştırma
Run-down koruması, paylaşılan bir nesneye güvenli erişim sağlamanın çeşitli yollarından biridir. Bir diğer yaklaşım da karşılıklı dışlama yazılım kilidi kullanmaktır. Bir sürücü şu anda başka bir sürücü tarafından kilitlenen bir nesneye erişim gerektiriyorsa, ilk sürücü ikinci sürücünün kilidi serbest bırakmasını beklemelidir. Ancak kilitleri almak ve serbest bırakmak performans sorununa neden olabilir ve kilitler büyük miktarda bellek tüketebilir. Yanlış kullanıldığında, kilitler aynı paylaşılan nesneler için rekabet eden sürücülerin kilitlenmesine neden olabilir. Kilitlenmeleri algılama ve önleme çabaları genellikle önemli bilgi işlem kaynaklarının saptırılmasını gerektirir.
Kilitlenmelerin aksine, yıpranma korumasının hafif işlem süresi ve bellek gereksinimleri vardır. Nesnenin tüm bekleyen erişimleri tamamlanana kadar silinmesinin ertelenmesini sağlamak için nesneyle basit bir referans sayacı ilişkilendirilir. Bu yaklaşımla, bir nesneye güvenli erişim sağlamak için karşılıklı dışlama yazılım kilitleri yerine atomik, birbirine kilitlenmiş donanım yönergeleri kullanılabilir. Alma ve serbest bırakma bitiş koruması çağrıları genellikle hızlıdır. Hafif bir mekanizma olan run-down koruması kullanmanın avantajları, uzun ömürlü ve birçok sürücü arasında paylaşılan bir nesne için önemli olabilir.
Diğer kapanış koruma prosedürleri
Daha önce bahsedilenlere ek olarak birkaç başka koruma rutini de mevcuttur. Bu ek yordamlar bazı sürücüler tarafından kullanılabilir.
ExReInitializeRundownProtection yordamı, daha önce kullanılan bir EX_RUNDOWN_REF yapısının yeni bir nesneyle ilişkilendirilmesini sağlar ve bu nesnede aşağı doğru çalıştırma korumasını başlatır.
ExRundownCompleted yordamı, ilişkili nesnenin çalıştırmasının tamamlandığını göstermek için EX_RUNDOWN_REF yapısını güncelleştirir.
ExAcquireRundownProtectionEx ve ExReleaseRundownProtectionEx yordamları ExAcquireRundownProtection ve ExReleaseRundownProtection'a benzer. Bu dört yordam, paylaşılan nesne üzerinde etkin durumda olan tükenme koruması örneklerinin sayısını artırır veya azaltır. ExAcquireRundownProtection ve ExReleaseRundownProtection bu sayıyı birer birer artırırken ve azaltırken, ExAcquireRundownProtectionEx ve ExReleaseRundownProtectionEx sayıyı belirli olmayan tutarlarla artırır ve küçültür.
Önbelleğe duyarlı run-down koruması
Kısa yol referansı, sıkıştırılmış ve hızlı bir veri yapısıdır, fakat birçok işlemci aynı anda referansı elde etmeye çalıştığında önbellek çatışması oluşabilir. Bu, sürücünüzün performansını ve ölçeklenebilirliğini etkileyebilir.
Bu sorunu önlemek için, başvuru izlemeyi birden çok önbellek satırına dağıtmak amacıyla önbelleğe duyarlı bir çalışma referansı kullanabilirsiniz. Bu, önbellek çekişmesini azaltır ve çok işlemcili bilgisayarlarda sürücünüzün performansını artırır.
Önbelleğe duyarlı bir çözülme referansı kullanmak için şu adımları izleyin:
- Aşağıdakilerden birini yaparak bir EX_RUNDOWN_REF_CACHE_AWARE nesnesi oluşturun:
- ExAllocateCacheAwareRundownProtection çağrısı yapın. Bu, başlatmayı gerçekleştirir.
- Alternatif olarak, bellek ayırmayı denetlemek için ExSizeOfRundownProtectionCacheAware çağrısı yapın, döndürülen boyutta bir arabellek ayırın, ardından bu arabellek ve boyutu ExInitializeRundownProtectionCacheAware'e geçirin.
- ExAcquireRundownProtectionCacheAware yordamını çağırarak nesneye erişmeden önce nesne üzerinde rundown koruması isteyin. Bu rutin, istek kabul edilirse TRUE, nesne kapatılıyorsa FALSE döndürür.
- ExReleaseRundownProtectionCacheAware rutinini çağırarak nesneye eriştikten sonra nesne üzerindeki rundown korumasını kaldırın.
- ExWaitForRundownProtectionReleaseCacheAware rutinini çağırarak nesnenin çalışmasını tamamlamasını bekleyin, daha sonra nesneyi silin. Bu yordam, nesnedeki tüm rundown koruması örnekleri serbest bırakılana kadar geçerli iş parçacığını engeller.
- Eğer sürücü daha önce ExAllocateCacheAwareRundownProtection çağırdıysa, rundown referansını serbest bırakmak için ExFreeCacheAwareRundownProtection çağırmalıdır.
Önbelleğe duyarlı bir özet referansı yeniden kullanmak için şu adımları izleyin:
- ExWaitForRundownProtectionReleaseCacheAware çağrısı yaptıktan sonra, eski nesnenin çalışmasının tamamlandığını belirtmek için ExRundownCompletedCacheAware'i çağırın.
- İlişkili nesne çalıştırıldıktan sonra başvuruyu yeniden başlatmak için ExReInitializeRundownProtectionCacheAware çağrısı yapın.
- Artık sürücü exAcquireRundownProtectionCacheAware'i yeniden çağırabilir.
Önbelleğe duyarlı bir çalıştırma başvurusu, belirli durumlarda daha iyi performans ve ölçeklenebilirlik avantajına sahiptir, ancak normal bir çalıştırma başvurusundan daha fazla bellek tüketir. İki tür rundown başvurusu arasında seçim yaparken bu dengeyi göz önünde bulundurmanız gerekir.