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

Segmentation, paging

"Není na světě počítač, který by dokázal vyhovět uživatelům všem" - tak by asi mohla znít parafráze jednoho známého přísloví. Když uživatelé začali požadovat pro své úlohy více paměti, než kolik byli ochotni si zaplatit, vymysleli konstruktéři počítačů hned několik způsobů, jak jim vyjít vstříc. Všechny způsoby byly založeny na stejné myšlence, kterou jsme se zabývali v minulém vydání této rubriky - na pouhém předstírání toho, že uživatel a jeho úloha pracují s velkou pamětí, zatímco ve skutečnosti pracují s pamětí mnohem menší. Výsledným efektem je pak takový stav, kdy uživatelské úlohy "vidí" něco jiného (logický adresový prostor, daný rozsahem generovaných adres) než to, co skutečně existuje (fyzický paměťový prostor, daný skutečným rozsahem osazené paměti), a vlastně tedy pracují s pamětí, která je ve skutečnosti pouze předstírána (je tzv. virtuální).

Způsob implementace virtuální paměti je vždy založen na obecném postupu, který jsme si již také naznačili minule - na tom, že do skutečné, reálně existující paměti (tvořící paměťový prostor) budou přesouvány vždy jen ty části úlohy (z jejího adresového prostoru), které jsou v dané době skutečně zapotřebí, zatímco ostatní části úlohy budou mezitím umístěny na disku (kde je v porovnání s kapacitou paměti místa dost a dost). Jaké jsou ale konkrétní možnosti, jak tuto strategii implementovat.

Jednou z možností je koncipovat celý mechanismus tak, aby byl pro vlastní úlohy plně transparentní. Tedy aby o něm úlohy nemusely vůbec vědět a hlavně aby se mu nemusely nijak přizpůsobovat. To je možné zařídit tak, že se adresový prostor rozdělí na stejně velké části (kterým se říká stránky, anglicky: pages) a ty jsou pak v případě potřeby přesouvány z disku do stejně velkých míst v paměti, kterým se říká stránkové rámy (page frames). Celý mechanismus je přitom označován jako stránkování (anglicky: paging). Námi popisovaná varianta odpovídá tzv. stránkování na žádost (demand paging) stránka je přesouvána do paměti až na základě její skutečné potřeby. Přívlastek "na žádost" však není příliš výstižný, protože samotná úloha o celém mechanismu stránkování vůbec neví, a tak ani dost dobře nemůže o přenesení některé stránky žádat. Ve skutečnosti je podnětem k přenesení určité stránky do paměti situace, kdy právě běžící úloha vygeneruje určitou adresu a ta spadá do stránky, která se momentálně nenachází v paměti. Tuto skutečnost však rozpozná až procesor (nikoli úloha sama), interpretuje ji jako tzv. výpadek stránky (page fault) a reaguje na ni přerušením. V rámci obslužného programu přerušení pak dochází k načtení celé stránky z disku a k jejímu uložení do vhodného stránkového rámu (buď dosud prázdného, nebo takového, jehož dosavadní obsah je zapsán zpět na disk). Podstatné ovšem je to, že celý výpadek stránky a jeho ošetření je pro vlastní úlohu, která jej způsobila, neviditelný. Viditelný ale musí být pro operační systém, neboť ten vede přesnou evidenci umístění jednotlivých stránek v paměti i na disku. Také obslužný program, který v rámci přerušení zajišťuje potřebné přesuny stránek, je vlastně součástí operačního systému.

Stránkování jako jeden z možných způsobů implementace virtuální paměti má své výhody a své nevýhody. Mezi hlavní výhody patří to, že díky pevné velikosti stránek (nejčastěji 1, 2 či 4 KB) je lze velmi snadno a efektivně umístit do stejně velkých stránkových rámů. Nevýhodou je pak to, že dělení adresového prostoru úlohy na stránky probíhá bez jejího vědomí - samotná úloha například nemá možnost říci, že něco logicky "patří k sobě", a mělo by se to tudíž přesouvat do paměti společně. Dělení adresového prostoru na jednotlivé stránky je tedy dělením "na tvrdo", které nijak nerespektuje logickou strukturu úlohy, a v důsledku toho pak dochází k častějším výpadkům stránek, než by bylo nutné.

Právě tuto nevýhodu se snaží odstranit alternativní mechanimus implementace virtuální paměti, označovaný jako segmentace (segmentation). Ten je založen na myšlence, že o vlastním členění na logicky související části si nejlépe rozhoduje úloha sama. Ta si tedy nyní sama určuje, co tvoří logický celek - tzv. segment, který se přenáší do paměti vždy celý. Na rozdíl od stránkování je pak celý mechanismus segmentace pro vlastní úlohu plně viditelný. Zatímco při stránkování může úloha vycházet z představy, že má k dispozici souvislý lineární adresový prostor, při segmentaci již musí počítat s nesouvislým adresovým prostorem, členěným na jednotlivé disjunktní segmenty.

Zřejmou výhodou segmentace oproti stránkování je minimalizace počtu výpadků (nyní již segmentů). Nevýhodou je ztráta pružnosti a efektivnosti při umisťování jednotlivých segmentů do paměti - na rozdíl od stránek totiž segmenty nemají pevnou velikost, a tak se nemusí vždy vejít do volného místa, které je právě k dispozici, nebo se naopak vejdou, ale zanechají po sobě jen obtížně využitelné "kousky" volné paměti (způsobují tzv. fragmentaci).

Tuto nevýhodu segmentace lze odstranit vhodným zkombinováním obou mechanismů: segmentací se stránkováním. Jednotlivé segmenty (představující logické celky) jsou pak pro potřeby umisťování do paměti členěny na stejně velké stránky a tyto stránky jsou skutečně přesouvány z paměti a do ní. Segment pak ovšem nemusí být umístěn v paměti celý, ale mohou tam být například jen některé jeho stránky. Otázkou ovšem je, zda je toto řešení smysluplné, když se při něm ztrácí hlavní výhoda segmentace - přesouvání celých logických částí (segmentů) z paměti a do ní, a v důsledku toho pak minimalizace výpadků. Odpověď je samozřejmě kladná a vychází ze skutečnosti, že se mezitím změnil účel, pro který se virtuální paměť používá. Ale o tom až příště.