Aktualizace: 15.11.2008
Autor: Michal "Mitch" Pavlík
Dynamic Kernel Address Space
Windows a aplikace pod nimi běžící mohou narážet na limit adresního prostoru, který je dán 32-bitovými procesory. Kernel
je omezen na 2GB, což je polovina 32-bitovho adresního prostoru a druhá polovina je vyhrazena threadům procesu, který procesor
právě vykonává. V adresním prostoru kernelu je namapován samotný kernel, ovladače, cache file-systému, zásobníky kernelu...
Před Windows Vista zjistil Memory Manager při bootování, kolik paměti bude kernel potřebovat a vyhradil adresní prostor, jehož
velikost nešla za běhu měnit. To mohlo vést k situacím, kdy jedna z částí paměti byla plná, zatímco ta druhá téměř prázdná.
Nedostatek místa ať na jedné nebo na druhé straně mohl způsobit selhání.
Ve 32-bitové verzi Windows Vista je adresní prostor kernelu řízen dynamicky podle potřeby. Množství virtuální paměti
použité pro uchování bufferů může růst, pokud si ji ovladač vyžádá a zmenšit když ji ovladač uvolní.
64-bitové systémy mají limity v adresaci mnohem výše a nepotřebují tak žádnou speciální úpravu.
Memory Priorities
K pochopení toho, jak funguje prioritizování paměti, je nutné objasnit, jak Memory Manager implementuje cache zvanou Standby
List. Když byla ve starších systémech fyzická stránka (physical page - typicky 4KB velká) vlastněná procesem vyžádána zpět
systémem, Memory Manager ji umístil na konec Standby Listu. V případě, že proces chtěl znovu přístup ke stránce, Memory Manager
ji vzal ze Standby Listu a přiřadil procesu. Pokud proces naopak chtěl novou stránku fyzické paměti a paměť nebyla volná,
Memory Manager přidělil procesu první stránku Standby Listu. Tento způsob práce se Standby Listem uvažoval všechny stránky
jako rovnocené a řazeny byly podle času umístění.
Ve Windows Vista má každá stránka prioritu v rozsahu 0-7. Memory Manager tak rozděluje Standby List na 8 částí a v
každé části jsou stránky se stejnou prioritou. Když chce vzít Memory Manager stránku ze Standby Listu, tak vždy tu s nejmenší
prioritou. Priorita stránky se odvíjí od priority threadu který zapříčil její alokaci (pokud je stránka sdílená pak se
bere thread s nejvyšší prioritou). Nízkou prioritu dává Memory Manager stránkám, které jsou spekulativně čteny dopředu a
není jisté, že se skutečně použijí.
Výchozí priorita je 5, ale jsou k dispozici funkce, které aplikacím a systému umožní ji měnit. Skutečná síla prioritizování
paměti je ale znát, jen pokud jsou priority stránek uvažovány i na vyšší úrovni, což je práce SuperFetche.
SuperFetch
Významnou změnou v Memory Manageru je způsob, jakým spravuje fyzickou paměť. Práce se Standby Listem měla v předešlých
systémech 2 omezení. První byla v tom, že se nebraly v úvahu budoucí požadavky na paměť. A druhá spočívá v tom, že data určená
k prioritizaci byla limitována na soubor stránek vlastněné procesem v určitém čase. Tyto nedostatky vedly k situacím, kdy jste
opustili počítač a systém spustil aplikace jako defragmentace nebo skenování antivirem. Tyto aktivity způsobí, že data aplikací
které jste používaly, se začnou odkládat a když se vrátíte, musí systém tahat tyto data z disku.
Windows XP přinesl Prefetch, který zlepšil bootování a rychlost spouštění aplikací tím, že data načetl dopředu na základě
informací o předešlém bootování a spouštění aplikací. Windows Vista se SuperFetchem udělali další velký krok ve správě paměti.
SuperFetch je implementován v knihovně %SystemRoot%\System32\Sysmain.dll jako služba běžící pod procesem Service Host
(%SystemRoot%\System32\Svchost.exe). SuperFetch spolupracuje s Memory Managerem, který poskytuje historii využití stránek,
načítá data do Standby Listu a přiřazuje stránkám prioritu. SuperFetch v podstatě rozšiřuje sledování stránek s daty, které
již byly v paměti, ale Memory Manager je uvolnil, aby bylo místo pro nová data. Tyto informace jsou pak uloženy v .db souborech
ve složce %SystemRoot%\Prefetch vedle standardních prefetch souborů. Na základě těchto detailních informací může SuperFetch
přednačítat data a kód, pokud je volná paměť.
Kdykoliv se uvolní paměť (například když se ukončí aplikace), SuperFetch si vyžádá od Memory Managera načtení dat a kódu,
které byly v poslední době z paměti odstraněny. Toto načítání probíhá s velmi nízkou prioritou I/O operací, takže uživatel
nepocítí žádné zpomalení. Pokud tedy odejdete napřklad na oběd a systém spustí na pozadí úlohy náročné na paměť, musí
být data vaší práce uvolněny z paměti, ale když tato činnost skončí, SuperFetch je načte zpět ještě než se vrátíte. SuperFetch
má také připravené scénáře pro situace jako hibernace, režim spánku, rychlé přepínání uživatelů a spouštění aplikací.
ReadyBoost
Čím jsou procesory a paměti rychlejší, tím více se projevuje pomalost pevných disků. Hlavně přístupová doba (seek time), která
se u běžných disků pohybuje okolo 10 ms se vedle 3 GHz procesorů jeví jako věčnost. RAM je nejlepší úložiště pro data, ale proti
pevným diskům je velmi nákladná. Flash paměť je levnější a náhodné čtení je více než 10x rychleší než u běžných pevných disků.
Windows Vista tak přichází s vylepšením zvaným ReadyBoost, které využívá výhod flash paměti a vytváří vrstvu mezi RAM a diskem.
ReadyBoost je realizován službou implementovanou v knihovně %SystemRoot%\System32\Emdmgmt.dll (běžící pod procesem Service Host)
a volume filter ovladačem %SystemRoot%\System32\Drivers\Ecache.sys. Když připojíte zařízení jako USB Flash disk k počítači,
služba ReadyBoost zařízení výkonově otestuje a výsledky uloží do registru, klíč
Po tom co ReadyBoost inicializuje cache, ovladač Ecache.sys začne odchytávat požadavky na zápis nebo čtení směrované na pevný disk a začne kopírovat data do ReadyBoost.sfcache. Ecache.sys data komprimuje typicky v poměru 2:1 takže do 4GB souboru se může vejít 8GB dat. Ovladač navíc každý blok šifruje pomocí Advanced Encryption Standard (AES) s náhodně generovaným klíčem, aby zajistil ochranu dat, pokud je zařízení odpojeno.
V případě, že se má číst sekvenčně větší objem dat, ovladač nechá číst data z pevného disku.
ReadyBoot
V případě že má Windows Vista méně jak 512MB RAM, používá při bootování stejný prefetching jako Windows XP. Ovšem pokud má
700MB nebo více, tak k optimalizaci bootování použije in-RAM cache. Velikost cache záleží na velikosti RAM a je volena
rozumně, aby systému zbylo dost paměti pro samotné bootování.
Po každém bootování využije ReadyBoost volný procesorový čas k výpočtu využití cache při dalším bootování. ReadyBoost analyzuje
pohyb souborů za posledních 5 bootování a zjistí, ke kterým souborům bylo přistupováno a jejich umístění na disku. Tyto
informace se ukládají v adresáři %SystemRoot%\Prefetch\Readyboot do .fx souborů a plán pro další bootování je uložen v
registrech (HKLM\System\CurrentControlSet\Services\Ecache\Parameters) jako hodnota typu REG_BINARY s názvem odpovídajícím
oddílu, ze kterého se bootuje.
Cache je opět implementována ovladačem Ecache.sys, ale je řízena službou ReadyBoost při bootování. ReadyBoost odstraní
cache z paměti za 90 sekund po nabootování nebo dříve pokud bude zapotřebí paměť. Získané informace se uloží do registru,
klíč HKLM\System\CurrentControlSet\Services\Ecache\Parameters\ReadyBootStats. Testy ukázaly, že ReadyBoot je o 20%
rychlejší než prefetching ve Windows XP.
Obrázek 1 - Obsah klíče ReadyBootStats (kliknutím zvětšíte)
ReadyDrive
ReadyDrive je reakce na příchod nových hybridních pevných disků označovaných jako H-HDD. H-HDD je disk s vestavěnou,
polovodičovou, energeticky nezávislou flash pamětí (známou jako NVRAM). I když typický H-HDD obsahuje 50-512MB této paměti,
Windows Vista má limit až 2TB.
Systém si například do této paměti při vypínání ukládá data potřebná při bootování, čímž urychlí restart. Nebo se do této
paměti ukládají data při hibernaci a tím se urychlí probuzení. S pamětí lze pracovat i když se netočí plotny, takže se dá
použít i jako cache pro zápis - plotny se nemusí roztáčet tak často a zvýší se výdrž akumulátoru.
Mitch