GNU/Linux >> Znalost Linux >  >> Linux

Co dělá ulimit -s neomezený?

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.


Linux
  1. Co znamená „–“ (dvojitá pomlčka)?

  2. Co dělá Exec 3?

  3. Co dělá . ~/.bashrc Příkaz Udělat??

  1. Co dělá Bamfdaemon?

  2. Co je výstupem pwd?

  3. Co dělá zabít -- -0?

  1. Co je NGINX? Jak to funguje?

  2. Co dělá CAP_NET_RAW?

  3. Co znamená echo $? dělat?