工作队列调度机制

RDBSS 使用 Windows 内核工作队列调度多个线程上的操作,以便稍后执行。 网络微型重定向程序驱动程序可以使用 RDBSS 维护的工作队列来调度操作以供以后执行。

RDBSS 提供了多个例程,用于实现 RDBSS 中使用的调度机制。 网络微型重定向程序驱动程序也可以使用这些例程。

RDBSS 基于每个设备对象跟踪工作项。 这使 RDBSS 能够处理与加载和卸载网络微型重定向程序相关的争用条件。 这还提供了 RDBSS 中的一种机制,用于防止单个网络微型重定向程序不公平地使用所有资源。

在某些情况下,调度工作项是不可避免的。 为了避免在这些情况下频繁分配内存和释放操作,WORK_QUEUE_ITEM将作为另一个数据的一部分进行分配。 在其他很少进行调度的情况下,需要避免内存分配,直到需要内存分配。 RDBSS 工作队列实现以调度和发布工作队列请求的形式为这两种方案提供。 如果使用 RxDispatchToWorkerThread 例程进行调度,则调用方无需分配WORK_QUEUE_ITEM的内存。 若要使用 RxPostToWorkerThread 例程发布,调用方需要分配WORK_QUEUE_ITEM的内存。

向工作线程调度操作有两种常见情况:

  • 对于非常不频繁的操作,请使用 RxDispatchToWorkerThread 例程来节省内存,方法是在需要时动态分配和释放工作队列项的内存。

  • 将重复调度操作时,使用 RxPostToWorkerThread 例程提前分配WORK_QUEUE_ITEM作为要调度的数据结构的一部分来节省时间。

两个调度操作之间的权衡是时间与空间(内存使用)。

RDBSS 中的调度机制为每个处理器提供多个级别的工作队列。 当前支持以下级别的工作队列:

  • 严重

  • Delayed

  • HyperCritical

关键和延迟之间的区别是优先级之一。 HyperCritical 级别与另外两个级别不同,该例程不应阻止(等待任何资源)。 无法强制实施此要求,因此调度机制的有效性依赖于客户端的隐式合作。

RDBSS 中的工作队列实现围绕 KQUEUE 实现构建。 其他支持涉及对一些正在积极等待工作项的线程进行监管。 每个工作队列数据结构都从非分页池内存中分配,并有自己的同步机制(旋转锁)。

除了记账信息(例如队列状态和类型),RDBSS 还维护在工作队列生存期内收集的统计信息。 这可以提供优化工作队列的宝贵信息。 已处理的项数、必须处理的项数以及累积队列长度的结构。 累积队列长度是一个重要的指标,表示每次排队其他工作项时等待处理的项数的总和。 累积队列长度除以已处理的项总数和要处理的项数的总和,表示平均队列长度。 大于一个值表示可以增加与工作队列关联的最小工作线程数。 一个小于一个值表示可以减少与队列关联的最大工作线程数。

工作队列通常以活动状态开始,并继续,直到遇到不可恢复的情况(例如,缺少系统资源)或转换为非活动状态时。 启动运行后,它将转换为正在进行的运行状态。

当线程已启动时,工作队列的运行未完成。 需要先确保线程的终止,然后才能拆解数据结构。 RDBSS 中的工作队列实现遵循一个协议,其中每个线程在运行上下文中保存对线程对象的引用。 运行发出线程(不属于工作队列)等待完成所有线程,然后再拆毁数据结构。

RxDispatchToWorkerThread 和 RxPostToWorkerThread 队列的当前实现适用于调用发起的同一处理器。

工作队列调度的以下 RDBSS 例程包括。

例程 说明

RxDispatchToWorkerThread

此例程在工作线程的上下文中调用例程。 此例程分配WORK_QUEUE_ITEM的内存。

RxPostToWorkerThread

此例程在工作线程的上下文中调用例程。 调用方必须分配WORK_QUEUE_ITEM的内存。

RxSpinDownMRxDispatcher

此例程将断开网络微型重定向器的调度程序上下文。

请注意,此例程仅在 Windows Server 2003 和 Windows XP 上可用。