Virtuálny adresný priestor vo Windows

Virtuálny adresný priestor vo Windows
« kdy: 25. 01. 2012, 16:56:02 »
Zdravim, momentalne sa snazim pochopit sprave pamati vo Windowsoch. System vytvori pre kazdy novovzniknuty proces virtualny adresny priestor. Ale co to vlastne je ten virtualny adresny priestor? Precital som si uz mnoho informacii o tom ale akosi som nepochopil ze ako si ho mam predstavit? Kde je resp kde ho system vytvori? Je to subor pole alebo co to vlastne je?

Odhliadnuc od toho kde je a co je, viem ze tento adresny priestor vyuziva proces pre svoje data premenne atd. Viem ze ked proces potrebuje dll to sa nacita do jeho adresneho priestoru. Ale je sucastou adresneho priestoru aj samotny kod procesu? Dajme tomu ze sa dll nacita na istu virtualnu adresu. Nacita sa na taku istu virtualnu adresu aj v inom procese ktory ho pouziva?

Ak sa nacitava aj v jednom aj v druhom procese, to znamena, ze je fyzicky v pamati DLL len raz a obidve virtualne adresy sa prelozia na tu istu fyzicku adresu? Dalej ma trapia otazky ohladom haldy(Heap). Viem ze alokovat pamat v adresnom priestore sa da pomocou VirtualAlloc. Preco sa ale alokuju 64KB bloky, ked pamat aj adresny priestor je rozdeleny na 4KB stranky (ako som sa docital)? Co to je vlastne halda, ktora umoznuje alokovat bloky pamati lubovolnej velkosti, ked VirtualAlloc to nedokaze? Momentalne ma ziadne dalsie otazky nenapadaju, takze vopred dakujem za odpovede.
« Poslední změna: 25. 01. 2012, 17:48:58 od Petr Krčmář »


baran

Re:Virtualny adresny priestor vo Windows
« Odpověď #1 kdy: 25. 01. 2012, 17:53:41 »
Virtualny adresny priestor si predstav ako mnozinu adries ktore moze tvoj proces/aplikacia pouzivat. Kazdej aplikacii windows pridelia povedzme 4GB adries ktore moze pouzivat. Aplikacia je napr. ulozena v 100MB, spolu s DLL + staticke data. Ked uz aplikacia bezi, moze este vyuzit zvysnych 3.9GB. Tento priestor sa vola virtualny preto, lebo v skutocnosti neexistuje ani na disku ani v operacnej pamati. Je to iba "prislub" ze ked aplikacia bude ziadat o pamat, tak operacny system tu pamat niekde najde. Ak chce aplikacia "ukrojit" dalsi priestor na svoje data, tak si priestor ukroji zo svojich virtualnych adries. Tento priestor moze byt z casti zvanej halda. Pravdaze aj halda sa nachadza niekde v tvojom virtualnom priestore. Halda je iba pomenovanie nejakej oblasti ktora sluzi danemu ucelu pretoze virtualny priestor si aplikacia moze lubovolne porozdelovat na nejake logicke celky. Ak pozadovana pamat je taka velka ze sa uz nezmesti do operacnej pamate,tak sa cast prave nepouzivanej odlozi na disk do suboru aby sa uvolnilo miesto pre dalsie data. To je to co poznas pod nazvom swap subor. Ak uz nemas priestor ani v swap subore, potom uz windows hodia chybovu hlasku ze nemas dost virtualne pamate a to prakticky znamena ze to mozes zabalit a kupit si lepsi hardver a hlavne viac pamate. :-)

Otazka VirtualAlloc a ako sa zdiela kod DLL cez procesy je zasa o nieco komplikovanejsie. Doporucujem ti nastudovat problematiku z milion zdrojov na internete.

ovrscout

Re:Virtualny adresny priestor vo Windows
« Odpověď #2 kdy: 25. 01. 2012, 18:32:53 »
Kompletni odpoved bude nejspise na knihu nebo na hledani na internetu:), ale skusim strucne co si pamatuji.

Adresa je jednoznacne cislo ktere urcuje nejake misto v pameti, a adresni prostor je proste neco jako rozsah platných adres(např. 0 až 2^32)
Popis virtuální paměti a stránkování je např zde:
http://cs.wikipedia.org/wiki/Virtu%C3%A1ln%C3%AD_pam%C4%9B%C5%A5
http://cs.wikipedia.org/wiki/Str%C3%A1nkov%C3%A1n%C3%AD_pam%C4%9Bti
Virtuální adresní prostor znamená že program/proces pomocí adres nepřistupuje na konkrétní místo v fyzické paměti.
Dokonce daná (virtuální) adresa nemusí mít ani určeno místo ve fyzické paměti.
Dúležité ale je že ten program/proces se o to nestará prostě má nějaký (virtuální) adresní prostor a tam si (v rámci pravidel) dělá co chce.
Toto také znamená že dva různé procesy mohou mít data uložena na stejné virtuální adrese ale přesto fyzicky na jiném místě v paměti.

