Поделиться через


Механизмы отправки рабочих очередей

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

  • Гиперкритические

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

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

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

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

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

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

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

Маршрут Description

RxDispatchToWorkerThread

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

RxPostToWorkerThread

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

RxSpinDownMRxDispatcher

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

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