为 I/O 队列配置调度模式
警告
UMDF 2 是最新版本的 UMDF,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 未向 UMDF 1 添加新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。
存档的 UMDF 1 示例可在 Windows 11 版本 22H2 - 2022 年 5 月驱动程序示例更新中找到。
有关详细信息,请参阅使用 UMDF 入门。
当来自应用程序的 I/O 请求到达时,框架会将每个请求置于相应的 I/O 队列中。 将请求传递到驱动程序的方式和时间取决于驱动程序如何为 I/O 队列配置调度,以及驱动程序如何 指定回调函数同步。 I/O 队列还与 UMDF 的 PnP 和电源管理子系统交互,以将 I/O 请求保存在队列中,直到设备达到正确的状态。
注意 I/O 队列的调度模式与 同步模式无关。 I/O 队列的调度配置控制驱动程序可以在任何给定时间接受处理的请求数,而同步控制同时执行呈现或取消请求的事件回调函数。 但是,通过 组合调度和同步模式可以创建多种操作模式。
当驱动程序调用 IWDFDevice::CreateIoQueue 方法配置默认队列或创建辅助队列时,驱动程序会为 I/O 队列配置调度。 驱动程序可以在 IWDFDevice::CreateIoQueue 的 DispatchType 参数中指定WDF_IO_QUEUE_DISPATCH_TYPE枚举类型的值之一,以标识调度模式。 I/O 队列对象可以支持以下调度模式:
顺序程序
顺序调度模式是使用 WdfIoQueueDispatchSequential 值指定的。 在此调度模式下,处于处理状态的队列会引发事件,以便驱动程序一次只处理一个请求。 队列会延迟任何其他请求,直到驱动程序完成处理其当前请求或调用 IWDFIoRequest::ForwardToIoQueue 方法重新排队请求。 当当前请求完成或转发时,队列将引发事件以提供下一个请求。
并行程序
使用 WdfIoQueueDispatchParallel 值指定并行调度模式。 在此调度模式下,处于处理状态的队列在 I/O 请求可供驱动程序使用后立即引发事件。 当驱动程序收到 I/O 请求时,驱动程序可以通过以下方式之一处理 I/O 请求:
- 驱动程序调用 IWDFIoRequest::Complete 或 IWDFIoRequest::CompleteWithInformation 方法来立即完成 I/O 请求。 如果 I/O 请求无效、永远无法提供服务,或者可以通过从包含数据的缓冲区或缓存复制数据来完成,驱动程序会立即完成 I/O 请求。
- 驱动程序调用 IWDFIoRequest::ForwardToIoQueue 方法以重新排队 I/O 请求。
- 驱动程序调用 IWDFIoRequest::Send 方法将 I/O 请求传递给较低级别的驱动程序。
手动
手动调度模式是使用 WdfIoQueueDispatchManual 值指定的。 在此调度模式下,当请求到达队列时,I/O 队列不会自动通知驱动程序。 驱动程序必须调用 IWDFIoQueue::RetrieveNextRequest 方法来手动检索队列中的请求。 这是一个轮询模型。
在 UMDF 版本 1.9 及更高版本中,如果驱动程序使用的是手动调度模式,它可以调用 IWDFIoRequest2::Requeue ,将 I/O 请求返回到驱动程序从中获取它的 I/O 队列的头。 调用 IWDFIoRequest2::Requeue 后,驱动程序对 IWDFIoQueue::RetrieveNextRequest 的下一次调用将检索重新排队的请求。
对于所有调度模式, I/O 队列对象 接收并跟踪请求,直到驱动程序处理请求或取消请求。
如果驱动程序为串行或并行调度配置队列,框架会在驱动程序创建队列或配置默认队列时通过驱动程序注册的回调函数通知驱动程序请求。 有关详细信息,请参阅 I/O 队列事件回调函数。