Bagikan melalui


Contoh Penggunaan Antrean I/O

Untuk setiap perangkat yang terhubung ke sistem dan didukung oleh driver tertentu, driver dapat menggunakan kombinasi antrean I/O berikut dan penangan permintaan:

  • Satu antrean I/O default dan satu handler permintaan, EvtIoDefault. Kerangka kerja akan mengirimkan semua permintaan perangkat ke antrean default, dan akan memanggil handler EvtIoDefault driver untuk mengirimkan setiap permintaan ke driver.

  • Satu, antrean I/O default dan beberapa penangan permintaan seperti EvtIoRead, EvtIoWrite, dan EvtIoDeviceControl. Kerangka kerja akan mengirimkan semua permintaan perangkat ke antrean default. Ini akan memanggil handler EvtIoRead driver untuk mengirimkan permintaan baca, handler EvtIoWrite untuk mengirimkan permintaan tulis, dan handler EvtIoDeviceControl untuk mengirimkan permintaan kontrol I/O perangkat.

  • Beberapa antrean I/O, seperti satu untuk permintaan baca dan yang lain untuk permintaan tulis. Untuk setiap antrean, driver hanya menyediakan satu handler permintaan karena antrean hanya menerima satu jenis permintaan.

  • Beberapa antrean I/O, masing-masing dengan beberapa penangan permintaan.

Beberapa contoh skenario meliputi:

Antrean I/O Berurutan Tunggal

Jika Anda menulis driver fungsi untuk drive disk yang hanya dapat melayani permintaan baca dan tulis satu per satu, driver fungsi hanya memerlukan satu antrean I/O per perangkat.

Driver dapat menggunakan antrean I/O default yang dibuat kerangka kerja saat driver memanggil WdfIoQueueCreate dan mengatur DefaultQueue ke TRUE dalam struktur WDF_IO_QUEUE_CONFIG antrean. Dalam struktur WDF_IO_QUEUE_CONFIG, driver juga harus menentukan:

  • WdfIoQueueDispatchSequential sebagai metode pengiriman, sehingga antrean I/O default akan mengirimkan permintaan I/O ke driver secara sinkron.

  • Fungsi panggilan balik peristiwa tunggal, EvtIoDefault, yang akan menerima semua permintaan I/O.

Setiap kali permintaan I/O tersedia dalam antrean I/O default driver, kerangka kerja akan mengirimkan permintaan ke driver dengan memanggil handler permintaan EvtIoDefault driver. Jika permintaan lain tersedia dalam antrean, kerangka kerja tidak akan mengirimkannya sampai driver memanggil WdfRequestComplete untuk permintaan yang dikirimkan sebelumnya.

Beberapa Antrean I/O Berurutan dan Antrean Manual

Pertimbangkan perangkat port serial yang memiliki karakteristik berikut:

  • Ini dapat secara bersamaan melakukan satu operasi baca dan satu operasi tulis.

  • Ini tidak dapat melakukan beberapa operasi baca atau tulis secara asinkron.

  • Ini dapat menerima permintaan kontrol I/O perangkat untuk informasi status. Driver perangkat mungkin membutuhkan waktu lama untuk menyelesaikan beberapa permintaan ini (seperti permintaan untuk menunggu perubahan status).

Driver fungsi untuk perangkat ini dapat menggunakan beberapa antrean I/O berurutan per perangkat. Driver akan memanggil WdfIoQueueCreate tiga kali: sekali untuk membuat antrean default dan dua kali untuk membuat dua antrean I/O tambahan. Dalam struktur WDF_IO_QUEUE_CONFIG untuk setiap antrean ini, driver harus menentukan:

  • WdfIoQueueDispatchSequential sebagai metode pengiriman untuk setiap antrean, sehingga kerangka kerja akan mengirimkan permintaan I/O ke driver secara sinkron.

  • Handler permintaan yang berbeda untuk setiap antrean (EvtIoDefault, EvtIoRead, dan EvtIoWrite), yang akan menerima permintaan I/O antrean.

Setelah memanggil WdfIoQueueCreate, driver dapat memanggil WdfDeviceConfigureRequestDispatching dua kali - untuk meneruskan semua permintaan baca ke salah satu antrean tambahan dan semua permintaan tulis ke yang lain.

Dengan konfigurasi ini, fungsi panggilan balik EvtIoDefault antrean I/O default perangkat hanya akan menerima permintaan kontrol I/O perangkat untuk informasi status.

Jika driver harus menahan permintaan status untuk waktu yang lama, driver dapat membuat antrean keempat dan menentukan WdfIoQueueDispatchManual sebagai metode pengiriman. Ketika driver menerima permintaan informasi yang harus ditunda, driver dapat menempatkan permintaan dalam antrean tambahan ini sampai informasi status tersedia. Kemudian driver dapat mengambil permintaan dari antrean dan menyelesaikannya. Sementara itu, antrean default dapat mengirimkan permintaan lain ke driver.

