2015-05-16 20 views
6

Jeśli dobrze rozumiem, stos dotyczy lokalnych priorytetów i odniesień do obiektów w stercie. Co się stanie, jeśli masz więcej niż jeden wątek?Czy jest miejsce na stos dla każdego wątku?

Czy współużytkują tę samą przestrzeń stosu w tym samym czasie (ale w różnych obszarach), czy też konteksty przełącznika JRE i ładują-usuwają zawartość stosu podczas przełączania wątków?

Czy JRE może przydzielać oddzielne stosy dla każdego wątku?

Odpowiedz

2

Każdy wątek ma własny stos, który zawiera ramkę dla każdej metody wykonywanej w tym wątku, jak widać here w sekcji "Na wątek".

2

Czy JRE może przydzielać oddzielne stosy dla każdego wątku?

Tak. The JVM is specified to do so:

Każdy wątek Java Virtual Machine posiada prywatny Java Virtual Machine stos, utworzonego w tym samym czasie co wątku. Stos wirtualnej maszyny Java przechowuje ramki. [...] Ponieważ stos wirtualnej maszyny Java nigdy nie jest bezpośrednio manipulowany, z wyjątkiem ramek typu "push" i "pop", ramki mogą być przydzielane do sterty.

4

Lub czy JRE przydziela osobne stosy dla każdego wątku?

Konceptualnie tak. (Zobacz na przykład: JVM spec link).

W jaki sposób konceptualizacja specyfikacji jest wdrażana w konkretnej maszynie JVM, jest ... konkretna implementacja. Jednakże rozumiem, że JVM bieżącej generacji (np. Hotspot) przydzielają każdy stos wątków w osobnym bloku pamięci żądanym od systemu operacyjnego; na przykład przy użyciu modelu mmap syscall .

Z pewnością nie ma hurtowego kopiowania zawartości stosu po przełączeniu wątku. Jednak przełączanie kontekstu wątku nie wymaga zapisywania i wczytywania rejestrów oraz (pośrednio) dodatkowego obciążania pamięci podręcznej i wpisów TLB. Może to być znaczące ... i dlatego nadmierne przełączanie kontekstu wątku (np. Spowodowane rywalizacją blokadą lub nadmiernym oczekiwaniem/powiadomieniem) może być szkodliwe dla wydajności.


1 - Pamiętam, że niektóre JVM należą tylko do odczytu stronę „czerwonej strefy” na końcu każdego segmentu stosu. (Oznacza to, że przepełnienie stosu wątków wyzwala błąd pamięci, a JVM nie musi jawnie sprawdzać przepełnienia stosu podczas każdego wywołania metody, co byłoby znaczącym trafieniem wydajności). W każdym razie rozumiem, że "strefa czerwona" "strona wymaga podania stosu wątków za pomocą mmap.

1

Wątki Java są reprezentowane przez obiekty wątków, każdy wątek ma przypisany oddzielny stos wątków służący do przechowywania danych środowiska wykonawczego. Stos wątków ma określony rozmiar (można ustawić za pomocą opcji maszyny wirtualnej java -Xss1m Application).

Jeśli w czasie wykonywania wątek spróbuje zapisać większą liczbę dat niż dozwolony rozmiar stosu, wystąpi błąd przepełnienia stosu.

Powiązane problemy