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

Memory management

Stránkování a segmentace jsou dva mechanismy, které za svůj vznik vděčí požadavku uživatelů na co možná největší paměť, která by byla k dispozici jejich úlohám. Oba tyto mechanismy totiž dokáží úspěšně předstírat, že počítač je vybaven větší operační pamětí, než jakou doopravdy má (viz minulý příspěvek této rubriky).

Předstíráním větší paměti však vzniká disproporce mezi tím, co úloha "vidí" (tedy tzv. adresovým prostorem), a tím, s čím doopravdy pracuje (tzv. paměťovým prostorem - viz předminulý příspěvek na téma: virtuální paměť). Zatímco ale zpočátku byla disproporce mezi adresovým a paměťovým prostorem spíše vedlejším efektem, který nebyl příliš na závadu, později se naopak stala hlavním důvodem, kvůli kterému se mechanismy stránkování a segmentace používaly a používají. Proč?

Operační systém počítače má mnoho úkolů. Mezi ně patří i vhodné hospodaření s operační pamětí, vedení evidence volných míst v paměti, přidělování paměti jednotlivým úlohám, podpora úloh při využívání přidělené paměti, a konečně také následné odnímání dříve přidělené paměti po skončení běhu úlohy. Všechny tyto úkoly operačního systému, které se týkají operační paměti, spadají do širšího rámce, kterému se říká memory management (správa paměti, někdy též: přidělování paměti).

Pro jednouživatelský operační systém je správa paměti ještě relativně jednoduchá. Komplikovanější je to ale v případě operačních systémů, které podporují současný běh více úloh neboli multitasking. Jaké tedy jsou hlavní problémy, které zde vyvstávají?

I u víceúlohových operačních systémů samozřejmě dochází k tomu, že úlohy požadují přidělení většího objemu paměti, než jaký má operační systém právě k dispozici. Tento problém je opět řešitelný, a to stejným způsobem, jaký jsme si již naznačili dříve - operační systém ve skutečnosti přiděluje úlohám adresový prostor v rámci virtuální paměti a pomocí mechanismů stránkování a segmentace jej pak, až na základě skutečné potřeby, mapuje do takového objemu fyzické paměti, jaký má k dispozici.

Objevuje se však i další požadavek, který v jednoúlohovém prostředí nebyl zdaleka tak naléhavý: každá úloha chce mít svůj přidělený adresový prostor vždy stejný (a nezávislý na tom, kolik rozpracovaných úloh se právě v systému nalézá a které části skutečné operační paměti jsou těmto úlohám právě přiděleny). Důvodem je skutečnost, že strojový kód většiny dnešních procesorů není přemístitelný (též: relokovatelný, angl.: relocatable), což znamená, že počítá s pevným umístěním sebe samého v adresovém prostoru. Tuto skutečnost pak samozřejmě musí respektovat překladače, které generují kód nejrůznějších aplikačních úloh - již při překladu musí znát adresy, na kterých bude nově generovaný kód při svém běhu umístěn. Také tomuto požadavku však není nijak obtížné vyhovět, je-li možné využít segmentaci či stránkování a adresový prostor učinit nezávislým na prostoru paměťovém. Každá úloha pak může vždy dostat přidělen stejný adresový prostor, souvislý a začínající od nuly.

V prostředí víceúlohového operačního systému je dále velmi žádoucí, aby jednotlivé úlohy mohly sdílet některé své části (např. různé knihovní moduly apod.), a aby si také naopak mohly chránit jiné své části před čtením, přepisem či provedením jinými úlohami. Pro tyto účely je velmi příhodný mechanismus segmentace - segment jako logický celek je tím nejvhodnějším objektem, se kterým má smysl spojovat nejrůznější údaje o možnostech sdílení, přístupových právech a ochraně. Stránkování se naopak k těmto účelům nehodí, neboť členění adresového prostoru na stránky je členěním "na tvrdo" a nijak nerespektuje logickou strukturu úlohy. Jedna logická část (segment) úlohy pak může zaplňovat hned několik stránek, ale může nastat i opačný případ, kdy se v jedné stránce nachází více logických celků (segmentů), z nichž každý by měl mít jiná přístupová práva atd.

Kombinace segmentace a stránkování, o které jsme se zmiňovali v minulém příspěvku této rubriky, má pak za cíl spojit výhody obou mechanismů a odstranit jejich nevýhody. Segmentace se přitom využívá právě pro potřeby ochrany a sdílení, a nevýhodnost umisťování celých nestejně velkých segmentů do paměti je pak eliminována stránkováním jednotlivých segmentů.

Jestliže je však adresový prostor každé úlohy nezávislý na pamětovém prostoru počítače, znamená to zároveň, že procesor, provádějící určitou úlohu, generuje jiné adresy než ty, které jsou skutečně používány pro přístup do skutečné operační paměti. Kdo ale zajišťuje průběžný převod těchto adres?

Odpověď je jednoduchá - specializovaný obvod, který to má na starosti. Obvykle se tomuto obvodu říká MMU neboli: Memory Management Unit (jednotka správy paměti). Některé mikroprocesory počítají s tím, že tento obvod je řešen jako samostatný celek (v rámci řady podpůrných obvodů ), a nachází se tedy "vně" vlastního mikroprocesoru (takto je tomu například u mikroprocesorů firmy Motorola řady MC68000). Jiné procesory již mají jednotku MMU zabudovánu přímo v sobě. Příkladem může být mikroprocesor 80286 firmy Intel, jehož zabudovaná jednotka MMU podporuje pouze segmentaci, a mikroprocesory 80386 a 80486, které již podporují segmentaci spolu se stránkováním.