Program (včetně kódu a dat) je také umístěn/nahrán do paměti a tedy využívá část tohoto virtuálního adresního prostoru.
I systémové prostředky které program potřebuje v něm musí být umístěny jinak by je nemohl používat.

Ve windows(a asi i linux ale nvm jistě) je nemalá část virtuálního prostoru napevno vyhrazena pro tyto potřeby a proces tak tuto část nemůže přímo využívat.(1..2GB v závislosti na systému a nastavení)

Halda,VirtualAlloc,malloc:
Přístup k paměti (samozřejmně v rámci virtuálního adresového prostoru jak jinak :) ) musí být nějakým způsobem řízen, jinak by došlo například k tomu že program zapíše na nějakou adresu kterou by třeba použila nějaká DLL knihovna atp.
Proto se (zjednodušeně) vytvoří seznam která paměť je volná a která ne.Když pak proces potřebuje a řekne si o nějaký volný blok paměti,prohledá se ten seznam, najde se volné místo a to se mu přidělí(a zapíše se do seznamu). Když pak přestane paměť potřebovat zase se v seznamu příslušný blok paměti uvolní.
Správa paměti(myšleno tohoto seznamu) je poněkud obtížná protože jsou na něj kladeny rozdílné nároky.
musí fungovat rychle,nesmí paměť zbytečně fragmentovat, režie nesmí být moc velká(seznam také zabírá paměť,to jest adresový prostor) a musí fungovat spolehlivě.
Proto bývá základní obsluha(správa paměti) prováděna většinou po velkých blocích s fixní velikostí.
Program pak k využívání těchto velkých bloků používá svou vlastní správu paměti pomocí funkcí standardní knihovny kterou používá, například pomocí malloc/free v ja.zyku C, takto přidělovaná paměť se pak nazívá halda.
viz. http://cs.wikipedia.org/wiki/Dynamick%C3%A1_alokace_pam%C4%9Bti


P.S. doufam ze jsem neplacal moc kravin uz je to nejaky patek co jsem se tim bavil
P.P.S doplnil jsem odkazy z wiky, ale v angličtině toho bude jistě mnohem více
P.P.P.S mezitim co jsem psal polal odpoved Baran, no už jsem líný svůj příspěvek upravovat ale myslím že to mám více polopaticky.

Re:Virtuálny adresný priestor vo Windows
« Odpověď #3 kdy: 26. 01. 2012, 11:17:31 »
parada, vdaka za obsiahle odpovede. Chcem sa teraz len uistit ci tomu spravne chapem. Aj ked virtualny priestor v skutocnosti neexistuje a je to len rozsah pouzitelnych adries pre proces, tak system pre dany proces udrziava zoznam volnej pamati. Spravne? A vola sa ten zoznam nejako? Btw. ano citam mnozstvo literatury ktora sa tyka tejto problematiky, ale este som nenasiel ziadnu knihu, ktora by tuto problematiku znazornovala aj pomocou obrazkov (vtedy najlepsie pochopim :)) a nasledne mi potom vyvstavaju podobne otazky ako v tomto topicu. Prvu knihu ktoru citam je Windows Internals ale tam je to dost zlozito pisane, dalej Windows via C/C++(najlepsie je to tu vysvetlene ale aj tak mi niektore veci uchadzaju) a posledne som sa pozrel aj do Windows System Programming.

ovrscout

Re:Virtuálny adresný priestor vo Windows
« Odpověď #4 kdy: 26. 01. 2012, 12:32:22 »
Dalo by se spise rici ze system udrzuje pro proces tabulku mapovani virtualniho adresoveho prostoru na "fyzický" adresový prostor. viz "stránkování paměti"
(Jak se ale přímo tato tabulka jmenuje nevím.)

Seznam "volne/obsazene" pameti pro proces je az druhy v poradi protoze ten pracuje s v tom virtualnim adresovem prostoru.
Proces pak ma/muze mit zase svuj vlastni seznam kde si prideluje/rozdeluje z jemu pridelene pameti.
(toto se pak nazívá halda/heap/dynamicky přidělovaná paměť?)

Samotny os pak take bude mit tabulku(y) "volne/obsazene" fyzicke pameti(skutecny adresovy prostor) pro potreby strankovani

Co se tyka literatury, zkus zabrousit někam do popisu procesorů(instrukční sady a registry), většina věcí kolem stránkování má podporu v procesorech a proto je také trochu děláno podle toho. Kdysi se to jmenovalo chráněný režim (asi Protected mode?) ale to byl čas 468tek.


ovrscout

Re:Virtuálny adresný priestor vo Windows
« Odpověď #5 kdy: 26. 01. 2012, 12:34:55 »
trosku mit vypadlo z textu:)  ten zakladni seznam volne pameti atp je samozremne tak spravovan OS. to je to VirtualAlloc atp.

Re:Virtuálny adresný priestor vo Windows
« Odpověď #6 kdy: 26. 01. 2012, 13:15:46 »
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.