Problem s obsadenim pamate v jazyku C

Ing. Miloslav Ponkrác miloslav.ponkrac na interval.cz
Úterý Leden 8 10:14:53 CET 2002


>> Nedivte se, když Vám program sletí, vytváříte-li na zásobníku obrovská
pole.
>> Systém taky musí adresový prostor zásobníku mapovat do souvislého bloku
>> paměti

>To sice musi, ale jen virtualne, jednotlive stranky nemusi lezet za
>sebou ve fyzickem adresovem prostoru.


To je pravda, ale chápejte, že prostě program má pouze 4 GB paměťového
prostoru, byť virtuálního. Víc ani ťuk. Do tohoto prostoru musí namapovat
všechno. Strojový kód programu, data, hromadu, zásobníky pro všechny thready
programu, paměťově mapované soubory, namapování všech sdílených knihoven,
mapování služeb jádra, atd.. A ona je v těch 4 GB docela tlačenice, není to
zas tolik místa.

Protože žádný program se jaksi nesrovná s tím, že mu budete měnit adresu
zásobníkového prostoru během vykonávání kódu, musí se systém rozhodnout
rezervovat souvislý virtuální prostor pro zásobník již před spuštěním
procesu. Jednotlivé stránky pro zásobník nemusí za sebou ležet ve fyzickém
paměťovém prostoru, to je pravda. Ale stránky pro zásobník MUSÍ ZA SEBOU
LEŽET ve virtuálním paměťovém prostoru a nedají se později ani přemístit.

A samozřejmě totéž pro každý další zásobník před spuštění každého threadu.
Proto se musí systém (nebo Vy) rozhodnout pro určitý kompromis a omezit
velikost zásobníku na malou hodnotu, třeba řádově MB, kterou již prakticky
nemá později šanci zvětšit, protože ve vertuálním paměťovém prostoru může
narušit jiné části, rezervované pro jiné účely.

S pozdravem

Miloslav Ponkrác



Další informace o konferenci Linux