Operační paměť
Operační, vnitřní neboli hlavní paměť počítače (anglicky main memory, internal memory, primary storage, core) je paměť umožňující čtení i zápis, používaná pro ukládání dat po dobu běhu spuštěného programu. Přístup k operační paměti je mnohem rychlejší než k vnější paměti.
Procesor pomocí adresy přímo vybírá požadovanou buňku operační paměti. Paměť je s procesorem spojena pomocí rychlé sběrnice; pro další urychlení se mezi procesor a operační paměť vkládá rychlá vyrovnávací paměť typu cache, která mívá 2 až 3 úrovně.
V současných počítačích je operační paměť realizována jako polovodičová paměť typu RAM, která je volatilní (ztrácí informaci při odpojení z napájení) a kvůli nižší ceně obvykle dynamická (obsah paměti je třeba občerstvovat pravidelným čtením všech řádků).
Operační paměť je nepostradatelný fyzický prostředek, který je spravován operačním systémem. Uchovává nejen kód programů, respektive procesů spolu s mezivýsledky a výsledky jejich činnosti, ale i stav dalších prostředků a základní datové struktury jádra.
Fyzický adresový prostor (FAP) paměti se jeví jako souvislý prostor paměťových míst (buněk) určité velikosti (typicky 1, 2, 4 nebo 8 bytů). Tyto buňky jsou pak lineárně adresovány adresami pevné délky. Velikost tohoto prostoru je omezena délkou adresy (adresa o velikosti n bitů umožňuje adresovat 2n paměťových míst). Celý FAP nemusí být vyplněn pamětí – některým adresám nemusí odpovídat žádná fyzická paměť; některé bloky fyzické paměti se mohou objevit v adresním prostoru vícekrát; u architektur s omezeným rozsahem fyzických adres může být naopak do určitého adresního rozsahu připojovány různé úseky fyzické paměti (např. Expanded memory u některých počítačů PC okolo roku 1990, nebo u osmibitových mikropočítačů s 16bitovou adresou a více než 64 KB paměti, např. Didaktik Gama). Fyzický adresní prostor může být také použit pro zpřístupnění paměťově mapovaných portů vstupně-výstupních zařízení.
Moderní procesory obvykle používají různé metody překladu adres a virtualizace paměti, takže každý proces může adresovat vlastní logický adresový prostor nebo několik adresových prostorů.
Úkoly správy paměti
- 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
Architektura operační paměti
- John von Neumannova architektura, paměť je společná pro data i instrukce
- Harvardská architektura, existují dvě nezávislé paměti pro data a instrukce (časté využití je u mikrokontrolérů)
Metody správy
Monolitická paměť
Jedná se o nejjednodušší správu operační paměti. FAP je zde rozdělen na dva bloky, tj. na dvě souvislé části, jež jsou určeny počáteční adresou. První blok je přidělen rutinám jádra operačního systému a jeho datovým strukturám tj. „Kernel memory“. Druhý je pak přidělován na požádání ostatním procesům tj. „Application memory“. Paměť jádra sdílí všechny procesy, protože rutiny jádra včetně jeho datových struktur jsou využívány veškerými procesy při vykonávání služeb operačního systému. Paměť procesů neboli aplikační paměť je soukromého charakteru, tedy přístup k ní má pouze vlastník.
Regulace je prováděna velice triviálně. Je-li paměť volná tzn. není-li alokována je přidělena procesu celá bez ohledu na požadovanou velikost, přičemž nesmí přesáhnout velikost bloku. V případě obsazené paměti jiným procesem je požadavek na přidělení odmítnut. Toto zamítnutí může mít fatální důsledky pro proces žádající o paměť. K alokování paměti vlastně dochází jen při spuštění procesu a proces ji využívá po celou dobu svého životního cyklu. K uvolnění dojde po ukončení života procesu. Ochrana paměti je zde realizována pouze v případě ochrany paměti jádra pomocí tzv. bázového registru. V praxi 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 ani nemůže adresovat paměť jádra. Registr se na stavuje pomocí privilegované instrukce, která se můžu volat pouze v režimu jádra.
Tato strategie správy paměti se jeden čas používala ve více úlohových systémech. Kdy byl tento princip jediného bloku v paměti rozšířen o možnost odkládání paměťového regionu do sekundární neboli odkládací paměti, např. pevný disk. Obnova procesu z pevného disku je velice pomalá a proto je tato strategie v dnešních systémech téměř nepoužitelná. Jak je asi pochopitelné, vzniká zde problém s nedostatečným využitím aplikační paměti. V praxi to znamená, že proces s malou velikostí zabere celou aplikační paměť.
Statické bloky
Jedná se o jedno z možných řešení nedostatečného využít aplikační paměti. Aplikační paměť je rozdělena na několik samostatných bloků, které lze alokovat samostatně. Tedy nepočítáme-li procesy odložené v sekundární paměti, maximální počet procesů je omezen počtem bloků. Jeden proces může zabírat i více nesouvislých bloků (bloky oddělené jiným blokem). Jedná se o bloky pevné velikosti, jejichž velikost bývá vzájemně rozdílná a počet s velikostí se stanovují při překladu operačního systému. Velikost s počtem bloků vycházejí z druhu aplikací, které mají být na daném operačním systému provozovány.
Strategie přidělování bloků je založena na stejném principu u čistě monolitické paměti s rozdílem, že žádajícímu procesu o přidělení paměti je přidělen blok o nejmenší velikosti o dostatečné velikosti. Informace o obsazení bloků jsou udržovány poli o stanovené velikosti.
Jelikož je aplikační paměť rozdělena na již zmíněné bloky je nutné zajistit jejich ochranu. Na tuto ochranu se používá tzv. limitní registr procesoru. 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.
Adresový prostor procesu se většinou 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 má charakter LIFO a jsou zde obsaženy lokální datové proměnné a návratové adresy funkcí.
S těmito strategiemi založenými na statických blocích se lze setkat na úrovni správy paměti jádra. Jelikož lze požadavky rutin jádra odhadnout včetně jejich posloupnosti.
Dynamické bloky
Aplikační paměť je rozdělena na bloky jejichž velikost se dynamicky upravuje dle požadavků procesů. Před alokací prvního regionu tvoří paměť aplikačního prostoru jeden blok.
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ý. V ostatních případech je blok rozdělen na dva jeden o požadované velikosti procesu a druhý zůstává jako volné místo. 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.
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 je opět realizována pomocí bázového a limitního registru. Nutné je velice pečlivě ochránit hlavičky jednotlivých bloků. Nevýhodou tohoto systému je velký sklon k fragmentaci paměti, respektive vzniku velkého množství volných malých nesouvislých bloků. Je to velký problém zejména u víceúlohových systémů kde žádosti o alokování a dealokování přicházejí v libovolném a nezávislém pořadí.
Fragmentace paměti se dá řešit tzv. setřásáním bloků. V praxi se jedná o soustředění volné paměti do jediného bloku většinou na konci paměti. Tato technologie má několik omezení. Musí existovat alespoň minimální technická podpora na úrovni procesoru, tedy podpora bázového registru. Všechny procesory však toto nepodporují, proto je nutné nuceně použít popisovače paměti. Není to zcela ideální řešení. Kdyby nebylo toto zajištěno mohlo by například dojít při zápisu řetězce do paměti k přesunu cílové paměti a většina programu by toto nezvládla. Dalším problémem je potřeba přímého přístupu do paměti a to je pak nutné zamknout celý region. Zamknutí brání dokonalému setřesení a je povoleno na dobu nezbytně nutnou. Zamknutí na nejmenší možný čas přináší v důsledku závislosti mezi procesy. Toto vede k degradaci systému, respektive při určité úrovni fragmentace dojde ke zvýšení režie systému a vzrůstu závislostí mezi procesů nad únosnou mez. Systém se zdánlivě zastaví.
Setřásání bloků bylo dříve používáno v kooperativních víceúlohových systémech (Windows 3, starší verze MacOS a Symbian).