Bagikan melalui


Antrean dan Pengeluaran IRP

Karena manajer I/O mendukung I/O asinkron dalam sistem multitugas dan multithreaded, permintaan I/O ke perangkat dapat datang lebih cepat daripada drivernya dapat memprosesnya hingga selesai, terutama di mesin multiprosesor. Akibatnya, IRP yang terikat ke perangkat tertentu harus diantrekan di driver ketika perangkat tersebut sudah sibuk memproses IRP lain.

Oleh karena itu, driver tingkat terendah memerlukan salah satu hal berikut:

  • Rutin StartIo, yang dipanggil oleh pengelola I/O untuk memulai operasi I/O pada IRP yang telah dimasukkan oleh driver ke dalam antrean IRP yang disediakan oleh sistem (lihat IoStartPacket).

  • Mekanisme antrean dan pengeluaran IRP internal, yang digunakan driver untuk mengelola IRP yang datang lebih cepat daripada yang dapat diprosesnya. Driver dapat menggunakan antrean perangkat, antrean saling terkunci, atau antrean aman pembatalan. Untuk informasi selengkapnya, lihat Driver-Managed IRP Queues.

Hanya driver perangkat tingkat terendah yang dapat memenuhi dan menyelesaikan setiap IRP yang mungkin dalam rutinitas dispatch-nya tidak memerlukan rutinitas StartIo dan tidak ada antrean yang dikelola driver untuk IRP.

Driver tingkat lebih tinggi hampir tidak pernah memiliki rutinitas StartIo . Sebagian besar driver perantara tidak memiliki rutinitas StartIo atau antrean internal; driver perantara biasanya dapat meneruskan IRP dengan parameter yang valid dari rutinitas pemrosesannya dan melakukan pascapemrosesan yang diperlukan untuk IRP apa pun dalam rutinitas IoCompletion.

Berikut ini menjelaskan, secara umum, beberapa pertimbangan desain untuk menentukan apakah akan menerapkan rutinitas StartIo dengan atau tanpa antrean internal yang dikelola driver untuk IRP.

Rutinitas StartIo pada Driver

Untuk perangkat periferal komputer yang hanya mampu menangani satu operasi I/O perangkat pada satu waktu, driver perangkat dapat menerapkan rutinitas StartIo . Untuk driver-driver ini, manajer I/O menyediakan rutin IoStartPacket dan IoStartNextPacket untuk mengantrekan dan membatalkan antrean IRP ke dan dari antrean IRP yang disediakan oleh sistem.

Untuk informasi selengkapnya tentang rutinitas StartIo , lihat Menulis StartIo Routine.

Antrean Internal untuk IRP di Driver

Jika perangkat dapat mendukung lebih dari satu operasi I/O konkuren, driver perangkat tingkat terendahnya harus menyiapkan antrean permintaan internal dan mengelola antrian IRP-nya sendiri. Misalnya, driver serial sistem mempertahankan antrean terpisah untuk operasi baca, tulis, pemurnian, dan tunggu pada perangkatnya, karena mendukung perangkat serial dupleks penuh.

Driver tingkat lebih tinggi yang mengirim permintaan ke sejumlah driver perangkat dasar juga dapat memelihara antrean internal IRP. Misalnya, driver sistem file hampir selalu memiliki antrean internal untuk IRP.

Untuk informasi selengkapnya, lihat Driver-Managed Antrean IRP.

Sinkronisasi Antrean Internal

Driver-driver dengan utas khusus perangkat dan driver-driver tingkat tertinggi yang menggunakan utas pekerja eksekutif (termasuk sebagian besar driver sistem file) biasanya menyiapkan antrean IRP mereka sendiri. Antrian dibagikan oleh utas pengemudi atau callback utas pekerja yang disediakan oleh pengemudi dan oleh rutinitas pengemudi lain yang memproses IRP.

Driver yang menerapkan struktur antreannya sendiri harus memastikan bahwa akses ke antrean disinkronkan, dan IRP yang dibatalkan dihapus dari antrean. Untuk membuat tugas ini lebih sederhana bagi pengembang driver, antrean IRP aman pembatalan menyediakan kerangka kerja standar yang dapat Anda gunakan saat menerapkan antrean IRP. Lihat Cancel-Safe Antrean IRP untuk informasi selengkapnya. Ini adalah metode yang disukai untuk menerapkan antrean IRP.

Driver juga dapat menerapkan semua sinkronisasi antrean IRP dan logika pembatalan secara eksplisit. Misalnya, driver dapat menggunakan antrean yang saling mengunci. Rutinitas pengiriman driver memasukkan IRP ke dalam antrean yang saling mengunci dan utas yang dibuat driver atau panggilan balik alur pekerja driver menghapusnya dengan memanggil rutinitas dukungan ExInterlockedXxxList .

Misalnya, driver pengontrol floppy sistem menggunakan antrean terkunci. Utas khusus perangkatnya menangani pemrosesan IRP yang sama dengan yang dilakukan oleh rutinitas StartIo dari driver perangkat lain, dan beberapa pemrosesan IRP yang sama seperti yang dilakukan oleh rutinitas DpcForIsr dari driver perangkat lainnya.

Antrean Internal dengan StartIo Routines di Driver

Driver yang mengelola antrean internalnya sendiri juga dapat memiliki rutinitas StartIo , tetapi tidak perlu. Sebagian besar driver perangkat tingkat terendah memiliki rutinitas StartIo atau mengelola antrean IRP mereka sendiri, tetapi tidak keduanya.

Pengecualian dari ini adalah driver port SCSI, yang memiliki rutinitas StartIo dan mengelola antrean internal IRP. Manajer I/O mengantrekan IRP ke rutinitas StartIo milik driver port dalam antrian perangkat yang terkait dengan objek perangkat yang dibuat oleh driver yang mewakili SCSI HBA. Pengandar port SCSI juga menyiapkan dan mengelola antrean perangkat untuk IRP ke setiap perangkat target (sesuai dengan unit logis SCSI) pada bus SCSI yang dikendalikan HBA di mesin.

Driver port SCSI menggunakan antrean perangkat tambahannya untuk menahan RUN yang dikirim dari driver kelas SCSI dalam antrean khusus LU setiap kali perangkat apa pun di bus SCSI sangat sibuk. Akibatnya, antrean tambahan khusus LU ini memungkinkan driver port SCSI menserialisasikan operasi untuk perangkat SCSI heterogen melalui HBA sambil menjaga agar setiap perangkat pada bus SCSI dari HBA tersebut tetap sesibuk mungkin.