Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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 для распределения рабочих очередей относятся следующие.
| Рутина | Описание |
|---|---|
Эта подпрограмма вызывает подпрограмму в контексте рабочего потока. Память для WORK_QUEUE_ITEM выделяется этой подпрограммой. |
|
Эта подпрограмма вызывает подпрограмму в контексте рабочего потока. Память для WORK_QUEUE_ITEM должна быть выделена вызывающим объектом. |
|
Эта подпрограмма удаляет контекст диспетчера для мини-перенаправления сети. Обратите внимание, что эта подпрограмма доступна только в Windows Server 2003 и Windows XP. |