Vyšlo v týdeníku Computerworld č. 11/93 v roce 1993
Vytištěno z adresy: http://www.earchiv.cz/a93/a311c120.php3

Virtual memory

Ne nadarmo se říká, že s jídlem roste chuť. Když uživatelé poprvé získali přístup k počítačům, museli nutně být nadšeni jejich možnostmi. Jakmile si ale na ně jen trochu zvykli, začali požadovat více. Jedním z prvních požadavků směrem ke konstruktérům bylo: "Chceme větší operační paměť". "Dobře," odpovídali na to konstruktéři, "má to sice některá technická úskalí - větší rozměry, větší spotřebu, menší spolehlivost - ale v principu to možné je: připravte si ale peněženky, paměť něco stojí." Bylo to však v době, kdy se ceny počítačů jako takových i ceny pamětí pohybovaly oproti dnešku v astronomických výškách. A tak není divu, že se kategorický požadavek uživatelů záhy změnil na mnohem méně imperativní "nešlo by to zařídit nějak jinak?"

Kupodivu šlo. Našel se totiž mechanismus, který dokázal zdánlivě nemožné: nabídnout uživatelům k využití větší objem operační paměti, a přitom je nenutil sahat hlouběji do peněženky a platit za rozšíření operační paměti.

Přitom však šlo v jistém smyslu o podvod - uživatelům se pouze vytvářela iluze toho, že pracují s větší operační pamětí, i když ve skutečnosti byly jejich počítače vybavovány stále stejným objemem paměti.

Vše bylo založeno na pozorování, že programy a jejich data nemusí být v operační paměti vždy celé, a přesto mohou úspěšně běžet. Ve skutečnosti stačilo uložit je celé do vhodné (a především mnohem lacinější !!!) vnější paměti - obvykle na disk - a do operační paměti přenést vždy jen tu část, resp. ty části, kterou úloha nezbytně potřebuje ke svému spuštění. Jestliže se pak kdykoli později ukázalo, že právě běžící úloha potřebuje některou jinou část svého kódu či svých dat, došlo k výměně: z těch částí úlohy, které se právě nacházely v operační paměti, se vybrala taková, kterou úloha momentálně nepotřebovala, tato část se "vrátila" zpět (zapsala) na disk a místo ní se do operační paměti načetla nově požadovaná část úlohy. Docházelo tedy k průběžnému "přetahování" částí úlohy mezi operační pamětí a vnější pamětí - v angličtině se tomu říká swapping.

S právě naznačeným mechanismem je samozřejmě spojena určitá režie, neboť přenést blok dat z disku do operační paměti či naopak určitou dobu trvá. Velikost této režie přitom zavisí na chování samotných úloh - na tom, jak moc sahají do paměti "na přeskáčku". Není jistě principiálním problémem napsat takovou úlohu, která bude zcela záměrně přistupovat k paměti takovým divokým způsobem, že se její jednotlivé části budou neustále přenášet mezi diskem a operační pamětí a režie na tyto přenosy bude zcela neúnosná.

Jak se však pozorováním zjistilo, drtivá většina "reálných" úloh se v tomto ohledu chová mnohem rozumněji - po určitou dobu "sahají" vždy jen do poměrně úzce lokalizované oblasti paměti (proto se také odpozorovanému zjištění říká princip lokality). V důsledku toho pak dochází k výměně částí úloh mezi diskem a operační částí poměrně zřídka a režie, spojená s těmito výměnami, je únosně malá. Navíc ji lze ještě dále optimalizovat vhodnou volbou velikosti přenášených částí, vhodnou volbou strategie pro výběr "nepotřebné" či "nejméně potřebné" části, která se má vrátit z operační paměti zpět na disk apod.

Podstatné je dále to, že celý mechanismus může být implementován takovým způsobem, aby si jednotlivé úlohy nemusely jeho existenci vůbec uvědomovat. Tedy aby veškeré přesuny částí úloh mezi operační pamětí a diskem byly pro samotné úlohy plně transparentní (tj. neviditelné). Úloha (a s ní i ten, kdo ji programuje) se pak může vcelku oprávněně domnívat, že pracuje s "velkou" operační pamětí, jejíž velikost je vlastně omezena jen tím, co se vejde na příslušnou vnější paměť (tedy na disk). Ve skutečnosti však úloha pracuje s mnohem menší operační pamětí, i když o tom ale vlastně vůbec neví.

Vzniká zde tedy disproporce mezi tím, co uživatel a jeho úloha "vidí", a tím, s čím doopravdy pracují. Paměť o velkém objemu, kterou "vnímají" uživatelé a jejich úlohy, je pamětí pouze předstíranou, ve skutečnosti neexistující, a označovanou proto jako virtuální paměť (virtual memory).

Aby se i terminologicky vhodně odlišila paměť, kterou "vidí" uživatelské úlohy, a skutečná, reálně existující operační paměť, zavedly se dva další pojmy: adresový prostor (address space) je to, co "vnímá" úloha, zatímco paměťový prostor (memory space) je tou pamětí, která skutečně existuje. O virtuální paměť se pak jedná v případech, kdy adresový prostor není totožný s prostorem paměťovým.

Adresový prostor a jeho rozsah je určen adresami, které je uživatelská úloha schopna generovat (a ty jsou zase dány šířkou registrů procesoru používaných pro adresování, způsoby adresování atd.). Naproti tomu paměťový prostor je tvořen adresami, které se skutečně používají pro přístup do paměti (tedy tzv. fyzickými adresami), a rozsah je dán objemem skutečně osazené operační paměti. Takže například počítač, jehož procesor pracuje s 32bitovými adresami, nabízí úlohám adresový prostor o velikosti až 4 GB. Ve skutečnosti však může být takovýto počítač vybaven např. jen jedním megabytem "skutečné" operační paměti.

Za virtuální paměť bychom ale měli považovat i případ opačný, který byl velmi častý u 8bitových počítačů. Jejich osmibitové procesory pracovaly se 16bitovými adresami, což odpovídalo adresovému prostoru o rozsahu 64 kB. Tyto 8bitové počítače však byly nezřídka osazovány větším objemem paměti, než je zmíněných 64kB. Paměťový prostor pak byl větší než prostor adresový - a v důsledku toho pak bylo nutné používat i jiné mechanismy pro realizaci virtuální paměti (tedy k tomu, aby se úlohy pomocí "malých adres" dostaly na "velkou paměť").