Bagikan melalui


Thread khusus perangkat

Driver untuk perangkat lambat atau perangkat yang jarang Anda gunakan (seperti drive CD/DVD) dapat menyelesaikan banyak masalah "menunggu" dengan membuat utas sistem khusus perangkat. Selain itu, sebagian besar driver sistem file menggunakan utas pekerja sistem dan menyediakan rutinitas panggilan balik utas pekerja.

Jika driver perangkat memiliki konteks utas sendiri atau berjalan dalam konteks rangkaian sistem, driver dapat menggunakan objek sinkronisasi untuk koordinasi. Rutinitas panggilan balik alur khusus perangkat atau alur kerja driver tingkat tertinggi dapat menyinkronkan operasi pada objek dispatcher, seperti objek peristiwa atau objek semaphore, di wilayah komunikasi bersama ekstensi perangkat driver. Misalnya, utas yang didedikasikan untuk perangkat dapat menunggu objek dispatcher bersama ketika perangkat utas tidak digunakan, dengan memanggil KeWaitForSingleObject untuk menangani semaphore. Hingga driver perangkat dipanggil untuk melakukan operasi I/O, utas tunggunya tidak menggunakan waktu CPU. Ketika driver dipanggil, ia mengatur semaphore ke status Sinyal.

Driver dapat memanggil PsCreateSystemThread untuk membuat utas khusus driver atau perangkat, lalu memanggil KeSetBasePriorityThread untuk mengatur prioritas dasar utas. Driver harus menentukan nilai prioritas yang menghindari inversi prioritas run-time di komputer SMP. Artinya, mengatur prioritas dasar utas yang dibuat oleh driver terlalu tinggi dapat menyebabkan penundaan dalam eksekusi utas dengan prioritas lebih rendah yang mengajukan permintaan I/O untuk driver tersebut.

Karena objek utas itu sendiri adalah jenis objek dispatcher, utas dapat menunggu utas lain selesai. Untuk mendapatkan penunjuk objek utas yang terkait dengan utas, driver dapat memanggil ObReferenceObjectByHandle, dengan memasukkan handel utas yang diterima dari PsCreateSystemThread.

Thread dapat memanggil KeDelayExecutionThread untuk menunggu interval yang bisa berupa irisan waktu penuh atau lebih lama. Granularitas interval KeDelayExecutionThread adalah sekitar 10 milidetik. Karena KeDelayExecutionThread adalah rutinitas berbasis timer, granularitas intervalnya sedikit lebih cepat atau lebih lambat dari 10 milidetik, tergantung pada platform.