Úvod do virtuální paměti
Programy běžící v OS nemají přístup k RAM paměti. Místo toho mají přístup k virtuální paměti kterou má OS pod svojí kontrolou. Virtuální paměť
Programy běžící v OS nemají přístup k RAM paměti. Místo toho mají přístup k virtuální paměti kterou má OS pod svojí kontrolou. Virtuální paměť
Virtuální paměť však nevyužívá jen RAM paměť ale i dostupné persistentní uložiště. Zpravidla je to uložiště, na kterém je OS nainstalován, v běžných OS to lze nastavit. Virtuální paměť OS je však inteligentní a ví, že persistentní uložiště jsou řádově pomalejší. Využívání perzistentních uložišť běžící programy může rapidně zpomalit, proto se OS nejdřív snaží naplno využít dostupnou fyzickou RAM paměť. Kapacita virtuální paměti není proto omezena kapacitou RAM pamětí ale společnou kapacitou RAM paměti a (nastavených) perzistentních uložišť. ...
V kapitole o RAM paměti jsem řekl, že RAM paměť je adresovatelná. Virtuální paměť je také adresovatelná, jde však o úplně jiné adresy které nekorespondují s fyzickými adresami v RAM paměti. Programy běžící pod OS nemají vůbec k adresám RAM paměti přístup. OS se tak stará o překlad adres mezi virtuální pamětí a RAM pamětí a případně i persistentním uložištěm. Překlad adres ⚠️ Důležité k zapamatování: toto mapování je pro programy běžící v OS neviditelné. Žádný program v OS neví, zdali se jeho paměť nachází v RAM paměti nebo jestli se zrovna využívá persistentní uložiště. ...
OS rozděluje virtuální paměť na dvě části: kernel space: chráněná část, ve které běží operační systém a všechny jeho interní procesy a mechanismy. user space: v této části běží všechny ostatní procesy, zejména programy spuštěné uživatelem Rozdělení virtuální paměti OS se snaží zabírat co nejmenší prostor aby zbytek prostoru virtuální paměti byl dostupný pro uživatelské účely.
Při spuštění programu se instrukce tohoto programu načtou do user space virtuální paměti a vznikne proces. Spuštění programu ⚠️ Důležité k zapamatování: Operační systémy nedovolují procesům měnit své vlastní instrukce. Časem se totiž ukázalo, že běžný software tuto přirozenou schopnost procesoru nevyužívá 1. Často to však využívají viry a záškodnické programy, které se tímto způsobem vyhýbají antivirům. Z logických důvodů které budou jasné až v kapitolách o tvorbě softwaru. ↩︎
Každý běžící proces má ve virtuální paměti svůj vlastní přidělený “píseček”. Procesy ⚠️ Důležité k zapamatování: OS nedovoluje procesům jakoukoliv manipulaci s pamětí jiných procesů. Pokud se o to jakýkoliv proces pokusí tak je operačním systémem ukončen. Přístup do paměti jiného procesu se považuje za chybující chování.
Segmentation fault 1 nebo taky jen zkráceně segfault je označení pro chybu softwaru, který se snaží přistupovat (číst/zapisovat) paměť, do které nemá přístup. buď tato paměť patří jinému procesu nebo procesu nebyla vůbec přidělena nebo už procesu nepatří 🐛 je emoji pro “bug”. Anglické slovo “bug” znamená doslova “brouk” ale v IT se používá pro označení jakékoliv chyby. Mezi profesionálními ajťáky ale i vysokoškolskými profesory je populární historka, že slovo “bug” vzniklo díky jednomu inženýrovi na konci druhé světové války, kterému přestal fungovat počítač kvůli můře která mu tam vletěla. Použití slova “bug” jako nějaké chyby nebo závady je ale mnohem starší (~1880). ↩︎ ...
Proces se ve virtuální paměti dělí na následující části 1 kterým se říká segmenty. Segmenty procesové paměti Code segment: Instrukce programu. Tato část je pouze pro čtení a má fixní délku. ⚠️ Proces nemůže za běhu měnit své vlastní instrukce. Data segment: “pevně nastavená” paměť Stack: “podrutinová” paměť. Heap: “dynamická” paměť. Volná paměť Data segment, stack a heap části podrobně popíšu v následujících kapitolách. V různých OS je toto členění různě komplikované. Zde uvádím pouze ty zásadní části důležité pro běžného ajťáka. ↩︎ ...
Datový segment má fixní délku a obsahuje hodnoty, které jsou předem nadefinované již v aplikaci. Samotné hodnoty také mají fixní délku. Segmenty procesové paměti Proces z těchto hodnot může libovolně číst i zapisovat ale nemůže mazat/přidávat nové hodnoty. Příklad Jaké hodnoty najdete v datovém segmentu nějaké běžné aplikace? Z pravidla takové, které musí být k dispozici pro celý proces, ne jen pro jednu funkci. Například konfigurace aplikace. Taková konfigurace může mít vliv na všechny části procesu, proto musí být přístupná všude. Dalším příkladem jsou texty 1. Běžně například texty v horním menu aplikace jako na obrázku níže: “Soubor”, “Domů”, “Vložení”, atd. Tyto názvy se aplikaci často opakují. Texty aplikace Texty mají někdy svůj vlastní segment, to je ale pro běžného ajťáka nepodstatný rozdíl ↩︎ ...
Stack segment nebo jen stack je paměť dedikovaná podrutinám. Nejdřív bych rád připomněl kapitolu o řetězení podrutin, konkrétně následující obrázek. Řetězení podrutin Call stack Pro každé vlákno programu operační systém přiřadí call stack 1 což je jednoduše kus virtuální paměti, který se může nafukovat a zase smršťovat. Call stack je něco jako nádoba, do které lze házet kostičky na sebe. Vyndat ale můžete jenom tu nejhornější kostičku. Tomu se také říká LIFO struktura 2 . Jednotlivým kostičkám se říká stack frame což je jen kus virtuální paměti dedikovaný pro dané volání podrutiny. ...