Pomnilnik v Windows: 2. del
Matej Huš
30. nov 2008 ob 21:42:55
V drugem delu svojega bloga si je Mark Russinovich ogledal navidezni pomnilnik, ki je nadomestek fizičnega za aplikacije, saj s slednjim gospodari izključno operacijski sistem. Za vas pa se je s temi stvarmi v slovenščini pobliže seznanil Slo-Tech.
Vsak proces v okolju Windows se izvaja v svojem lastnem navideznem pomnilniku, z imenom naslovni prostor (address space), ki ga vidi kot pravi fizični pomnilnik. Iz istih razlogov, kot so bili navedeni v prvem delu sestavka, lahko 32-bitni sistem naslovi 4 GB navideznega pomnilnika. 2 GB od tega pripadata aplikacijam na tak način, da vsaka vidi celotna 2 GB zase, operacijski sistem pa določa, koliko in kdaj se uporabljenega navideznega pomnilnika dejansko zapiše v RAM. Če to iz kakršnega koli razloga ni dovolj, je že Windows NT SP3 uvedel stikalo /3GB, XP in 2003 pa /userva, ki programom v prvem primeru dodeli 3 GB naslovni prostor, v drugem pa dinamično med 2 in 3. Da programi delujejo pravilno v tem razširjenjem področju, morajo biti temu prilagojeni in prevedeni z zastavico large address space aware, da pravilno uporabljajo zadnji bit pri naslavljanju (high bit), ki je pod 2 GB vedno nič. V nasprotnem primeru si sproti brišejo podatke in ne delujejo pravilno.
Na 64-bitnih sistemih je dostopnega mnogo več pomnilnika, vendar lahko 32-bitne aplikacije uporabljajo le 4 GB. 64-bitni kazalci podpirajo teoretično 16 heksabajtov (264), ki ga Windows razdelijo takole. Na platformi x64 se programom dodeli 8 TB, na IA64 pa 7 TB, ostalo pa se porabi za sistem. Shema izgleda takole.
Naslednji pomemben pojem je zagotovljen pomnilnik (committed memory), kar ni enako rezerviranemu. Rezervirani pomnilnik še ne more shraniti podatkov, aplikacije pa ga uporabljajo zato, da si zagotovijo kontinuirani naslovni prostor. Zagotovljeni pomnilnik, po drugi strani, je dejansko zapolnjeni, saj operacijski sistem garantira, da lahko program vanj zapisuje podatke - do zgornje meje, ki se imenuje zagotovljena meja (commit limit). Količina zagotovljenega pomnilnika za vse aktivne procese se imenuje current commit charge in ne more preseči vsote fizičnega pomnilnika in ostranjevalne datoteke. V Windows 2000 in XP se ta ista zadeva imenuje Uporaba OD (PF Usage) in jo najdemo v Upravitelju opravil.
Poenostavljeno to pomeni, da se bo 32-bitni program sesul, bodisi ko bo dosegel zgornjo mejo svojega naslovnega prostora (2 GB) bodisi že prej, če imate veliko požrešnih programov in malo pomnilnika in odstanjevalne datoteke, tako da je zagotovoljena meja sistema nizka. V takih primerih se začnejo pojavljati čudne napake, Windows pa navadno opozorijo, da pomnilnika zmanjkuje in da bo potrebno zapreti nekaj programov.
Ves pomnilnik, ki ga porabijo programi, ne šteje k zagotovljenemu. Rezervirani pomnilnik, ki še ne uporabljen, ne sodi zraven. Prav tako mapiranje datotek z diska, ker jih Windows vedno lahko pokliče od tam. Štejeta pa dve vrsti: privatni in ostranjevalni (private in pagefile-backed). Prvi je lasten vsakemu procesu, podpira avtomatsko obnavljivo kopico (garbage collector heap), nativno kopico (native heap) in jezikovne alokatorje (language allocator) ter se ne more deliti, Windows pa ga prikazuje v Upravitelju opravil za vsak proces posebej. Drugega je težje določiti, saj si ga procesi lahko delijo.
Glavno vprašanje in edina stvar, na katero uporabnik lahko vpliva, je pametna nastavitev ostranjevalne datoteke. Kako velika naj bo? Klasični nasveti od 1,2- do 2-kratnika fizičnega RAM-a so (preživeta) klasika vseh računalniških revij. Praktični nasvet je, zaženite vse programe, ki bi jih lahko uporabljali, hkrati, in v Upravitelju opravil poglejte postavko Zagotovljen pomnilnik - največ (Peak Commit Charge). To je vrednost, ki jo morata skupaj dosegati RAM in ostranjevalna datoteka. Za dobro vago lahko vse skupaj pomnožite z recimo 2, da ste na varnem. Če imate veliko RAM-a, bo rezultat, da ostranjevalne datoteke pravzaprav ne potrebujete. Tudi v takem primeru je smiselno nastaviti ostranjevalno datoteko na tako velikost, da gre vanjo memory dump, ki ga Windows zapiše ob zloglasnem modrem zaslonu. Pa srečno.