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.
İsteğe bağlı G/Ç işlemlerini gerçekleştirmek için sabit boyutlu arabellekleri dinamik olarak ayırması gereken sürücüler ExXxxLookasideListEx veya ExXxxLookasideList destek yordamlarını kullanabilir. Böyle bir sürücü lookaside listesini başlattıktan sonra, işletim sistemi, sürücünün lookaside listesinde verilen boyutta dinamik olarak ayrılmış bazı arabellekleri barındıracak ve böylece sürücü için yeniden kullanılabilir, sabit boyutlu arabellek kümesini etkin bir şekilde rezerve edecektir. Bir sürücünün görünüm listesindeki sabit boyutlu arabelleklerin ( girişler olarak da bilinir) biçimi ve içeriği sürücü tarafından belirlenir.
Örneğin, temel alınan SCSI bağlantı noktası/miniport sürücüleri için SCSI istek bloklarını (SRB) ayarlaması gereken depolama sınıfı sürücüleri, lookaside listelerini kullanır. Böyle bir sınıf sürücüsü, ihtiyaca göre lookaside listesinden SRB'ler için arabellekler ayırır ve tamamlanmış bir IRP içinde sınıf sürücüsüne bir SRB geri döndüğünde her SRB arabelleğini lookaside listesine geri bırakarak lookaside listesinin yeniden kullanmasını sağlar. Depolama sınıfı sürücüsü, sürücüdeki G/Ç talebi arttığından ve düştüğünden, herhangi bir zamanda kaç SBS kullanması gerekip gerekmediğini önceden belirleemediğinden, benzer bir liste, böyle bir sürücüdeki sabit boyutlu SBS'ler için arabellek ayırmayı ve serbest bırakma işlemini yönetmenin kullanışlı ve ekonomik bir yoludur.
İşletim sistemi, şu anda kullanılmakta olan tüm sayfalanmış ve sayfalanmamış lookaside listeleriyle ilgili durumu hakkında bilgi korur, tüm listelerdeki girişlerin tahsis ve serbest bırakma taleplerini dinamik olarak takip eder ve yeni girişler için mevcut sistem havuzunu sağlar. Ayırma talebi yüksek olduğunda, işletim sistemi her bir görünüm listesinde tuttuğu girdi sayısını artırır. Talep yeniden düştüğünde, fazla görünüm girdilerini sistem havuzuna geri gönderir.
Lookaside listeleri iş parçacığı açısından güvenlidir. Bir lookaside listesi, bir sürücüde eş zamanlı olarak çalışan birden çok iş parçacığının bu listeyi paylaşmasına olanak sağlayan yerleşik eşitleme mekanizmasına sahiptir. Bu iş parçacıkları, paylaşılan görünüm listesinden arabellekleri güvenli bir şekilde ayırabilir ve sürücünün bu işlemleri açıkça eşitlemesine gerek kalmadan bu arabellekleri listeye boşaltabilir. Ancak, olası sızıntıları ve veri bozulmalarını önlemek için, bir lookaside listesini paylaşan bir dizi iş parçacığının, listenin başlatılmasını ve silinmesini açıkça eşitlemesi gerekir.
Lookaside liste arayüzleri
Windows Vista'dan başlayarak, LOOKASIDE_LIST_EX yapısı sayfalanmış veya sayfalanmamış arabellekler içerebilen bir lookaside listesini tanımlar. Bir sürücü bu görünüm listesi için özel Allocate ve Free yordamları sağlıyorsa, bu yordamlar giriş parametresi olarak özel bir bağlam alır. Bir sürücü bu bağlamı, görünüm listesi için özel verileri toplamak için kullanabilir. Örneğin bağlam, liste tarafından dinamik olarak ayrılan ve serbest olan liste girdilerinin sayısını saymak için kullanılabilir. Bağlamı bu şekilde kullanmayı gösteren bir kod örneği için bkz. ExInitializeLookasideListEx.
Aşağıdaki sistem sağlanan yordamlar LOOKASIDE_LIST_EX yapısı tarafından tanımlanan lookaside listeleri destekler:
Windows 2000'den başlayarak , PAGED_LOOKASIDE_LIST yapısı disk belleği arabellekleri içeren bir görünüm listesini açıklar. Bir sürücü bu çevrimdışı liste için özel Ayırma ve Serbest Bırak yordamları sağlıyorsa, bu yordamlar giriş parametresi olarak özel bir bağlam almaz. Bu nedenle, sürücünüzün yalnızca Windows Vista ve Windows'un sonraki sürümlerinde çalışması amaçlanıyorsa, görünüm listelerinizin PAGED_LOOKASIDE_LIST yapısı yerine LOOKASIDE_LIST_EX yapısını kullanmayı göz önünde bulundurun. Aşağıdaki sistem tarafından sağlanan yordamlar, bir PAGED_LOOKASIDE_LIST yapısı ile tanımlanan lookaside listelerini destekler.
ExAllocateFromPagedLookasideList
ExInitializePagedLookasideList
Windows 2000'den başlayarak NPAGED_LOOKASIDE_LIST yapısı, sayfalanmamış arabellekler içeren bir lookaside listesini tanımlar. Bir sürücü bu görünüm listesi için özel Ayırma ve Ücretsiz yordamlar sağlıyorsa, bu yordamlar giriş parametresi olarak özel bağlam almaz. Sürücünüzün yalnızca Windows Vista ve Windows'un sonraki sürümlerinde çalışması amaçlanıyorsa, görünüm listelerinizin NPAGED_LOOKASIDE_LIST yapısı yerine LOOKASIDE_LIST_EX yapısını kullanmayı göz önünde bulundurun. Aşağıdaki sistem tarafından sağlanan yordamlar , NPAGED_LOOKASIDE_LIST yapısı tarafından açıklanan lookaside listelerini destekler:
ExAllocateFromNPagedLookasideList
ExInitializeNPagedLookasideList
Uygulama yönergeleri
LOOKASIDE_LIST_EX yapısı kullanan bir görünüm listesi uygulamak için şu tasarım yönergelerini izleyin:
Bir lookaside listesini başlatmak için ExInitializeLookasideListEx çağırın. Lookaside listesindeki öğelerin sayfalanan mı yoksa sayfalanmayan arabellekler mi olacağını bu çağrıda belirtin. Sürücünün kendisi veya görünüm listesi girdilerini geçirdiği herhangi bir temel sürücü IRQL >= DISPATCH_LEVEL'de bu girişlere erişiyorsa, sayfalanmamış arabellekleri kullanın. Sayfalı arabellekleri yalnızca sürücünün lookaside listesi girdilerine erişimler her zaman IRQL <= APC_LEVEL olduğunda kullanın.
Lookaside listesinin LOOKASIDE_LIST_EX yapısı, listedeki girdilerin sayfalanmış veya sayfalanmamış olmasına bakılmaksızın her zaman sayfalanmamış sistem belleğinde bulunmalıdır.
Daha iyi performans için, ayırma ve serbest bırakma rutinlerinin yalnızca bellek tahsis etmesi ve boşaltması gerektiğinde, Ayırma ve Boşalt parametreleri için NULL işaretçilerini ExInitializeLookasideListEx'e iletin. Örneğin, bu işlevler, sürücünün dinamik olarak ayrılan arabelleklerin kullanımı hakkındaki bilgileri kaydedebilir.
Sürücü tarafından sağlanan Allocate rutini, yeni bir arabellek ayırmak için aldığı giriş parametrelerini (PoolType, Tag ve Size) doğrudan ExAllocatePoolWithTag veya ExAllocatePoolWithQuotaTag rutinine geçirebilir.
ExAllocateFromLookasideListEx'e yapılan her çağrı için, önceden ayrılmış bir girdi artık kullanılmadığından exFreeToLookasideListEx'e yönelik karşılıklı çağrıyı mümkün olan en kısa sürede yapın.
Sırasıyla ExAllocatePoolWithTag ve ExFreePool çağrısından başka bir şey yapmayan Allocate ve Free yordamlarının temini işlemci döngülerini boşa harcar. ExAllocateFromLookasideListEx, bir sürücü ExInitializeLookasideListEx'eNULLAyırma ve Ücretsiz işaretçileri geçtiğinde ExAllocatePoolWithTag ve ExFreePool'a gerekli çağrıları otomatik olarak yapar.
Sürücü tarafından sağlanan herhangi bir Ayırma yordamı, sayfasız bir yan bakış listesinde tutulacak bir giriş için sayfalı havuzdan bellek ayırmamalıdır; ya da tam tersi. ExAllocateFromLookasideListEx'e yapılan sonraki sürücü çağrıları liste boş olmadığı sürece şu anda lookaside listesinde tutulan ilk girişi döndürdüğünden sabit boyutlu girdiler de ayırması gerekir. Yani, ExAllocateFromLookasideListEx çağrısı, sürücü tarafından sağlanan Allocate yordamına yalnızca verilen lookaside listesi şu anda boşsa bir çağrıya neden olur. Bu nedenle, ExAllocateFromLookasideListEx'e yapılan her çağrıda, döndürülen girdi tam olarak sürücünün ihtiyaç duyduğu boyuta sahip olur, ancak lookaside listesindeki tüm girdiler sabit boyuttaysa. Sürücü tarafından sağlanan Bir Ayırma yordamı, sürücünün ilk olarak ExInitializeLookasideListEx'e ilettikleri Etiket değerini de değiştirmemelidir, çünkü havuz etiketi değerindeki değişiklikler sürücünün bellek kullanımını hata ayıklamayı ve izlemeyi zorlaştırabilir.
ExFreeToLookasideListEx'e yapılan çağrılar, liste zaten dolu değilse (yani, liste sistem tarafından belirlenen en fazla girdi sayısını içermediği sürece) daha önce lookaside listesinde ayrılmış girdileri depolar. Daha iyi performans için, bir sürücü ExAllocateFromLookasideListEx'e yaptığı her çağrı için olabildiğince hızlı bir şekilde ExFreeToLookasideListEx'e karşılıklı bir çağrı yapmalıdır. Bir sürücü girdileri hızlı bir şekilde kendi görünüm listesine geri boşalttığında, bu sürücünün ExAllocateFromLookasideListEx'e bir sonraki çağrısının, yeni bir giriş için dinamik olarak bellek ayırmanın performans cezasına neden olma olasılığı çok daha düşüktür.
Benzer yönergeler, PAGED_LOOKASIDE_LIST veyaNPAGED_LOOKASIDE_LIST yapısı kullanan bir lookaside listesi için de geçerlidir.