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.
Gecikmeli işleme gerektiren bir sürücü, asıl işlemeyi gerçekleştiren bir sürücü geri çağırma yordamını içeren bir iş öğesi kullanabilir. Sürücü iş öğesini kuyruğa alır ve sistem iş parçacığı iş öğesini kuyruktan kaldırır ve sürücünün geri çağırma rutinini çalıştırır. Sistem, her biri bir kerede bir iş öğesini işleyen sistem iş parçacıkları olan bu sistem çalışan iş parçacıklarının havuzunu tutar.
Sürücü bir WorkItem geri çağırma yordamını iş öğesiyle ilişkilendirir. Sistem çalışan iş parçacığı iş öğesini işlediğinde ilişkili WorkItem yordamını çağırır. Windows Vista ve Windows'un sonraki sürümlerinde, bir sürücü bunun yerine bir WorkItemEx yordamını bir iş öğesiyle ilişkilendirebilir. WorkItemEx , WorkItem'in aldığı parametrelerden farklı parametreler alır.
WorkItem ve WorkItemEx yordamları bir sistem iş parçacığı bağlamında çalışır. Bir sürücü dağıtım yordamı kullanıcı modu iş parçacığı bağlamında çalıştırılabilirse, bu yordam sistem iş parçacığı bağlamı gerektiren tüm işlemleri gerçekleştirmek için bir WorkItem veya WorkItemEx yordamını çağırabilir.
Bir iş öğesini kullanmak için sürücü aşağıdaki adımları gerçekleştirir:
Yeni bir iş öğesini tahsis et ve başlat.
Sistem, bir iş öğesini tutmak için IO_WORKITEM bir yapı kullanır. Yeni bir IO_WORKITEM yapısı ayırmak ve bunu iş öğesi olarak başlatmak için sürücü IoAllocateWorkItem'i çağırabilir. Windows Vista ve Windows'un sonraki sürümlerinde, sürücü alternatif olarak kendi IO_WORKITEM yapısını ayırabilir ve yapıyı bir iş öğesi olarak başlatmak için IoInitializeWorkItem'i çağırabilir. (Sürücü, bir iş öğesini tutmak için gereken bayt sayısını belirlemek için IoSizeofWorkItem'i çağırmalıdır.)
Bir geri çağırma işlevini iş öğesiyle ilişkilendirin ve iş öğesini bir sistem iş parçacığı tarafından işlenmesi için kuyruğa alın.
Bir WorkItem yordamını iş öğesiyle ilişkilendirmek ve iş öğesini kuyruğa almak için sürücünün IoQueueWorkItem çağrısı yapması gerekir. Bunun yerine bir WorkItemEx yordamını iş öğesiyle ilişkilendirmek ve iş öğesini kuyruğa almak için sürücünün IoQueueWorkItemEx çağrısı yapması gerekir.
İş öğesini artık gerekli olmadığında serbest bırakın.
IoAllocateWorkItem tarafından ayrılan bir iş öğesi IoFreeWorkItem tarafından serbest bırakılmalıdır. IoInitializeWorkItem tarafından başlatılan bir iş öğesinin serbest hale getirilebilmesi için önce IoUninitializeWorkItem tarafından başlatılmamış olması gerekir.
İş öğesi, sadece kuyruğa alınmadığı zaman başlatılmamış veya serbest bırakılmış olabilir. Sistem, iş öğesinin geri çağırma yordamını çağırmadan önce iş öğesini sıralar, bu nedenle IoFreeWorkItem ve IoUninitializeWorkItem geri çağırmadan çağrılabilir.
Uzun işleme gerektiren veya engelleme çağrısı yapan bir işleme görevi başlatması gereken bir DPC, bu görevin işlenmesini bir veya daha fazla iş öğesine devretmelidir. DPC çalışırken tüm iş parçacıklarının çalışması engellenir. Ayrıca, IRQL = DISPATCH_LEVEL'de çalışan bir DPC'nin engelleme çağrıları yapmaması gerekir. Ancak, bir iş öğesini işleyen sistem çalışan iş parçacığı IRQL = PASSIVE_LEVEL'de çalışır. Bu nedenle, iş öğesi bloke edici çağrılar içerebilir. Örneğin, bir sistem çalışanı iş parçacığı dağıtıcı nesnesinde bekleyebilir.
Sistem çalışan iş parçacıkları havuzu sınırlı bir kaynak olduğundan, WorkItem ve WorkItemEx yordamları yalnızca kısa bir süre alan işlemler için kullanılabilir. Bu yordamlardan biri çok uzun süre çalışıyorsa (örneğin, süresiz bir döngü içeriyorsa) veya çok uzun süre beklerse, sistem kilitlenmeye neden olabilir. Bu nedenle, bir sürücü uzun süre gecikmeli işleme gerektiriyorsa, bunun yerine kendi sistem iş parçacığını oluşturmak için PsCreateSystemThread çağrısı yapmalıdır.
Zaten kuyrukta olan bir iş öğesini kuyruğa almak için IoQueueWorkItem veya IoQueueWorkItemEx çağırmayın. Bunun yapılması sistem veri yapılarının bozulmasına neden olabilir. Sürücünüz belirli bir sürücü yordamı her çalıştığında aynı iş öğesini kuyruğa alırsa, iş öğesinin zaten kuyruktaysa ikinci kez kuyruğa alınmasını önlemek için aşağıdaki tekniği kullanabilirsiniz:
- Sürücü, çalışan işlem rutini için görevlerin bir listesini tutar.
- Bu görev listesi, çalışan yordamına sağlanan bağlamda kullanılabilir. Çalışan yordamı ve görev listesini değiştiren tüm sürücü yordamları, listeye erişimlerini senkronize eder.
- Her çalıştığında, işçi rutini listedeki tüm görevleri gerçekleştirir ve her görev tamamlandığında görevi listeden kaldırır.
- Yeni bir görev geldiğinde, sürücü bu görevi listeye ekler. Sürücü yalnızca görev listesi daha önce boşsa iş öğesini kuyruğa alır.
Sistem çalışan iş parçacığı, çalışan iş parçacığını çağırmadan önce iş öğesini kuyruktan kaldırır. Bu nedenle, bir sürücü iş parçacığı, çalışan iş parçacığı çalışmaya başlar başlamaz iş öğesini güvenli bir şekilde tekrar sıraya koyabilir.