Chování systému při nedostatku paměti (was: Uživatelská ...)

Jaroslav Gratz xgratz01 na stud.fee.vutbr.cz
Pondělí Květen 8 14:31:48 CEST 2000


On Mon, 8 May 2000, Pavel Janík ml. wrote:

> chyba v systému je to proto, že pokud Mozilla nemůže alokovat další paměť, tak
> se zabijí jiné procesy, alespoň tak jste to napsal. Proto jsem tam také já
> napsal "(opravdu?)".

Bohužel takle se to chová. Zkuste si spustit prográmek:

main(){for(;;) {while(malloc(4096)); sleep(5); }}

Se systémem se budou dít hrozné věci a budete rád, když nebudete muset
rebootovat. Problém je v tom, že kernel při vyčerpání volné paměti zabíjí
ty procesy, pro které je potřeba dalsí pamět. Nikoliv proces který zatím
naalokoval nejvíc paměti. 
To se dobře projevuje u procesů, které forkují potomky - běží ve sdílené
paměti a teprve když jeden z procesů zapíše něco do paměti, tak se mu
vytvoří samostatná stránka. A kernel nezabije proces vlastnící 90% paměti
a klidně čekající, ale potomka který potřebuje 4KB paměti na novou 
stránku.
Takže to klidně odskáčou procesy, které "za nic nemůžou".

Bohužel tohle může udělat každý neprivilegovaný uživatel a když bude mít
štěstí, tak kernel pozabíjí klidně i nějaké procesy běžící pod rootem.

Tohle je známá věc, ale co má kernel dělat s procesem, který potřebuje
další paměť a ta není? Zabít nějaký jiný? Dalo by se, ale je to podivné.

S pozdravem
Jaroslav Gratz



Další informace o konferenci Linux