Správa paměti

Správa paměti (anglicky memory management) je v informatice soubor metod, které operační systém používá při přidělování operační paměti jednotlivým procesům, které jsou v počítači spuštěny. Může zajišťovat i následné uvolňování paměti (když už proces paměť nepotřebuje), nastavovat ochranu paměti a eventuálně i správu adresace paměti. Všechny tyto činnosti v operačním systému zajišťuje „správce paměti“ (anglicky memory manager, MM). Pro některé činnosti je obvykle nutná hardwarová podpora v procesoru, kterou zajišťuje jednotka správy paměti (MMU).[1]

Garbage collection je automatizovaná správa paměti, která je součástí programu nebo jeho běhového prostředí a umožňuje automaticky uvolňovat již nepoužívanou paměť (na rozdíl od „ruční“ správy paměti, čímž se myslí volání příslušné funkce v programu).

Úvod

Je-li operační paměť reprezentována pamětí s přímým přístupem označujeme adresový prostor jako fyzický adresový prostor (FAP). Velikost tohoto prostoru je omezena bud fyzickou velikostí paměťových modulů a nebo velikostí adresy tj. adresa o velikosti n bitů umožňuje adresovat 2 na n-tou paměťových míst.

Jednodušší procesory umožňují adresovat pouze paměť s přímým přístupem, tedy adresovat pouze fyzický adresový prostor. V dnešní době většina procesorů umožňuje adresovat i tzv. logické adresové prostory. Jedná se o tzv. virtuální paměť. Jde v podstatě o speciální správu paměti, která umožňuje programům a aplikacím, přistupovat k místu na pevném disku stejně jako k operační paměti RAM, což umožňuje (na úkor snížení výkonu) snadno rozšířit kapacitu paměti počítače.

Úkoly správy FAP

  • přidělování paměťových regionů na požádání procesů
  • uvolňování paměťových regionů na požádání procesů
  • udržování informací o obsazení adresového prostoru
  • zabezpečení ochrany paměti – zabránění přístupu procesu k paměti mimo jeho přidělený region
  • u víceúlohových systémů musí podporovat střídavý běh více procesů či v minimálním případě mu nesmí bránit

Historie

Počítače do 70. let minulého století disponovaly velmi malým množstvím paměti. Proto ani nároky na správu paměti nebyly vysoké, takže vlastně v podstatě ani žádná neexistovala. Později paměť přibývala a bylo v zájmu majitelů počítačů, aby byla co nejlépe využita. To vedlo ke snaze umisťovat do paměti počítače více programů a k následnému požadavku na oddělení jednotlivých částí paměti, aby si jednotlivé procesy ať už záměrně nebo omylem neškodily. V tomto okamžiku můžeme sledovat nástup skutečných operačních systémů a postupně i čím dál kvalitnější správy paměti, která byla podporována hardwarovou podporou uvnitř procesorů.

Metody přidělování paměti

Každý proces potřebuje ke svému běhu přidělení určité části operační paměti. Proto má každý operační systém modul správy paměti, který zajišťuje přidělování a ochranu paměti. Podle implementace modulu správy paměti rozlišujeme:

  1. přidělování veškeré volné paměti [monolitická aplikační paměť]
  2. přidělování bloků paměti pevné velikosti [statická aplikační paměť]
  3. přidělování bloků paměti proměnné velikosti [dynamická aplikační paměť]

Přidělování veškeré volné paměti

Rozdělení paměti

Při přidělování veškeré volné paměti[1] část paměti zabírá jádro operačního systému (kód a datové struktury) a zbytek je k dispozici pro uživatelský program. K přidělení paměti dochází jen při spuštění programu a vzniklý proces ji využívá po celou dobu svého životního cyklu. K uvolnění dojde po ukončení procesu.

Ochrana paměti

