Bagikan melalui


Pengantar DPC Utas

DPC utas tersedia di Windows Vista dan versi Windows yang lebih baru.

DPC utas adalah DPC yang dijalankan sistem di IRQL sama dengan PASSIVE_LEVEL. DPC utas diaktifkan secara default, tetapi Anda dapat menonaktifkannya dengan mengatur kunci registri HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable ke nol. Ketika DPC utas dinonaktifkan, DPC tersebut dijalankan sebagai DPC biasa.

DPC biasa mendahului eksekusi semua utas, dan tidak dapat didahulukan oleh utas atau oleh DPC lain. Jika sistem memiliki sejumlah besar DPC biasa yang diantrekan, atau jika salah satu DPC tersebut berjalan untuk waktu yang lama, setiap utas akan tetap dijeda untuk waktu yang lama. Dengan demikian, setiap DPC biasa meningkatkan latensi sistem, yang dapat merusak performa aplikasi yang sensitif terhadap waktu, seperti pemutaran audio atau video.

Sebaliknya, DPC utas dapat didahulukan oleh DPC biasa, tetapi tidak oleh utas lain. Oleh karena itu, Anda harus menggunakan DPC utas daripada DPC biasa—kecuali DPC tertentu tidak boleh didahulukan, bahkan oleh DPC lain.

Sistem ini mewakili DPC utas (dan DPC biasa) sebagai struktur KDPC . Untuk menginisialisasi struktur KDPC untuk DPC utas, panggil rutinitas KeInitializeThreadedDpc , dan teruskan rutinitas CustomThreadedDpc yang melakukan tindakan DPC.

Karena rutinitas CustomThreadedDpc dapat dijalankan pada PASSIVE_LEVEL atau DISPATCH_LEVEL, Anda harus memastikan bahwa CustomThreadedDpc Anda rutin disinkronkan dengan benar di kedua IRQL. Untuk informasi selengkapnya tentang cara melakukannya, lihat Sinkronisasi dan DPC Utas.

Selain itu, Anda harus memastikan bahwa rutinitas CustomThreadedDpc Anda mematuhi semua batasan untuk kode DISPATCH_LEVEL. Jika DPC utas diaktifkan, DPC berjalan pada IRQL = PASSIVE_LEVEL tetapi masih tunduk pada pembatasan yang sama dengan DPC biasa. Semua kode yang dijalankan dalam DPC berulir—termasuk semua fungsi yang dipanggil oleh rutinitas CustomThreadedDpc —harus sesuai dengan pembatasan lingkungan DPC. Misalnya, kode tidak boleh memblokir pada objek sinkronisasi tingkat pasif, seperti objek KEVENT. Banyak tumpukan perangkat yang ada, seperti jaringan dan USB, tidak mendukung pemrosesan DPC berulir, dan mereka mungkin mencoba memblokir jika mendeteksi bahwa mereka dipanggil pada PASSIVE_LEVEL. Untuk alasan serupa, Kerangka Kerja Driver Mode Kernel (KMDF) tidak mendukung pemrosesan DPC berulir, dan driver KMDF tidak boleh mencoba menggunakan DPC berulir. Untuk informasi selengkapnya tentang lingkungan DPC, lihat Menulis Rutinitas DPC.

Untuk menambahkan DPC utas ke antrean DPC, panggil KeInsertQueueDpc. Untuk menghapus DPC utas dari antrean sebelum dijalankan, panggil KeRemoveQueueDpc.