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?
c
multithreading
Kamath
źródło
źródło
8388608 / 1024 = 8192
.Odpowiedzi:
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:Tak więc rozmiar stosu wątków można ustawić za pomocą powyższej funkcji set lub
ulimit
wł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.
źródło
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:
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.
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”.
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.
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.
źródło