Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Driver yang memerlukan pemrosesan tertunda dapat menggunakan item kerja, yang berisi penunjuk ke rutinitas panggilan balik driver yang melakukan pemrosesan yang sebenarnya. Driver mengantrekan item kerja, dan utas pekerja sistem menghapus item kerja dari antrean dan menjalankan rutinitas panggilan balik driver. Sistem mempertahankan kumpulan utas pekerja sistem ini, yang merupakan utas sistem yang masing-masing memproses satu item kerja pada satu waktu.
Driver mengaitkan rutinitas panggilan balik WorkItem dengan item kerja. Ketika thread pekerja sistem memproses elemen kerja, thread tersebut memanggil rutinitas WorkItem terkait. Di Windows Vista dan versi Windows yang lebih baru, driver dapat mengaitkan rutinitas WorkItemEx dengan item kerja. WorkItemEx mengambil parameter yang berbeda dari parameter yang diambil WorkItem .
Rutinitas WorkItem dan WorkItemEx berjalan dalam konteks alur sistem. Jika rutinitas pengiriman driver dapat berjalan dalam konteks utas mode pengguna, rutinitas tersebut dapat memanggil rutinitas WorkItem atau WorkItemEx untuk melakukan operasi apa pun yang memerlukan konteks utas sistem.
Untuk menggunakan item kerja, driver melakukan langkah-langkah berikut:
Mengalokasikan dan menginisialisasi item kerja baru.
Sistem menggunakan struktur IO_WORKITEM untuk menahan item kerja. Untuk mengalokasikan struktur IO_WORKITEM baru dan menginisialisasinya sebagai item kerja, driver dapat memanggil IoAllocateWorkItem. Di Windows Vista dan versi Windows yang lebih baru, driver dapat mengalokasikan struktur IO_WORKITEM sendiri, dan memanggil IoInitializeWorkItem untuk menginisialisasi struktur sebagai item kerja. (Driver harus memanggil IoSizeofWorkItem untuk menentukan jumlah byte yang diperlukan untuk menyimpan item kerja.)
Kaitkan rutinitas panggilan balik dengan item kerja, dan antrekan item kerja sehingga akan diproses oleh utas pekerja sistem.
Untuk mengaitkan rutinitas WorkItem dengan item kerja dan mengantrekan item kerja, driver harus memanggil IoQueueWorkItem. Untuk mengaitkan rutinitas WorkItemEx dengan item kerja dan mengantrekan item kerja, driver harus memanggil IoQueueWorkItemEx.
Setelah item kerja tidak lagi diperlukan, bebaskan.
Item kerja yang dialokasikan oleh IoAllocateWorkItem harus dibebaskan oleh IoFreeWorkItem. Item kerja yang diinisialisasi oleh IoInitializeWorkItem harus tidak diinisialisasi oleh IoUninitializeWorkItem sebelum dapat dibebaskan.
Item kerja hanya dapat tidak diinisialisasi atau dibebaskan ketika item kerja saat ini tidak diantrekan. Sistem mengeluarkan item kerja dari antrean sebelum memanggil rutinitas panggilan balik item kerja, sehingga IoFreeWorkItem dan IoUninitializeWorkItem dapat dipanggil dari dalam panggilan balik.
DPC yang perlu memulai tugas pemrosesan yang memerlukan pemrosesan panjang atau yang melakukan panggilan pemblokiran harus mendelegasikan pemrosesan tugas tersebut ke satu atau beberapa item kerja. Saat DPC berjalan, semua utas dicegah berjalan. Selain itu, DPC, yang berjalan di IRQL = DISPATCH_LEVEL, tidak boleh melakukan pemblokiran panggilan. Namun, utas pekerja sistem yang memproses item kerja berjalan di IRQL = PASSIVE_LEVEL. Dengan demikian, item kerja dapat berisi panggilan pemblokiran. Misalnya, utas pekerja sistem dapat menunggu pada objek dispatcher.
Karena kumpulan utas pekerja sistem adalah sumber daya yang dibatasi, fungsi WorkItem dan WorkItemEx hanya dapat digunakan untuk operasi yang membutuhkan waktu yang singkat. Jika salah satu rutinitas ini berjalan terlalu lama (jika berisi perulangan yang tidak terbatas, misalnya) atau menunggu terlalu lama, sistem dapat mengalami kebuntuan. Oleh karena itu, jika driver membutuhkan pemrosesan tertunda dalam jangka waktu yang lama, sebaiknya memanggil PsCreateSystemThread untuk membuat utas sistemnya sendiri.
Jangan panggil IoQueueWorkItem atau IoQueueWorkItemEx untuk mengantrekan item kerja yang sudah ada dalam antrean. Melakukannya dapat menyebabkan kerusakan struktur data sistem. Jika driver Anda mengantrekan item kerja yang sama setiap kali rutinitas driver tertentu berjalan, Anda dapat menggunakan teknik berikut untuk menghindari antrean item kerja untuk kedua kalinya jika sudah dalam antrean:
- Driver menjaga daftar tugas untuk pekerjaan rutin pekerja.
- Daftar tugas ini tersedia dalam konteks yang disediakan untuk rutinitas pekerja. Rutinitas pekerja dan rutinitas driver apa pun yang mengubah daftar tugas menyinkronkan akses mereka ke daftar.
- Setiap kali rutinitas pekerja berjalan, ia melakukan semua tugas dalam daftar, dan menghapus setiap tugas dari daftar saat tugas selesai.
- Ketika tugas baru tiba, driver menambahkan tugas ini ke daftar. Driver mengantrekan item kerja hanya jika daftar tugas sebelumnya kosong.
Utas pekerja sistem menghapus item kerja dari antrean sebelum memanggil utas pekerja. Dengan demikian, utas pengemudi dapat dengan aman mengantrekan item kerja lagi segera setelah utas pekerja mulai dijalankan.