Dlaczego w nowoczesnym systemie Linux domyślny rozmiar stosu jest tak ogromny - 8 MB (nawet 10 w niektórych dystrybucjach)

10

Na przykład w OSX jest nawet mniej niż 512 KB.

Czy jest jakiś zalecany rozmiar, biorąc pod uwagę, że aplikacja nie używa rekurencji i nie przydziela wielu zmiennych stosu ?
Wiem, że pytanie jest zbyt ogólne i bardzo zależy od użycia, ale nadal chciałem zapytać, ponieważ zastanawiałem się, czy kryje się za tym ukryty / wewnętrzny / systemowy powód .


Zastanawiałem się, ponieważ zamierzam zmienić rozmiar stosu na 512 KiB w mojej aplikacji - nadal brzmi to jak ogromna liczba, ale jest znacznie mniejszy niż 8 Mb - i doprowadzi do znacznego zmniejszenia pamięci wirtualnej procesu, ponieważ mają dużo wątków (I / O).

Wiem też, że to tak naprawdę nie boli, dobrze wyjaśnione tutaj : Domyślny rozmiar stosu dla pthreads

Kiril Kirow
źródło
Czy używasz 32-bitowego procesora? Procesory X86_64 oferują wirtualną przestrzeń adresową do 128 terabajtów (w przestrzeni użytkownika), co powinno wystarczyć dla wielu stosów 8 MB.
Johan Myréen,
@ JohanMyréen - nie, x64 to jest. To nie jest wielka sprawa, po prostu zastanawiałem się, nie ma prawdziwego powodu, aby to zrobić (w tej chwili).
Kiril Kirov
W 2019 i 8 MiB jest dużo pamięci? Nie wydaje mi się Duży domyślny rozmiar stosu ułatwia pisanie programów z rekurencją. Byłem bardzo zaskoczony, wiedząc, że domyślny rozmiar stosu w systemie Windows to tylko 1 MB!
oldherl

Odpowiedzi:

15

Jak powiedzieli inni i jak wspomniano w linku, który podajesz w swoim pytaniu, posiadanie stosu 8MiB niczego nie zaszkodzi (oprócz zajmowania przestrzeni adresowej - w 64-bitowym systemie, co nie będzie miało znaczenia).

Linux bardzo długo stosował stosy 8MiB; zmiana została wprowadzona w wersji 1.3.7 jądra, w lipcu 1995 roku. Wtedy była prezentowana jako wprowadzenie limitu, wcześniej nie było żadnego:

Ogranicz stos do pewnych rozsądnych wartości domyślnych: root może zawsze zwiększyć ten limit w razie potrzeby. 8 MB wydaje się rozsądne.

W Linuksie limit stosu wpływa również na rozmiar argumentów programu i środowiska, które są ograniczone do jednej czwartej limitu stosu ; jądro wymusza co najmniej 32 strony dla argumentów i środowiska.

W przypadku wątków, jeśli limit stosu ( RLIMIT_STACK) jest nieograniczony, pthread_createstosuje własne ograniczenia do stosów nowych wątków - w przypadku większości architektur jest to mniej niż 8 MB.

Stephen Kitt
źródło
1
Wow, ciekawe. Myślałem, że zostało to niedawno wprowadzone. Mam około 200 wątków (to kolejny długi temat, więc zignorujmy go na chwilę) i toppokazuje przerażające wyniki VIRT. Chociaż kopanie nieco głębiej, większość tej wirtualnej przestrzeni adresowej jest pobierana z aren dla poszczególnych wątków (pamięci), a nie z wielkości stosu, więc obniżenie wielkości stosu nie spowoduje drastycznego zmniejszenia pamięci wirtualnej. Byłem po prostu ciekawy, dlaczego 8MiB i dlaczego tak bardzo.
Kiril Kirov
„8 MB” oznacza po prostu, że stos każdego wątku może wzrosnąć do 8 MB, jeśli wątek zdecyduje się go użyć. Ale pamięć fizyczna nie zostanie przydzielona, ​​dopóki pamięć nie zostanie faktycznie wykorzystana. Jeśli 200 wątków używa 512 KB każdy, użyjesz 100 MB pamięci RAM, a nie 1,6 GB.
Guntram Blohm obsługuje Monikę
Jeśli nie zamieniasz, wówczas kolumna RES topdaje o wiele lepszą odpowiedź na „jaka pamięć faktycznie korzysta z tego procesu” niż VIRT.
kbolino
1
@Guntram OP jest tego świadomy, patrz link w pytaniu.
Stephen Kitt
1

8 MB to wirtualny rozmiar stosu. Błąd strony wystąpi, gdy aplikacja będzie próbowała użyć więcej stosu niż jest obecnie fizycznie przydzielone. Program obsługi błędów strony jądra przydzieli następnie stronę fizyczną, a następnie aplikacja będzie kontynuowana.

Zobacz https://unix.stackexchange.com/a/280865/21212 dla pełnego wyjaśnienia.

Dlatego zmniejszenie wielkości stosu nie powinno mieć wpływu na zmniejszenie zużycia pamięci fizycznej przez aplikację.

Colin 't Hart
źródło
1
Powiązałem już tę odpowiedź w swoim pytaniu. Napisałem też, że jestem tego świadomy, ale tak naprawdę to nie odpowiada na pytanie. W każdym razie dzięki
Kiril Kirow
Myślę, że musisz ponownie zapoznać się z przesłankami pytania, a ta (nie) odpowiedź wskazuje, dlaczego. Pamięć wirtualna nie jest pamięcią rzeczywistą. Rozmiar stosu może wynosić 800 MB i nie wpłynie to na faktyczne użycie pamięci, chyba że aplikacja utworzy więcej niż 8 MB ramek stosu.
kbolino