Operační systém WIndows má jednoduchou správu paměti. Každý process má virtuální prostor velikost 4GB (32-bit Windows) rozdělen na dvě části, a to buď 2GB + 2GB, nebo 3GB + 1GB. Ta druhá část je rezervována pro jádro a je sdílená všemy procesy a zpravidla do ní samotný process nemá přístup (přístupná pouze z jádra).
Zbývající paměť (ta první část, čili 2GB nebo 3GB) je rozdělena takto:
- velké stránky: po 4MB
- rezervační bloky 64KB
- stránky: 4KB.
Menší jednotky Windowsy nerozpoznají. Nejmenší alokovatelná velikost je tedy 4KB, pokud má process režim velkých stránek, pak je to 4MB.
Paměť se může nacházet ve 3 stavech
- nepoužitá... adresový prostor nemá přidělenu fyzickou paměť ani swapfile. Přístup na tyto adresy vede k selhání aplikace.
- rezervovaná... je stejný jako předchozí s tím rozdílem, že OS vede informaci o tom, že nelze tento úsek paměti již rezervovat. Běžně se to používá tak, že vím dopředu, že budu potřebovat dejme tomu 10MB, ale momentálně mi z toho stačí 4KB. Rezervuju si tedy 10MB, ale tato paměť ještě fyzicky nikde neexistuje, nezabírá místo jiným aplikacím. Nicméně mi rezervace zaručuje, že žádná jiná část programu, ani knihovna DLL nebude rezervovat stejný podruhé a neukradne si jej pro sebe.
- commitnutá ... což už znamená, že k danému adresovému prostoru (zpravidla stránce, nebo sadě stránek), existuje fyzický kus paměti, který aplikaci patří a který ve statistikách využití paměti je již započítán. Taková paměť se může nacházet buď fyzicky v paměťovém chipu, nebo ve swapfile).
Pro lepší přestavu, jak měnit stav jednotlivých stránek a bloků vyhledej na Google heslo VirtualAlloc
Tenhle základ poskytuje jádro Windows. Nad tímto základem pak vznikají různé alokátory implementované jako samostatné a od jádra oddělené knihovny. Například Heap alokátor je základ většiny aplikací, a používá ho i malloc. Umožnuje alokovat bloky různé velikosti v systému fixních stránek. Uživatel nemusí řešit rezervaci paměti, ani commitování, případně uvolňování nepoužívané paměti. Na alokaci zásobníku, prostoru pro program, nebo dalších segmentů se ale nepoužívá, to si řeší jiné knihovny přímo. Vedle heapu má Windows ještě archaické GlobalAlloc, LocalAlloc, a ty mají vlastní alokátory. Sdílenou paměť si musí aplikační programátor taky pořešit sám, stejným způsobem, stejnými pravidly, jak bylo uvedeno výše. U sdílené paměti akorát určujeme nějakou identifikaci (HANDLE, jméno souboru), umožňující OS určit, jaký obsah se do sdílené paměti bude mapovat (... ano... tam pak je možnost, že dva procesy či více procesů sdílí jeden fyzický kus paměti, ovšem každý na jiné virtuální adrese).
Zjistit soupis volné paměti je obtížné. V zásadě se lze chytit jen toho, co poskytuje jádro. Mohu se zeptat každé stránky v jakém je stavu, a dostanu jedno ze tří odpovědí: nepoužitá, rezervovaná, commitlá. Windowsy samozřejmě poskytují informaci o tom, kolik jich je commitlých celkem, což vede pak na čísla, které člověk uvidí v TaskManageru.
Alokátory většinou fungují tak, že si nechají od jádra vyhledat souvislý nepoužívaný blok nějaké nastřelené velikosti a ten si zarezervují. V něm pak realizují alokace a zajišťují commitování stránek, které přidělují (a jejich odcommitování, když se celé uvolní). Jádro Windows tedy stačí hledat volné místo pro bloky velikosti 64KB (rezervační blok) a vést stav každé 4KB stránky... což stejně musí ve stránkovém adresáři. Zbytek je na zodpovědnost aplikace, nebo jejich knihoven.