Antrean I/O Paralel Tunggal

Pengontrol disk IDE dapat tumpang tindih dengan beberapa operasi I/O, tetapi tidak yang lain. Misalnya, saat pengontrol memproses operasi baca atau tulis pada satu disk, pengontrol dapat mengirim perintah pencarian ke disk lain. Di sisi lain, beberapa perintah baca dan tulis simultan tidak didukung.

Driver fungsi untuk pengontrol ini harus memeriksa setiap permintaan I/O. Jika driver menerima perintah pencarian, itu harus menentukan apakah perintah pencarian dapat diproses. Perintah pencarian tidak dapat diproses jika:

  • Disk drive yang ditentukan sudah sibuk.

  • Drive disk sedang diformat dan, oleh karena itu, tidak ada drive lain yang dapat aktif.

Untuk setiap perangkat yang terhubung ke pengontrol, driver dapat memanggil WdfIoQueueCreate untuk membuat antrean I/O default. Dalam struktur WDF_IO_QUEUE_CONFIG untuk setiap antrean ini, driver harus menentukan:

  • WdfIoQueueDispatchParallel sebagai metode pengiriman untuk setiap antrean, sehingga kerangka kerja akan mengirimkan permintaan I/O ke driver secara asinkron.

  • Fungsi panggilan balik peristiwa EvtIoDefault untuk setiap antrean, yang akan menerima permintaan I/O antrean.

Dengan konfigurasi ini, satu antrean I/O paralel ditetapkan ke setiap perangkat. Driver harus memeriksa setiap permintaan I/O yang dikirimkan kerangka kerja dari setiap antrean I/O. Jika driver dapat segera memproses permintaan, ia melakukannya. Jika tidak, driver memanggil WdfIoQueueStop, yang menyebabkan kerangka kerja berhenti mengirimkan permintaan sampai driver memanggil WdfIoQueueStart.

Beberapa Antrean I/O Paralel

Adaptor host SCSI adalah contoh perangkat yang mendukung operasi I/O asinkron dan tumpang tindih. Hingga 32 perangkat dapat dihubungkan ke adaptor. Pertimbangkan sistem dengan konfigurasi berikut:

  • Beberapa perangkat yang terhubung ke adaptor SCSI mendukung "pemilihan ulang", dan beberapa tidak. Jika perangkat SCSI mendukung pemilihan ulang, maka selama operasi I/O, perangkat dapat melepaskan adaptor untuk sementara sehingga adaptor dapat melayani perangkat lain. Perangkat pertama kemudian memilih kembali dirinya sendiri untuk menyelesaikan operasinya.

  • Adaptor SCSI menggunakan kotak surat perangkat keras untuk meneruskan permintaan dan respons antara driver dan perangkat. Jika perangkat siap untuk permintaan tetapi tidak ada kotak surat yang tersedia, perangkat harus menunggu.

Untuk performa terbaik, driver fungsi untuk adaptor host SCSI ini harus menerima permintaan I/O dari kerangka kerja segera setelah tersedia. Driver harus memeriksa setiap permintaan dan menentukan apakah dapat segera dimulai atau harus ditunda sampai perangkat dan sumber daya (seperti memori kotak surat) tersedia.

Driver mungkin harus menggunakan beberapa antrean I/O paralel. Untuk setiap perangkat yang terhubung ke adaptor, driver akan memanggil WdfIoQueueCreate untuk membuat antrean I/O default. Dalam struktur WDF_IO_QUEUE_CONFIG untuk setiap antrean ini, driver harus menentukan:

  • WdfIoQueueDispatchParallel sebagai metode pengiriman untuk setiap antrean, sehingga kerangka kerja akan mengirimkan permintaan I/O ke driver secara asinkron.

  • Fungsi panggilan balik peristiwa EvtIoDefault untuk setiap antrean, yang akan menerima permintaan I/O antrean.

Setiap fungsi panggilan balik EvtIoDefault antrean I/O harus memeriksa permintaan I/O antrean, saat dikirimkan, dan menentukan apakah masing-masing dapat segera dilayanakan. Jika perangkat dan sumber daya sistem tersedia, driver memulai operasi I/O. Jika perangkat atau sumber daya tidak tersedia, driver harus memanggil WdfIoQueueStop untuk menghentikan pengiriman permintaan tambahan hingga yang saat ini dapat diproses.

Secara opsional, driver dapat memanggil WdfIoQueueCreate untuk membuat antrean tambahan untuk setiap perangkat. Kemudian driver dapat memanggil WdfRequestForwardToIoQueue untuk mengantrekan kembali beberapa jenis permintaan ke antrean tambahan. Ketika kerangka kerja mengirimkan permintaan dari antrean tambahan, driver dapat memanggil WdfIoQueueStop, jika perlu, pada antrean tersebut alih-alih antrean default, sehingga meminimalkan jumlah atau jenis permintaan yang pengirimannya ditunda.