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
linux
osx
virtual-memory
multithreading
stack
Kiril Kirow
źródło
źródło
Odpowiedzi:
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:
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_create
stosuje własne ograniczenia do stosów nowych wątków - w przypadku większości architektur jest to mniej niż 8 MB.źródło
top
pokazuje 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.top
daje o wiele lepszą odpowiedź na „jaka pamięć faktycznie korzysta z tego procesu” niż VIRT.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ę.
źródło