Vylepšení pracovních front a vláken
Toto téma popisuje vylepšení ve Windows 8 pro pracovní fronty a podprocesy na platformě Microsoft Media Foundation.
- chování systému Windows 7
-
vylepšení systému Windows 8
- vícevláknové pracovní fronty
- pracovní fronty sdílených úloh
- fronty čekání
- Vylepšení podpory konzoly MMCSS
- MMFRealTimeClientEx
- větve topologie
- doporučení
- souhrnu
- související témata
Chování systému Windows 7
Tato část shrnuje chování pracovních front Media Foundation ve Windows 7.
Pracovní fronty
Platforma Media Foundation vytvoří několik standardních pracovních front. Jako obecné použití aplikace jsou zdokumentované pouze dva:
- MFASYNC_CALLBACK_QUEUE_STANDARD
- MFASYNC_CALLBACK_QUEUE_LONG_FUNCTION
Aplikace nebo komponenta může přidělit nové pracovní fronty voláním MFAllocateWorkQueue nebo MFAllocateWorkQueueEx. Funkce MFAllocateWorkQueueEx definuje dva typy pracovní fronty:
- MF_STANDARD_WORKQUEUE vytvoří pracovní frontu bez smyčky zpráv.
- MF_WINDOW_WORKQUEUE vytvoří pracovní frontu se smyčkou zpráv.
Chcete-li zařadíte pracovní položku do fronty, zavolejte MFPutWorkItem nebo MFPutWorkItemEx. Platforma spustí pracovní položku vyvoláním implementace volajícího MMFAsyncCallback. Ve Windows 7 a starších verzích platforma vytvoří jedno vlákno na pracovní frontu.
Podpora konzoly MMCSS
Služba plánovače multimediálních tříd (MMCSS) spravuje priority vláken, aby multimediální aplikace získaly pravidelné řezy času procesoru bez odepření prostředků procesoru aplikacím s nižší prioritou. MMCSS definuje sadu úloh s různými profily využití procesoru. Když vlákno spojí úlohu MMCSS, konzola MMCSS nastaví prioritu vlákna na základě několika faktorů:
- Základní priorita úlohy, která je nastavena v registru.
- Relativní priorita vlákna, která je nastavena za běhu voláním AvSetMmThreadPriority.
- Různé charakteristiky za běhu, například zda je aplikace v popředí a kolik času procesoru spotřebovávají vlákna v každé třídě MMCSS.
Aplikace může zaregistrovat pracovní frontu v MMCSS voláním MFBeginRegisterWorkQueueWithMMCSS. Tato funkce přebírá ID pracovní fronty, třídu MMCSS (název úkolu) a identifikátor úlohy MMCSS. Interně volá AvSetMmThreadCharacteristics s názvem úlohy a ID úlohy. Po registraci pracovní fronty pomocí konzoly MMCSS můžete získat ID třídy a úlohy voláním MFGetWorkQueueMMCSSClass a MFGetWorkQueueMMCSSTaskId.
Media Session poskytuje poněkud vyšší úroveň přístupu k těmto rozhraním API prostřednictvím rozhraní MMFWorkQueueServices. Toto rozhraní poskytuje dvě primární metody:
Metoda | Popis |
---|---|
BeginRegisterPlatformWorkQueueWithMMCSS | Zaregistruje pracovní frontu pomocí úlohy MMCSS. Tato metoda je v podstatě tenký obálka kolem MFBeginRegisterWorkQueueWithMMCSS, ale můžete předat hodnotu MFASYNC_CALLBACK_QUEUE_ALL zaregistrovat všechny pracovní fronty platformy najednou. |
BeginRegisterTopologyWorkQueuesWithMMCSS | Zaregistruje větev topologie v pracovní frontě. |
Pokud chcete zaregistrovat větev topologie, postupujte následovně.
- Nastavte atribut MF_TOPONODE_WORKQUEUE_ID na zdrojovém uzlu pro větev. Použijte libovolnou hodnotu definovanou aplikací.
- Volitelně můžete nastavit MF_TOPONODE_WORKQUEUE_MMCSS_CLASS pro připojení pracovní fronty k úloze MMCSS.
- Volání BeginRegisterTopologyWorkQueuesWithMMCSS v vyřešené topologii.
Relace médií přidělí novou pracovní frontu pro každou jedinečnou hodnotu MF_TOPONODE_WORKQUEUE_ID. Pro každou větev topologie se provádí asynchronní operace kanálu v pracovní frontě, která je přiřazena k větvi.
MMFRealTimeClient
Rozhraní MMFRealTimeClient je určeno pro součásti kanálu, které buď vytvářejí vlastní vlákna, nebo používají pracovní fronty pro asynchronní operace. Relace médií používá toto rozhraní k upozorňovat komponentu kanálu na správné chování následujícím způsobem:
- Pokud komponenta kanálu vytvoří pracovní vlákno, MMFRealTimeClient::RegisterThreads metoda oznámí komponentě, ke které se má třída MMCSS připojit.
- Pokud komponenta kanálu používá pracovní frontu, MMFRealTimeClient::SetWorkQueue metoda řekne komponentě, kterou pracovní frontu použít.
Komponenta kanálu obvykle používá buď vlákno, nebo pracovní frontu k provádění asynchronních úloh, ale ne obojí.
Vylepšení Windows 8
Vícevláknové pracovní fronty
V systému Windows 8 podporuje Media Foundation nový typ pracovní fronty označované jako vícevláknové fronty. Vícevláknová fronta používá fond systémových vláken k odesílání pracovních položek. Vícevláknová fronta se škáluje lépe než předchozí fronty s jedním vláknem. Například
Několik komponent může sdílet vícevláknovou frontu, aniž by navzájem blokovaly, což vyžaduje vytvoření méně vláken.
Pracovní položky jsou optimalizované tak, aby se zabránilo přepínačům kontextu, pokud je událost již nastavená. To je efektivnější než vytvoření vlastních vláken, která budou čekat na události.
Při použití MMFRealTimeClientExby se aplikace měly vyhnout otáčení vláken a místo toho by měly používat pracovní fronty. K tomu by aplikace měly implementovat SetWorkQueueEx a nepoužívají RegisterThreads a Zrušit registraciThreads.
Při inicializaci platformy Media Foundation vytvoří vícevláknovou frontu s identifikátorem MFASYNC_CALLBACK_QUEUE_MULTITHREADED.
Vícevláknová fronta ne serializuje pracovní položky. Kdykoli bude vlákno z fondu vláken k dispozici, odešle se další pracovní položka ve frontě. Volající musí zajistit, aby byla práce serializována správně. Aby to bylo snazší, Media Foundation definuje sériovou pracovní frontu. Sériová fronta zabalí jinou pracovní frontu, ale zaručuje plně serializované spuštění. Další položka ve frontě se neodesílají, dokud předchozí položka nedokončí.
Následující kód vytvoří frontu serializátoru přes vícevláknovou frontu platformy.
DWORD workQueueID;
hr = MFAllocateSerialWorkQueue(MFASYNC_CALLBACK_QUEUE_MULTITHREADED, &workQueueID);
Více než jedna sériová fronta může zabalit stejnou vícevláknovou frontu. Sériové fronty pak sdílejí stejný fond vláken a serializované spouštění se vynucuje v rámci každé fronty.
Standardní pracovní fronty, které existovaly před Windows 8, jsou nyní implementovány jako sériové pracovní fronty, které zabalí vícevláknovou frontu platformy. Tato změna zachovává zpětnou kompatibilitu.
Sdílené pracovní fronty úkolů
Aby bylo možné správně pracovat s plánovačem jádra, měla by existovat jedna vícevláknová pracovní fronta pro každou úlohu MMCSS, kterou používáte. Platforma Media Foundation je podle potřeby přiděluje až jeden na úlohu MMCSS na proces. Chcete-li získat sdílenou pracovní frontu pro konkrétní úlohu MMCSS, zavolejte MFLockSharedWorkQueue a zadejte název úlohy. Funkce vyhledá název úkolu v tabulce. Pokud pracovní fronta pro tuto úlohu ještě neexistuje, funkce přidělí novou pracovní frontu MT a okamžitě ji připojí k úloze MMCSS. Pokud již pracovní fronta pro danou úlohu existuje, vrátí funkce identifikátor existující pracovní fronty.
Fronta čekání
Fronta čekání je speciální pracovní fronta platformy, která čeká na události, které se signalizují. Pokud komponenta potřebuje počkat na signalizovat událost, může místo vytvoření pracovního vlákna k čekání na událost použít frontu čekání.
Chcete-li použít frontu čekání, volání MFPutWaitingWorkItem. Parametry zahrnují popisovač události a ukazatel MMFAsyncResult. Když je událost signalována, fronta čekání vyvolá zpětné volání. Existuje jedna fronta čekání na platformu; aplikace nemohou vytvářet vlastní fronty čekání.
Vylepšení podpory konzoly MMCSS
Následující nové funkce platformy Media Foundation se týkají konzoly MMCSS.
Funkce | Popis |
---|---|
MFBeginRegisterWorkQueueWithMMCSSEx | Zaregistruje pracovní frontu v MMCSS. Tato funkce obsahuje parametr, který určuje relativní prioritu vlákna. Interně je tato hodnota přeložena do volání AvSetMmThreadPriority. |
MFGetWorkQueueMMCSSPriority | Dotazuje prioritu pracovní fronty. |
MFRegisterPlatformWithMMCSS | Zaregistruje všechny pracovní fronty platformy pomocí úlohy MMCSS. Tato funkce je podobná MMFWorkQueueServices::BeginRegisterPlatformWorkQueueWithMMCSS metoda, ale lze ji použít bez vytvoření instance Media Session. Kromě toho funkce obsahuje parametr, který určuje prioritu základního vlákna. |
Aplikace, které používají relaci médií, by měly nastavit atribut MF_TOPONODE_WORKQUEUE_MMCSS_CLASS na "Zvuk" pro větev pro vykreslování zvuku. Nastavte atribut na "Přehrávání" pro větev vykreslování videa.
MMFRealTimeClientEx
Rozhraní CLIENTRealTimeClientEx nahrazuje MMFRealTimeClient pro součásti kanálu, které provádějí asynchronní operace.
Metoda | Popis |
---|---|
RegisterThreadsEx | Upozorní komponentu, aby zaregistrovala svá vlákna v konzole MMCSS. Tato metoda je ekvivalentní MMFRealTimeClient::RegisterThreads, ale přidá parametr pro prioritu základního vlákna. |
SetWorkQueueEx | Upozorní komponentu, aby používala konkrétní pracovní frontu. Tato metoda je ekvivalentní MMFReadTimeClient::SetWorkQueue, ale přidá parametr pro prioritu pracovní položky. |
zrušit registraci | Upozorní komponentu, aby odregistrovala svá vlákna z konzoly MMCSS. Tato metoda je stejná jako MMFRealTimeClient::UnregisterThreads metoda. |
Součásti kanálu by měly používat pracovní fronty a neměly by vytvářet pracovní vlákna z následujících důvodů:
- Pracovní fronty se škálují lépe, protože používají fondy vláken operačního systému.
- Platforma zpracovává podrobnosti o registraci pracovních front v MMCSS.
- Pracovní vlákno může snadno způsobit zablokování, které je obtížné ladit.
Pokud potřebujete serializovat asynchronní operace, zvažte také použití pracovní fronty serializátoru.
Větve topologie
Pokud atribut MF_TOPONODE_WORKQUEUE_MMCSS_CLASS zaregistruje větev topologie v konzole MMCSS, použije relace médií ve Windows 8 sdílené pracovní fronty MT. V dřívějších verzích Windows přidělila relace médií novou pracovní frontu.
Pro registraci větve topologie v konzole MMCSS jsou definovány dva nové atributy.
Atribut | Popis |
---|---|
MF_TOPONODE_WORKQUEUE_MMCSS_PRIORITY | Určuje prioritu základního vlákna. |
MF_TOPONODE_WORKQUEUE_ITEM_PRIORITY | Určuje prioritu pracovní položky. |
Doporučení
- Aplikace, které používají relaci médií, by měly nastavit MF_TOPONODE_WORKQUEUE_MMCSS_CLASS na "Zvuk" pro větev vykreslování zvuku a "Přehrávání" pro větev pro vykreslování videa.
- Aplikace, které používají relaci média, by měly volat DATACENTERWorkQueueServices::BeginRegisterTopologyWorkQueuesWithMMCSS v topologii.
- U součástí kanálu se místo pracovních vláken doporučují pracovní fronty. Pokud komponenta používá pracovní fronty nebo pracovní vlákna, implementujte MMFRealTimeClientEx.
- Nevytvádřujte soukromé pracovní fronty, protože to porazí účel pracovních front platformy. Použijte buď vícevláknovou frontu platformy, nebo sériovou frontu, která zabalí vícevláknovou frontu platformy.
- Pokud potřebujete serializovat asynchronní operace, použijte sériovou frontu.
Shrnutí
Pro Windows 8 jsou nová rozhraní API platformy Media Foundation, která se týkají vláken a pracovních front.
- MF_TOPONODE_WORKQUEUE_ITEM_PRIORITY
- MF_TOPONODE_WORKQUEUE_MMCSS_PRIORITY
- MFAllocateSerialWorkQueue
- MFBeginRegisterWorkQueueWithMMCSSEx
- MFGetWorkQueueMMCSSPriority
- MFPutWaitingWorkItem
- MFPutWorkItem2
- MFPutWorkItemEx2
- MFRegisterPlatformWithMMCSS
- MFUnregisterPlatformFromMMCSS
- MFLockSharedWorkQueue
- MMFRealTimeClientEx
Související témata