Ochrana paměti u tohoto typu operačních systémů je obvykle omezena na zabránění, aby uživatelský program zapisoval do paměti používané operačním systémem. Přidělování veškeré volné paměti se však obvykle používalo na procesorech, které prostředky ochrany paměti nedisponovaly vůbec nebo jen velmi omezenými. Ochrana paměti může být realizována pomocí dvou mezních registrů vymezujících interval adres, kam může uživatelský program zapisovat. Pokud se pokusí zapsat mimo tento interval, zápis se neprovede, OS zpravidla signalizuje chybu a často provádění programu ukončí. Zjednodušením může být použití jednoho mezního registru, kdy program může zapisovat od adresy v registru do konce adresního prostoru nebo od začátku adresního prostoru do adresy v registru. V prvním případě může být mezní registr kombinován s bázovým registrem. Jde o znemožnění použití nižších adres než je báze. V registru je uložena báze bloku aplikační paměti a paměť jádra leží tedy před tímto blokem. Proces tedy paměť jádra ani nemůže adresovat. Registr se nastavuje pomocí privilegované instrukce, která se může provést pouze v režimu jádra.

Využití

Zcela nouzově je tato metoda správy paměti použitelná i pro víceúlohový systém tak, že při přepínání kontextu se paměťové regiony programů přesunují do sekundární neboli odkládací paměti, např. na pevný disk. I při malém rozsahu paměti je však odložení paměti jednoho procesu a obnovení obsahu paměti druhého procesu z pevného disku dost pomalé a těžko si lze představit, že by umožňovalo uspokojivou interaktivní práci více uživatelů současně. Částečně se tento postup používá při návratu do interpretu příkazů po ukončení programu.

  • operační paměť ISIS-2
    • nejdříve OS, pak proměnné a buffery a pak program – při změně velikosti OS nebo počtu bufferů se musí programy přizpůsobit, aby mohly pracovat na jiných adresách – to provádí program nazývaný locator
  • operační paměť CP/M
    • prvních 100h pro OS, pak paměť pro program a pak proměnné a buffery – výhoda je, že paměťový prostor programu začíná vždy na stejné adrese

Přidělování bloků paměti pevné velikosti

Tuto metodu používal např. OS MFT (Multitasking with Fixed number of Tasks) na počítačích IBM System/360. Aplikační paměť je při startu OS rozdělena na bloky, které lze alokovat samostatně. OS přidělí programu blok, jehož délka je větší nebo rovna nárokům tohoto programu. V paměti se může nacházet několik procesů současně. Jeden proces může zabírat i více nesouvislých bloků (bloky oddělené jiným blokem). Oproti tomu dochází k fragmentaci (špatné využití paměti), je potřeba znát nároky programu předem a u procesu, který má větší nároky než je velikost největšího bloku paměti nedojde k odstartování. Velikost s počtem bloků vycházejí z druhu aplikací, které mají být na daném operačním systému provozovány.

Adresování

Nelze předem stanovit, kde (na jaké adrese) bude program uložen → program musí být relokabilní.

  • použití relokační tabulky
  • použití bázování a relativních skoků

Adresový prostor procesu

Většinou se skládá ze tří regionů: kódového, datového a zásobníkového regionu. Kódový region většinou obsahuje kód programu. Datový region nese statické data programu. Vyžaduje jak zápis tak čtení a v některých systémech může změnit svoji velikost. Zásobníkový region já charakter LIFO a jsou zde obsaženy lokální datové proměnné a návratové adresy funkcí.

Ochrana paměti

  • Metoda mezních registrů – užití dvou mezních registrů (nastavuje OS), které uvádějí nejnižší a nejvyšší dostupnou adresu. V limitním registru procesoru je uložena hodnota aktuálního paměťového regionu. Hodnota lokální adresy se porovnává s hodnotou limitního registru. Pokud je tato hodnota větší, následuje vyvolání výjimky – proces se pokouší zapsat mimo region.
  • Mechanismus zámků a klíčů – rozdělení paměti na stránky o pevné velikosti. Každé je přidělen zámek (celé číslo). Ve speciálním registru procesoru je klíč. Ty stránky, které mají stejnou hodnotu zámku jako je hodnota klíče, může proces používat.

