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