设备专用的线程

慢速设备或很少使用 ((如软盘控制器) )的驱动程序可以通过创建设备专用系统线程来解决许多“等待”问题。 此外,大多数文件系统驱动程序使用系统工作线程并提供工作线程回调例程。

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

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

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

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