Problem s obsadenim pamate v jazyku C

Ing. Miloslav Ponkrác miloslav.ponkrac na interval.cz
Neděle Leden 6 18:40:31 CET 2002


>> > Pri programovani som narazil na chybu....
>> > Vytvoril som pole int [300000] [8];
>> > Skompilovalo v pohode.Nie je tam syntakticka chyba.
>> > Pri spusteni vsak vyhlasilo core....
>
>a kdyz to definujete do datasegmentu (nebo jak se tomu nadava), tj. tusim:
>static int [300000] [8];
>tak to dela take ?


Pravda je, že pokud takto velke pole bylo vytvořeno na zásobníku, je to
nerozumné. Neznám přesně jádro Linuxu, ale velikost zásobníku je často
omezena na určitou maximální velikost pro jeden thread. Maximální velikost
často bývá v řádu megabajtů, a Vy jste jí mohl překročit. Při překročení
maximální velikosti zásobníku jde jádro snad proces přímo odstřelit.

Koneckonců zásobník není určen na obrovská pole. Velká pole se mají vytvářet
buď jako statické pole, pokud je užitečné po celou dobu běhu procesu, a nebo
dynamicky na hromadě pomocí malloc/calloc, nebo new.

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 a jeden proces musí mít v sobě namapováno více zásobníku pro více
threadů. Z toho vyplývají určité limity na velikost zásobníku, při
překročení limitu musí jádro proces odstřelit. Může se i stát, že někde to
sletí, jinde ne, protože záleží na konrétních nastaveních tohoto limitu.

S pozdravem

Miloslav Ponkrác




Další informace o konferenci Linux