设备专用线程

对于运行缓慢的设备或很少使用的设备(例如 CD/DVD 驱动器),其驱动程序可以通过创建设备专用的系统线程来解决许多“等待”问题。 此外,大多数文件系统驱动程序使用系统工作线程并提供工作线程回调例程。

如果设备驱动程序有自己的线程上下文或在系统线程上下文中运行,则可以使用同步对象进行协调。 设备专用线程或最高级别驱动程序的工作线程回调例程可以在驱动程序设备扩展的共享通信区域中,对调度对象(例如事件对象信号灯对象)进行同步操作。 例如,当线程的设备未被使用时,设备专用线程可以通过调用KeWaitForSingleObject来获取信号量,以等待共享调度对象。 在调用设备驱动程序以执行 I/O作之前,其等待线程不使用 CPU 时间。 调用驱动程序时,它将信号灯设置为 Signaled 状态。

驱动程序可以调用 PsCreateSystemThread 来创建驱动程序或设备专用线程,然后调用 KeSetBasePriorityThread 以设置线程的基本优先级。 驱动程序应指定一个优先级值,以避免 SMP 计算机中的 运行时优先级反转 。 也就是说,如果对驱动程序创建的线程设置过高的基本优先级,可能会导致低优先级线程(这些线程为该驱动程序提交 I/O 请求)的执行出现延迟。

由于线程对象本身是调度程序对象的类型,线程可以等待另一个线程完成。 若要获取与线程关联的线程对象指针,驱动程序可以调用 ObReferenceObjectByHandle,传入从 PsCreateSystemThread 收到的线程句柄。

线程可以调用 KeDelayExecutionThread 来等待一个可能是整个时间片或更长的时间间隔。 KeDelayExecutionThread 时间间隔的粒度约为 10 毫秒。 由于 KeDelayExecutionThread 是计时器驱动的例程,因此间隔的粒度略快或慢于 10 毫秒,具体取决于平台。