Domyślny rozmiar stosu dla pthreads


24

Jak rozumiem, domyślny rozmiar stosu dla pthread w systemie Linux to 16 KB. Otrzymuję dziwne wyniki w mojej 64-bitowej instalacji Ubuntu.

$ ulimit -s
8192

Również:

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("Thread stack size = %d bytes \n", stacksize);

Prints
    Thread stack size = 8388608 bytes

Jestem pewien, że rozmiar stosu to nie „8388608”. Co może być nie tak?


7
Myślę 8388608 / 1024 = 8192.
cuonglm

6
Myślisz o 16 000 na stosy jądra wątku . Całkowicie oddziel problem od pamięci stosu przestrzeni użytkownika. stosy jądra są małe, ponieważ nie można ich stronicować ani leniwie przydzielać i muszą to być ciągłe strony w pamięci fizycznej. elinux.org/Kernel_Small_Stacks . Posiadanie bardzo dużej liczby wszystkich wątków może być problemem dla i386, gdzie przestrzeń adresowa jest ograniczona, szczególnie przy domyślnie stosach 8k dla 32-bitów.
Peter Cordes

Odpowiedzi:


21
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

stacksizeAtrybut określa minimalny rozmiar stosu (w bajtach) przeznaczonego na utworzonej nici stosie.

W twoim przykładzie rozmiar stosu jest ustawiony na 8388608 bajtów, co odpowiada 8 MB, co jest zwracane przez polecenie ulimit -s So to pasuje.

Z pthread_create()opisu:

W systemie Linux / x86-32 domyślny rozmiar stosu dla nowego wątku wynosi 2 megabajty . Zgodnie z implementacją wątków NPTL, jeśli limit zasobów miękkich RLIMIT_STACK w momencie uruchomienia programu ma wartość inną niż „nieograniczona”, określa domyślny rozmiar stosu nowych wątków. Używając pthread_attr_setstacksize (3), atrybut wielkości stosu można jawnie ustawić w argumencie attr użytym do utworzenia wątku, aby uzyskać rozmiar stosu inny niż domyślny.

Tak więc rozmiar stosu wątków można ustawić za pomocą powyższej funkcji set lub ulimitwłaściwości systemowej. W przypadku 16k, o którym mówisz, nie jest jasne, na jakiej platformie to widziałeś i / lub czy został ustawiony jakikolwiek limit systemowy.

Zobacz stronę pthread_create i tutaj kilka interesujących przykładów na ten temat.


47

W rzeczywistości rozmiar stosu wirtualnego wynosi 8388608 bajtów (8 MB). Oczywiście naturalne jest stwierdzenie, że to nie może być prawda, ponieważ jest to absurdalnie duża ilość pamięci dla każdego wątku, który zużywa się na swój stos, gdy 99% czasu to kilka KB to prawdopodobnie wszystko, czego potrzebują.

Dobrą wiadomością jest to, że Twój wątek wykorzystuje tylko tyle pamięci fizycznej , ile faktycznie potrzebuje. Jest to jedna z magicznych mocy, jakie system operacyjny uzyskuje dzięki wykorzystaniu sprzętowej jednostki zarządzania pamięcią (MMU) w procesorze. Oto co się dzieje:

  1. System operacyjny przydziela 8 MB pamięci wirtualnej dla twojego stosu, ustawiając tabele stron MMU dla twojego wątku. Wymaga to bardzo małej ilości pamięci RAM, aby pomieścić tylko wpisy tabeli stron.

  2. Gdy wątek działa i próbuje uzyskać dostęp do wirtualnego adresu na stosie, który nie ma jeszcze przypisanej do niego strony fizycznej, MMU wywołuje wyjątek sprzętowy zwany „błędem strony”.

  3. Rdzeń procesora reaguje na wyjątek błędu strony, przełączając się w uprzywilejowany tryb wykonywania (który ma swój własny stos) i wywołując funkcję obsługi wyjątku błędu strony w jądrze.

  4. Jądro przydziela stronę fizycznej pamięci RAM do tej strony pamięci wirtualnej i wraca do wątku przestrzeni użytkownika.

Wątek przestrzeni użytkownika nie widzi tej pracy. Z jego punktu widzenia po prostu używa stosu tak, jakby pamięć była tam przez cały czas. Tymczasem stos automatycznie rośnie (lub nie rośnie), aby zaspokoić potrzeby wątku.

MMU jest kluczową częścią sprzętu współczesnych systemów komputerowych. W szczególności jest odpowiedzialny za wiele „magii” w systemie, więc bardzo polecam dowiedzieć się więcej o tym, co robi MMU, i ogólnie o pamięci wirtualnej. Ponadto, jeśli twoja aplikacja jest wrażliwa na wydajność i zajmuje się znaczną ilością danych, powinieneś zrozumieć, jak działa TLB (pamięć podręczna tabeli stron MMU) i jak możesz zrestrukturyzować swoje dane lub algorytmy, aby zmaksymalizować współczynnik trafień TLB.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.