Aktualizace: 17.10.2008
Autor: Michal "Mitch" Pavlík
CPU Cycle Counting
Všechny verze Windows NT obsahují časovač, který procesorový čas rozděluje na intervaly po 10 nebo 15 ms v závislosti
na hardwaru. Při vypršení intervalu systém přeruší zpracování aktuálního threadu, aktualizuje statistiku využití procesoru
jednotlivými thready a začne vykonávat jiný. Problém byl v tom, že systém může začít thread vykonávat těsně před
vypršením intervalu ale do statistik zapíše, že byl thread zpracováván po celý interval. Další problém byl v tom, že
thread sice mohl být přiřazen procesoru, ale místo něj se zpracovávaly softwarové nebo hardwarové přerušení.
Využití těcho statistik diagnostickými nástroji a dalším informativním softwarem je v pořádku, ale pokud na základě
jeho informací rozhoduje scheduler (plánovač), vede tento postup k nespravedlivému přerozdělení procesorového času.
Normálně může thread na klientských verzích Windows běžet více jak 2 cykly (6 pokud běží v popředí). Ve skutečnosti
nemusí thread dostat žádný čas nebo naopak více než 6 cyklů (18 pokud běží v popředí) v závislosti na režimu a jiných
aktivitách systému.
Obrázek 1 zobrazuje jeden z případů nespravedlivého přerozdělení. Oba thready mají stejnou prioritu a oba jsou připraveny
ve stejný čas. Thread A běží do konce intervalu, plánovač předpokládá že byl zpracováván celý interval a přeruší jeho
činnost. Dále byl ještě čas přidělený threadu A kratší o dobu zpracování přerušení. V dalším intervalu plánovač vybere
ke zpracování thread B a ten běží celý interval.
Obrázek 1 - Nespravedlivé rozdělení procesorového času
Ve Windows Vista se plánovač řídí registrem čitače cyklů moderních procesorů a má tak přesnější informace o tom, kolik cyklů bylo threadu přiděleno a může přesněji přidělovat procesorový čas. Plánovač navíc nepočítá do doby zpracování čas, který si vyžádala obsluha přerušení. Na Obrázku 2 je znázorněna ta samá situace, ale v podání Windows Vista.
Obrázek 2 - Rozdělení procesorového času ve Windows Vista
Multimedia Class Scheduler Service
Další vylepšení ve Windows Vista se týká multimediálních aplikací. Obliba multimédií na PC stále stoupá a lidé
chtějí bezproblémové přehrávání videa a audia. S nástupem videa ve vysokém rozlišení ale rostou nároky na výpočetní čas.
Ovšem v čase přehrávání kladou požadavky i další aplikace běžící na pozadí, např. antivirus, služba indexování apod. To
může vést k nepříjemnému "sekání". K vyřešení tohoto problému přichází s Windows Vista služba MMCS, která upravuje
priority threadů multimediálních aplikací.
Typů multimediálních threadů je několik a každý z nich má nastavenou určitou prioritu. Jejich seznam je uložen v registru,
konkrétně:
Obrázek 3 - Nastavení audio threadů pro MMCSS
MMCSS je implementován v knihovně %SystemRoot%\System32\Mmcss.dll, běží v procesu Service Host (Svchost.exe) a thread
spravující priority sám běží s prioritou 27 (Windows mají priority v rozsahu 0-31). Tento thread zvyšuje priority
registrovaných multimediálních threadů do rozsahu určeném hodnotou Scheduling Category. Ve Windows jsou priority 16 a vyšší
v rozsahu zvaném Realtime a jsou vyšší než u ostatních běžících threadů (s výjimkou Memory Managera který běží s prioritami
28 a 29). Pouze administrátorské účty, jako Local System pod kterým je MMCSS spuštěn, má práva zvyšovat priority.
Pokud přehráváte hudbu, Windows Media Player zaregistruje Audio thread a pokud video tak Playback thread. MMCSS zvýší
prioritu všem threadům které: zpracovávají stream (proud dat), běží v procesu který má okno v popředí a hodnotu
BackgroundOnly mají v registru nastavenou na True.
Dále bylo nutné zabránit tomu, aby MMCSS zvyšoval priority tak, aby veškerý procesorový čas byl přidělen multimediálním
threadům na úkor procesům běžícím na pozadí. MMCSS tak rezervuje část procesorového času pro tyto ůčely. Tato hodnota se
dá měnit v registru:
Mitch