Přidělování bloků paměti proměnné velikosti

Tuto metodu používal např. OS MVT (Multitasking with Variable number of Tasks) na počítačích IBM System/360. Paměť není rozdělena na pevné bloky, ale programu je při jeho startu přidělena paměť podle nároků. Neboli se přidělí celý volný blok a to, co nepotřebuje, program vrátí. Při alokaci se vyhledá opět první přípustný blok, pokud je jeho velikost rovna či blízká požadavku je blok použit celý. Když dochází k uvolnění bloků je nutné provádět tzv. scelování volných bloků. Vznikne-li souvislá řada 2 či 3 bloků jsou spojeny do jednoho.

Metody výběru bloku

  • First fit – vybere se první blok kde je délka větší nebo rovna chtěné velikosti
  • Last fit – přidělí se poslední vyhovující
  • Worst fit – přidělí největší volný blok
  • (exact- or) worst-fit

Vybere buď blok o stejné velikosti, nebo pokud takový neexistuje největší existující

  • first-fit

První z řady. Projíždíš pro každé číslo celou řadu a hledáš první hodnotu do které se vejde

  • best-fit

Vybere buď blok o stejné velikosti, nebo nejlépe padnoucí (s nejmenší možnou velikostí)

Obsazení paměti

Je v tomto případě realizováno na počátku každého bloku, informace zde tvoří jakousi hlavičku.

Ochrana paměti

  • Metoda mezních registrů
    • paměť je rozdělena na bloky různých velikostí (segmenty)
    • každému programu je přiřazena bázová adresa (privilegovanou operací)
    • program pracuje s tzv. logickou adresou (offset)
    • program nesmí adresou offsetu přesáhnout jemu přidělený adresovatelný limit
    • při porušení ochrany → vnitřní přerušení (zařídí OS)
    • metoda mezních registrů se běžně používá v architektuře x86
  • Stránkování
    • podporuje virtualizaci paměti, multitasking a sdílení paměti mezi procesy
    • proces pracuje s virtuální pamětí, jejíž velikost je rovna maximální možné adresovatelné hodnotě daného systému
    • paměť je rozdělena na bloky stejných velikostí (vyspělejší architektury ovšem podporují různé, avšak předem definované, velikosti bloků (např.: ARM)
    • každý proces dostane přidělenou tabulku (tzv. primární tabulku), ve které pevně daný počet položek definuje:
      • překlad každé virtuální adresy na fyzickou adresu, nebo odkaz na tabulku vyšší úrovně – existuje-li překlad takové stránky pro proces, je tato část povinná
      • příznak existence stránky (stránka může být uložena na externím úložišti, nebo pro proces neexistuje (výpadek stránky) → zařídí OS)
      • přístupové práva (čtení, zápis, stránka obsahující spustitelný kód)
      • příznak umožňující položky ze stránky ukládat do mezipaměti procesoru
      • a další…
  • Mechanismus zámků a klíčů
    • paměť je rozdělena na bloky stejné velikosti (např. 4 KiB)
    • každému programu přidělíme zámek (celé číslo)
    • bloky patřící danému programu označujeme stejným číslem (zámek)
    • v CPU je speciální registr s číslem běžícího procesu programu (klíč)
    • CPU povolí jen typ operace s pamětí, kde zámek=klíč
    • při porušení ochrany → vnitřní přerušení (zařídí OS)
    • speciální klíč 0 slouží OS (bez ochrany)
    • nastavení registru s klíčem je privilegovanou instrukcí
    • zámky jsou uloženy v operační paměti jako pole
    • metoda zámků a klíčů se používá dodnes

Reference

  1. a b KOLÁŘ, Petr. Operační systémy [online]. Liberec: 2005-02-01 [cit. 2009-06-16]. S. 38–53. Dostupné v archivu pořízeném dne 2014-07-14. 

Externí odkazy