Když zavoláte funkci, v zásobníku se přidělí nový "namespace". Tak mohou mít funkce lokální proměnné. Protože funkce volají funkce, které zase volají funkce, alokujeme stále více místa v zásobníku, abychom zachovali tuto hlubokou hierarchii jmenných prostorů.
Chcete-li omezit programy využívající velké množství místa na zásobníku, obvykle je nastaven limit pomocí ulimit -s
. Pokud tento limit odstraníme pomocí ulimit -s unlimited
, naše programy budou moci hltat RAM pro svůj stále rostoucí zásobník, dokud se nakonec systému zcela nevyčerpá paměť.
int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.
Obvykle je použití tuny místa v zásobníku náhodné nebo je příznakem velmi hluboké rekurze, která by pravděpodobně neměla tolik spoléhat na zásobník. Tedy limit zásobníku.
Dopad na výkon je malý, ale existuje. Pomocí time
Zjistil jsem, že odstranění limitu zásobníku zvýšilo výkon o několik zlomků sekundy (alespoň na 64bitovém Ubuntu).
ulimit -s unlimited
umožňuje neomezený růst zásobníku.
To může zabránit zhroucení vašeho programu, pokud píšete programy pomocí rekurze, zvláště pokud vaše programy nejsou koncové rekurzivní (kompilátory je mohou "optimalizovat") a hloubka rekurze je velká.
velikost zásobníku může být skutečně neomezený. _STK_LIM
je výchozí , _STK_LIM_MAX
je něco, co se liší podle architektury, jak je vidět z include/asm-generic/resource.h
:
/*
* RLIMIT_STACK default maximum - some architectures override it:
*/
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX RLIM_INFINITY
#endif
Jak je vidět z tohoto příkladu, obecná hodnota je nekonečná, kde RLIM_INFINITY
je opět v obecném případě definován jako:
/*
* SuS says limits have to be unsigned.
* Which makes a ton more sense anyway.
*
* Some architectures override this (for compatibility reasons):
*/
#ifndef RLIM_INFINITY
# define RLIM_INFINITY (~0UL)
#endif
Takže myslím, že skutečná odpověď je - velikost zásobníku MŮŽE být omezena nějakou architekturou, pak neomezené sledování zásobníku bude znamenat cokoliv _STK_LIM_MAX
je definován k, a v případě, že je to nekonečno - je to nekonečné. Podrobnosti o tom, co to znamená nastavit to na nekonečno a jaké to může mít důsledky, najdete v druhé odpovědi, je to mnohem lepší než moje.