Aracılığıyla paylaş


İş parçacıklı DPC'lere giriş

İş parçacıklı DPC, sistemin IRQL'nin PASSIVE_LEVEL'e eşit olduğu seviyede yürüttüğü bir DPC'dir. İş parçacıklı DPC'ler varsayılan olarak etkinleştirilir, ancak HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable kayıt defteri anahtarını sıfır olarak ayarlayarak bunları devre dışı bırakabilirsiniz. İş parçacıklı DPC'ler devre dışı bırakıldığında, bunlar normal DPC'ler olarak yürütülür.

Sıradan bir DPC, tüm iş parçacıklarının yürütülmesine üstünlük sağlar ve bir iş parçacığı veya başka bir DPC tarafından öne geçilemez. Sistemde çok sayıda sıradan DPC kuyruğa alınmışsa veya bu DPC'lerden biri uzun süre çalışıyorsa, her iş parçacığı rastgele uzun süre duraklatılmış olarak kalır. Bu nedenle, her sıradan DPC sistem gecikme süresini artırır ve bu da ses veya video kayıttan yürütme gibi zamana duyarlı uygulamaların performansını etkileyebilir.

Buna karşılık, iş parçacıklı bir DPC sıradan bir DPC tarafından ön damgalanabilir, ancak diğer iş parçacıkları tarafından önlenemez. Bu nedenle, belirli bir DPC'nin başka bir DPC tarafından bile ön yüklenmemesi gerekmediği sürece, sıradan DPC'ler yerine iş parçacıklı DPC'ler kullanmanız gerekir.

Sistem, iş parçacıklı DPC'leri (ve sıradan DPC'leri) KDPC yapıları olarak temsil eder. İş parçacıklı bir DPC için KDPC yapısını başlatmak amacıyla KeInitializeThreadedDpc yordamını çağırın ve DPC'nin eylemini gerçekleştiren bir CustomThreadedDpc yordamı geçirin.

CustomThreadedDpc yordamı PASSIVE_LEVEL veya DISPATCH_LEVEL yürütülebildiğinden, CustomThreadedDpc yordamınızın her iki IRQL'de de doğru eşitlenmesini sağlamanız gerekir. Bunu yapma hakkında daha fazla bilgi için bkz: Senkronizasyon ve İş Parçacıklı DPC'ler.

Ayrıca CustomThreadedDpc yordamınızın DISPATCH_LEVEL kodu için tüm kısıtlamalara uydığından emin olmanız gerekir. İş parçacıklı DPC'ler etkinleştirilirse, IRQL = PASSIVE_LEVEL'de çalışırlar, ancak yine de normal DPC'lerle aynı kısıtlamalara tabidirler. CustomThreadedDpc yordamı tarafından çağrılan tüm işlevler de dahil olmak üzere iş parçacıklı bir DPC'de yürütülen tüm kodlar DPC ortamının kısıtlamalarına uygun olmalıdır. Örneğin kod, KEVENT nesneleri gibi pasif düzeydeki eşitleme nesnelerinde engellenmemelidir. Mevcut birçok cihaz yığını, ağ ve USB gibi, iş parçacıklı DPC işlemeyi desteklemez ve PASSIVE_LEVEL seviyesinde çağrıldıklarını fark ederlerse engellemeye çalışabilirler. Benzer nedenlerden dolayı ,Kernel-Mode Driver Framework (KMDF) iş parçacıklı DPC işlemeyi desteklemez ve KMDF sürücüleri iş parçacıklı DPC'leri kullanmayı denememelidir. DPC ortamı hakkında daha fazla bilgi için bakınız DPC Yordamları Yazma.

DPC kuyruğuna bir iş parçacığı eklemek için KeInsertQueueDpc'yi çağırın. Yürütülmeden önce kuyruktan iş parçacıklı DPC'yi kaldırmak için KeRemoveQueueDpc'yi çağırın.