Aracılığıyla paylaş


G/Ç İstekleri için Gönderme Yöntemleri

Bir sürücü G/Ç kuyruğu oluşturmak için WdfIoQueueCreate çağırdığında, kuyruk için bir dağıtım yöntemi belirtir. Çerçeve üç yönlendirme yöntemi sağlar: sıralı, paralel ve manuel. Sürücü, bir cihazın varsayılan G/Ç kuyruğu da dahil olmak üzere herhangi bir G/Ç kuyruğu için bu gönderme yöntemlerinden herhangi birini belirleyebilir.

Sürücü, kuyruğun WDF_IO_QUEUE_DISPATCH_TYPE türünde bir değer belirterek kuyruğun WDF_IO_QUEUE_CONFIG yapısında dağıtım yöntemini ayarlar.

Her bir gönderme yönteminin örnek kullanımları için bkz. I/O Kuyruklarının Örnek Kullanımları.

#D0 Sıralı Dağıtım

Sürücünüz veya cihazınız bir kuyruktan aynı anda yalnızca bir G/Ç isteği işleyebiliyorsa, cihazın G/Ç kuyruklarını sıralı gönderme, yani zaman uyumlu gönderme olarak ayarlamanız gerekir. Bu tür bir gönderimle çerçeve, sürücüye istekleri teker teker teslim eder. Çerçeve, sürücünün önceki isteği tamamlaması, iptal etmesi veya yeniden sıraya almasına kadar sonraki isteği sunmaz.

Sürücünün istek işleyicilerinden birine çerçeve tarafından istek teslim edildikten sonra, sürücü bu isteği işler. Sürücü isteği #B0 genel G/Ç hedefi #A1 iletirse, genellikle G/Ç hedef nesnesinin eşzamanlı yöntemlerinden birini çağırır. Bu yöntemler hakkında daha fazla bilgi için bkz. G/Ç İsteklerini Zaman Uyumlu Olarak Gönderme. Sürücünün G/Ç kuyruğundan aldığı her isteği sonunda tamamlaması veya iptal etmesi gerekir.

Sıralı gönderim için bir G/Ç kuyruğu ayarlamış olan bir sürücü, son alınan istek tamamlanmadan veya iptal edilmeden önce kuyruktan başka bir istek almak için WdfIoQueueRetrieveNextRequest veya WdfIoQueueRetrieveRequestByFileObject çağırabilir. Bunu bir işlev sürücüsünde yapmak isteyebilirsiniz; böylece sürücünün EvtInterruptDpc geri çağırma işlevi önceki donanım işleminden verileri işlemeye devam ederken, sürücü sonraki donanım işlemini başlatabilir.

Birkaç G/Ç kuyruğu oluşturur ve bunların tümünü sıralı dağıtım için ayarlarsanız, çerçeve her kuyruktan istekleri sırayla gönderir, ancak kuyruklar paralel çalışır. Sürücünüz veya cihazınız yalnızca bir türde tek bir isteği işleyebiliyorsa, EvtIoDefault geri çağırma işleviyle tek bir G/Ç kuyruğu kullanmalısınız.

Paralel Dağıtım

Sürücünüz ve cihazınız aynı anda birden çok G/Ç isteğini işleyebiliyorsa, sürücünün istekleri eşzamansız işleyebilmesi için cihazın G/Ç kuyruklarını "paralel dağıtım" kullanacak şekilde yapılandırabilirsiniz. Bu gönderme yöntemi, zaman uyumsuz gönderme olarak da adlandırılır.

Bir sürücü paralel dağıtım kullanmak için bir G/Ç kuyruğu ayarlarsa, çerçeve kuyrukta kullanılabilir oldukları anda sürücüye G/Ç istekleri gönderir. Sonuç olarak, sürücünün aynı anda birkaç isteği işlemesi gerekebilir.

Sürücünün istek işleyicilerinden biri her istek aldığında, sürücü isteği işlemeli ve ardından isteği tamamlamalıdır. Sürücü isteği bir genel G/Ç hedefine iletirse, genellikle G/Ç hedef nesnesinin zaman uyumsuz yöntemlerinden birini çağırır. Bu yöntemler hakkında daha fazla bilgi için bkz: G/Ç İsteklerini Asenkron Olarak Gönderme. Sürücü, G/Ç kuyruğundan aldığı her isteği sonunda ya tamamlamalı ya da iptal etmelidir.

Paralel dağıtım kullanan bir sürücü, bir kuyruğu geçici olarak durdurmak için WdfIoQueueStop veya WdfIoQueueStopSynchronously çağırabilir ve ardından kuyruğu yeniden başlatmak için WdfIoQueueStart çağırabilir.

El ile Dağıtım

Sürücünüzün G/Ç isteklerinin teslimi üzerinde tam denetime sahip olmasını istiyorsanız, bir cihazın G/Ç kuyruğunu el ile gönderim yapacak şekilde ayarlayabilirsiniz. Bu, sürücü açıkça bir istek talep etmedikçe çerçevenin sürücüye istek göndermediği anlamına gelir.

Sürücü, el ile bir kuyruktan istek almak için WdfIoQueueRetrieveNextRequest #A2 #C3 #B0 #A1 çağırabilir veya kuyruğu yoklayan bir döngüde WdfIoQueueRetrieveRequestByFileObject #A6 #C7 #B4 #A5. Alternatif olarak, sürücü, kuyrukta bir veya daha fazla istek bulunduğunda çerçevenin çağıracağı bir geri çağırma fonksiyonunu kaydetmek için WdfIoQueueReadyNotify fonksiyonunu çağırabilir. Çerçeve geri çağırma işlevini çağırdıktan sonra sürücü, istekleri almak için bir döngüde WdfIoQueueRetrieveNextRequest #C1 veya #B2 WdfIoQueueRetrieveRequestByFileObject #C3 #B0 çağırabilir.

Sürücü kuyruktan bir istek aldıktan sonra isteği işlemelidir. Sürücünün her isteği sonunda tamamlaması veya iptal etmesi gerekir.