Out of memory

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
Out of memory (Linux 2.6.32)

Out of memory (zkratka OOM, tj. vyčerpání [veškeré dostupné] paměti) je v informatice označení stavu, kdy v počítači dojde volná operační paměť. Protože se obecně při běhu počítačového programu (tj. procesu) předpokládá, že další paměť bude k dispozici, není za takové situace obvykle možné výpočet dokončit, a proto je běh procesu ukončen, což typicky způsobí potíže s využíváním počítače. Ukončením procesu je obsazená paměť uvolněna a je možné ji dále použít. Mechanismus virtuální paměti umožňuje rozšířit dostupnou operační paměť o místo na pevném disku, čímž se zmenšuje problém OOM, typicky však za cenu snížení výkonu počítače při jejím intenzivním využívání.

Charakteristika[editovat | editovat zdroj]

Správu paměti v současných operačních systémech zajišťuje jádro, které operační paměť přiděluje procesům (tj. běžícím počítačovým programům). Paměť je procesu přidělena při jeho startu a v moderních operačních systémech je možné další paměť přidělit i za běhu procesu (říkáme, že proces paměť alokuje, viz funkce malloc, new), protože do ní ukládá zpracovávaná data. Proces může za běhu nepotřebnou paměť jádru vrátit, takže je možné ji přidělit jiným procesům. I samotné jádro za běhu alokuje a uvolňuje paměť, kterou využívá pro svoji interní potřebu.

Programátor při tvorbě programu typicky nepředpokládá, že by žádost o další paměť selhala, a proto neřeší jeho běh tak, aby v případě selhání alokace paměti mohl program pokračovat (někdy to ani není možné). Proto je následkem selhání alokace paměti typicky jeho okamžité ukončení. Tím je veškerá paměť alokovaná procesem uvolněna a připravena k dalšímu použití.

Pokud dojde k OOM, může se jádro operačního systému pokusit řešit problém tím, že ukončí některý běžící proces (v Linuxu tzv. OOM killer), avšak v takovém případě může být ukončen důležitý proces, bez kterého počítač nelze využívat (např. X Server, webový server apod.).

Virtuální paměť[editovat | editovat zdroj]

Současné systémy využívají mechanismus virtuální paměti pro zvětšení dostupného množství využitelné paměti o místo na pevném disku. Pokud je tento prostor na disku intenzivně využíván, dochází ke zpomalování činnosti počítače, protože pevný disk je mnohem pomalejší, než paměť RAM. Pokud se systém blíží vyčerpání paměti, je typicky jeho činnost tak zpomalena, že obsluha počítače některé procesy ukončí, takže paměť je opět uvolněna a systém může pokračovat v činnosti. Zpomalení jeho běhu tak poskytuje obsluze čas na to, aby sama hrozící problém OOM vyřešila před tím, než ohrozí činnost počítače.

Historie[editovat | editovat zdroj]

Dříve byl problém OOM běžnější než dnes, protože počítače obsahovaly menší množství fyzické paměti RAM kvůli její vysoké ceně a omezeným schopnostem procesorů. V 60.90. letech 20. století měly počítače desítky, maximálně stovky kilobajtů paměti RAM (např. v 80. letech mělo IQ 151 32 KiB, Sinclair ZX Spectrum měl 48 KiB, IBM PC XT mělo maximálně 640 KiB RAM).

Dalším faktorem byly omezené schopnosti operačních systémů. Systémy CP/M nebo DOS umožňovaly spustit nejvýše jednu úlohu, takže program měl celou operační paměť jen pro sebe (nepodporovaly multitasking). Program typicky alokoval paměť při svém startu, takže se v případě nedostatku paměti ani nespustil (např. T602). Zároveň nebyla podporována virtuální paměť.

Limity paměti[editovat | editovat zdroj]

Systém může limitovat množství paměti, které může každý proces využít. Ve víceuživatelském systému je typicky možné limitovat součet paměťových nároků procesů jednoho uživatele, což znemožní uživateli ohrozit práci ostatních uživatelů (nemůže umělým vytvořením OOM způsobit DoS).

V moderních systémech je paměť skutečně alokována až ve chvíli, kdy je použita. To systému umožňuje odsouhlasit procesům přehnané paměťové nároky a spoléhat se na to, že část alokované paměti nakonec použita nebude nebo že více paměťově náročných procesů nebude fyzicky deklarované množství paměti požadovat zároveň (jiná paměť může být před tím ještě uvolněna). To vede k situaci, kdy k OOM nedojde při alokaci paměti, ale až při pokusu o její použití (OOM se neprojeví při volání malloc, ale projeví se později v jádře operačního systému).

Externí odkazy[editovat | editovat zdroj]