Механизмы распределения рабочих очередей

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 обеспечивает несколько уровней рабочих очередей для каждого процессора. В настоящее время поддерживаются следующие уровни рабочих очередей:

  • Критически важно

  • Отложено

  • Придирчивый

Различие между критическим и отложенным заключается в уровне приоритета. Уровень гиперкритического режима отличается от других двух тем, что подпрограммы не должны блокироваться (ожидать какого-либо ресурса). Это требование не может быть применено, поэтому эффективность механизма отправки зависит от неявного сотрудничества клиентов.

Реализация рабочей очереди в RDBSS построена вокруг реализации KQUEUE. Дополнительная поддержка включает регулирование ряда потоков, которые активно ожидают рабочих элементов. Каждая структура данных очереди работы выделяется из памяти непагрегированного пула и имеет собственный механизм синхронизации (спинлок).

Помимо сведений о ведения книги (состояние очереди и тип, например), RDBSS также сохраняет статистику, собираемую за время существования рабочей очереди. Это может предоставить ценные сведения о настройке рабочей очереди. Количество обработанных элементов, количество элементов, которые необходимо обработать, и совокупная длина очереди структурируются. Совокупная длина очереди является важной метрикой и представляет сумму количества элементов, ожидающих обработки при каждом добавлении дополнительного рабочего элемента. Совокупная длина очереди, разделенная суммой общего количества обработанных элементов, а количество обрабатываемых элементов дает указание средней длины очереди. Значение числового параметра, гораздо больше одного, означает, что минимальное количество потоков рабочих процессов, связанных с рабочей очередью, может быть увеличено. Значение гораздо меньше одного означает, что максимальное количество рабочих потоков, связанных с очередью, может быть уменьшено.

Рабочая очередь обычно запускается в активном состоянии и продолжается до тех пор, пока не будет обнаружена невосстанавливаемая ситуация (например, отсутствие системных ресурсов) или когда она переходит в неактивное состояние. При инициировании запуска выполняется переход к состоянию выполнения выполнения.

Завершение обработки рабочих очередей не происходит, когда потоки были остановлены. Завершение потоков необходимо обеспечить, прежде чем структуры данных могут быть удалены. Реализация рабочей очереди в RDBSS следует протоколу, в котором каждый из потоков, которые завершаются, сохраняет ссылку на объект потока в контексте завершения. Выполняющийся поток (который не принадлежит рабочей очереди) ожидает завершения всех потоков, отведенных до удаления структур данных.

Текущая реализация очередей RxDispatchToWorkerThread и RxPostToWorkerThread работает на том же процессоре, из которого произошел вызов.

К подпрограммам RDBSS для распределения рабочих очередей относятся следующие.

Рутина Описание

RxDispatchToWorkerThread

Эта подпрограмма вызывает подпрограмму в контексте рабочего потока. Память для WORK_QUEUE_ITEM выделяется этой подпрограммой.

RxPostToWorkerThread

Эта подпрограмма вызывает подпрограмму в контексте рабочего потока. Память для WORK_QUEUE_ITEM должна быть выделена вызывающим объектом.

RxSpinDownMRxDispatcher

Эта подпрограмма удаляет контекст диспетчера для мини-перенаправления сети.

Обратите внимание, что эта подпрограмма доступна только в Windows Server 2003 и Windows XP.