Улучшения рабочей очереди и потоков
В этом разделе описываются улучшения в Windows 8 для рабочих очередей и потоков на платформе Microsoft Media Foundation.
- поведению Windows 7
- улучшения Windows 8
- Рекомендации
- Сводка
- связанные разделы
Поведение Windows 7
В этом разделе описано поведение рабочих очередей Media Foundation в Windows 7.
Рабочие очереди
Платформа Media Foundation создает несколько стандартных рабочих очередей. Только два документа описаны в качестве общего использования приложений:
- MFASYNC_CALLBACK_QUEUE_STANDARD
- MFASYNC_CALLBACK_QUEUE_LONG_FUNCTION
Приложение или компонент может выделить новые рабочие очереди, вызвав MFAllocateWorkQueue или MFAllocateWorkQueueEx. Функция MFAllocateWorkQueueEx определяет два типа рабочей очереди:
- MF_STANDARD_WORKQUEUE создает рабочую очередь без цикла сообщений.
- MF_WINDOW_WORKQUEUE создает рабочую очередь с циклом сообщений.
Чтобы очередь рабочего элемента, вызовите MFPutWorkItem или MFPutWorkItemEx. Платформа выполняет рабочий элемент путем вызова вызываемой реализации МВФAsyncCallback. В Windows 7 и более ранних версиях платформа создает один поток на рабочую очередь.
Поддержка MMCSS
Служба планировщика мультимедиа мультимедиа (MMCSS) управляет приоритетами потоков, чтобы мультимедийные приложения получили регулярные срезы времени ЦП, не запрещая ресурсы ЦП более низкоприоритетным приложениям. MMCSS определяет набор задач с различными профилями использования ЦП. Когда поток присоединяется к задаче MMCSS, MMCSS задает приоритет потока на основе нескольких факторов:
- Базовый приоритет задачи, который устанавливается в реестре.
- Относительный приоритет потока, который устанавливается во время выполнения путем вызова AvSetMmThreadPriority.
- Различные характеристики времени выполнения, например, находится ли приложение на переднем плане и сколько времени ЦП потребляется потоками в каждом классе MMCSS.
Приложение может зарегистрировать рабочую очередь в MMCSS, вызвав MFBeginRegisterWorkQueueWithMMCSS. Эта функция принимает идентификатор рабочей очереди, класс MMCSS (имя задачи) и идентификатор задачи MMCSS. Внутри системы он вызывает AvSetMmThreadCharacteristics с именем задачи и идентификатором задачи. После регистрации рабочей очереди в MMCSS можно получить идентификатор класса и задачи, вызвав MFGetWorkQueueMMCSSClass и MFGetWorkQueueMMCSSTaskId.
сеанса мультимедиа предоставляет несколько более высокий уровень доступа к этим API через интерфейс IMFWorkQueueServices. Этот интерфейс предоставляет два основных метода:
Метод | Описание |
---|---|
BeginRegisterPlatformWorkQueueWithMMCSS | Регистрирует рабочую очередь с задачей MMCSS. Этот метод по сути является тонкой оболочкой вокруг MFBeginRegisterWorkQueueWithMMCSS, но вы можете передать значение MFASYNC_CALLBACK_QUEUE_ALL для регистрации всех рабочих очередей платформы одновременно. |
BeginRegisterTopologyWorkQueuesWithMMCSS | Регистрирует ветвь топологии в рабочей очереди. |
Чтобы зарегистрировать ветвь топологии, выполните указанные ниже действия.
- Задайте атрибут MF_TOPONODE_WORKQUEUE_ID на исходном узле ветви. Используйте любое определяемое приложением значение.
- При необходимости задайте MF_TOPONODE_WORKQUEUE_MMCSS_CLASS для присоединения рабочей очереди к задаче MMCSS.
- Вызов BeginRegisterTopologyWorkQueuesWithMMCSS в разрешенной топологии.
Сеанс мультимедиа выделяет новую рабочую очередь для каждого уникального значения MF_TOPONODE_WORKQUEUE_ID. Для каждой ветви топологии асинхронные операции конвейера выполняются в рабочей очереди, назначенной ветви.
МВФRealTimeClient
ИнтерфейсМВФRealTimeClient предназначен для компонентов конвейера, которые создают собственные потоки или используют рабочие очереди для асинхронных операций. Сеанс мультимедиа использует этот интерфейс для уведомления компонента конвейера о правильном поведении, как показано ниже.
- Если компонент конвейера создает рабочий поток, метод IMFRealTimeClient::RegisterThreads уведомляет компонент, к которому будет присоединен класс MMCSS.
- Если компонент конвейера использует рабочую очередь, метод IMFRealTimeClient::SetWorkQueue указывает компоненту, который будет использоваться рабочей очередью.
Как правило, компонент конвейера использует поток или рабочую очередь для выполнения асинхронных задач, но не обоих.
Улучшения Windows 8
Многопоточные рабочие очереди
В Windows 8 Media Foundation поддерживает новый тип рабочей очереди под названием многопоточной очереди. В многопоточной очереди для отправки рабочих элементов используется системный пул потоков. Многопоточная очередь масштабируется лучше, чем предыдущие однопоточные очереди. Например
Несколько компонентов могут совместно использовать многопоточные очереди, не блокируя друг друга, требуя создания меньшего количества потоков.
Рабочие элементы оптимизированы, чтобы избежать переключений контекста, если событие уже установлено. Это эффективнее, чем создание собственных потоков для ожидания событий.
При использовании МВФRealTimeClientExприложения должны избегать спиннинга потоков и вместо этого следует использовать рабочие очереди. Для этого приложения должны реализовать SetWorkQueueEx и не использовать RegisterThreads и UnregisterThreads.
При инициализации платформы Media Foundation создается многопоточный очередь с идентификатором MFASYNC_CALLBACK_QUEUE_MULTITHREADED.
Многопоточная очередь не сериализует рабочие элементы. Всякий раз, когда поток из пула потоков становится доступным, следующий рабочий элемент в очереди отправляется. Вызывающий объект должен убедиться, что работа сериализуется правильно. Чтобы упростить эту задачу, Media Foundation определяет последовательную рабочую очередь. Последовательная очередь упаковывает другую рабочую очередь, но гарантирует полностью сериализованное выполнение. Следующий элемент в очереди не отправляется до завершения предыдущего элемента.
Следующий код создает очередь сериализатора по многопоточной очереди платформы.
DWORD workQueueID;
hr = MFAllocateSerialWorkQueue(MFASYNC_CALLBACK_QUEUE_MULTITHREADED, &workQueueID);
Несколько последовательной очереди могут упаковать одну и ту же многопотточную очередь. Затем последовательные очереди совместно используют один пул потоков и сериализованное выполнение применяется в каждой очереди.
Стандартные рабочие очереди, которые существовали до Windows 8, теперь реализуются как последовательные рабочие очереди, которые упаковывают многопоточные очереди платформы. Это изменение сохраняет обратную совместимость.
Общие очереди рабочих задач
Чтобы правильно работать с планировщиком ядра, для каждой используемой задачи MMCSS должно быть одна многопоточность рабочих очередей. Платформа Media Foundation выделяет их по мере необходимости до одной задачи MMCSS на каждый процесс. Чтобы получить общую рабочую очередь для конкретной задачи MMCSS, вызовите MFLockSharedWorkQueue и укажите имя задачи. Функция ищет имя задачи в таблице. Если рабочая очередь еще не существует для этой задачи, функция выделяет новую рабочую очередь MT и немедленно присоединяется к задаче MMCSS. Если для этой задачи уже существует рабочая очередь, функция возвращает идентификатор существующей рабочей очереди.
Очередь ожидания
очередь ожидания — это специальная рабочая очередь платформы, которая ожидает сигналов о событиях. Если компоненту необходимо дождаться сигнала о событии, он может использовать очередь ожидания вместо создания рабочего потока для ожидания события.
Чтобы использовать очередь ожидания, вызовите MFPutWaitingWorkItem. Параметры включают дескриптор событий и указатель IMFAsyncResult. Когда событие сигнализирует, очередь ожидания вызывает обратный вызов. Существует одна очередь ожидания платформы; приложения не могут создавать собственные очереди ожидания.
Улучшения поддержки MMCSS
Следующие новые функции платформы Media Foundation относятся к MMCSS.
Функция | Описание |
---|---|
MFBeginRegisterWorkQueueWithMMCSSEx | Регистрирует рабочую очередь в MMCSS. Эта функция включает параметр для указания относительного приоритета потока. Внутренне это значение преобразуется в вызов AvSetMmThreadPriority. |
MFGetWorkQueueMMCSSPriority | Запрашивает приоритет рабочей очереди. |
MFRegisterPlatformWithMMCSS | Регистрирует все рабочие очереди платформы с задачей MMCSS. Эта функция аналогична методу IMFWorkQueueServices::BeginRegisterPlatformWorkQueueWithMMCSS, но его можно использовать без создания экземпляра сеанса мультимедиа. Кроме того, функция включает параметр для указания приоритета базового потока. |
Приложения, использующие сеанс мультимедиа, должны задать атрибут MF_TOPONODE_WORKQUEUE_MMCSS_CLASS значение Audio для ветви отрисовки звука. Задайте атрибут "Воспроизведение" для ветви отрисовки видео.
МВФRealTimeClientEx
Интерфейс МВФRealTimeClientEx для замены IMFRealTimeClient для компонентов конвейера, выполняющих асинхронные операции.
Метод | Описание |
---|---|
RegisterThreadsEx | Уведомляет компонент о регистрации потоков в MMCSS. Этот метод эквивалентен МВФRealTimeClient::RegisterThreads, но добавляет параметр для базового приоритета потока. |
SetWorkQueueEx | Уведомляет компонент об использовании определенной рабочей очереди. Этот метод эквивалентен МВФReadTimeClient::SetWorkQueue, но добавляет параметр для приоритета рабочего элемента. |
Отмена регистрации | Уведомляет компонент об отмене регистрации потоков из MMCSS. Этот метод идентичен методу МВФRealTimeClient::UnregisterThreads. |
Компоненты конвейера должны использовать рабочие очереди и не должны создавать рабочие потоки по следующим причинам:
- Рабочие очереди лучше масштабируются, так как используют пулы потоков ОС.
- Платформа обрабатывает сведения о регистрации рабочих очередей в MMCSS.
- Рабочий поток может легко вызвать взаимоблокировку, которая трудно отлаживать.
Кроме того, рекомендуется использовать рабочую очередь сериализатора, если необходимо сериализовать асинхронные операции.
Ветви топологии
Если атрибут MF_TOPONODE_WORKQUEUE_MMCSS_CLASS регистрирует ветвь топологии в MMCSS, в Windows 8 сеанс мультимедиа использует общие рабочие очереди MT. В более ранних версиях Windows сеанс мультимедиа выделил новую рабочую очередь.
Для регистрации ветви топологии в MMCSS определены два новых атрибута.
Атрибут | Описание |
---|---|
MF_TOPONODE_WORKQUEUE_MMCSS_PRIORITY | Указывает приоритет базового потока. |
MF_TOPONODE_WORKQUEUE_ITEM_PRIORITY | Указывает приоритет рабочего элемента. |
Рекомендации
- Приложения, использующие сеанс мультимедиа, должны задать MF_TOPONODE_WORKQUEUE_MMCSS_CLASS "Звук" для ветви отрисовки звука и "Воспроизведение" для ветви отрисовки видео.
- Приложения, использующие сеанс мультимедиа, должны вызывать IMFWorkQueueServices::BeginRegisterTopologyWorkQueuesWithMMCSS топологии.
- Для компонентов конвейера рекомендуется использовать рабочие очереди вместо рабочих потоков. Если компонент использует рабочие очереди или рабочие потоки, реализуйте МВФRealTimeClientEx.
- Не создавайте частные рабочие очереди, так как это побеждает назначение рабочих очередей платформы. Используйте многопоточная очередь платформы или последовательную очередь, которая упаковывает многопоточность платформы.
- Если необходимо сериализовать асинхронные операции, используйте последовательную очередь.
Сводка
Следующие API платформы Media Foundation, относящиеся к потокам и рабочим очередям, являются новыми для Windows 8.
- MF_TOPONODE_WORKQUEUE_ITEM_PRIORITY
- MF_TOPONODE_WORKQUEUE_MMCSS_PRIORITY
- MFAllocateSerialWorkQueue
- MFBeginRegisterWorkQueueWithMMCSSEx
- MFGetWorkQueueMMCSSPriority
- MFPutWaitingWorkItem
- MFPutWorkItem2
- MFPutWorkItemEx2
- MFRegisterPlatformWithMMCSS
- MFUnregisterPlatformFromMMCSS
- MFLockSharedWorkQueue
- МВФRealTimeClientEx
Связанные разделы