2010-04-30 10 views

Odpowiedz

6

Domyślna wartość to 1 MB dla obu nitek native i CLR. Możesz to zmienić, ale to zwykle zły pomysł.

+1

Zastrzega sobie tylko 1MB. Otrzymuje fizyczne wsparcie, dopóki nie zostanie użyte. Dlaczego mówisz, że to zły pomysł, żeby to zmienić? Stos może zwykle rosnąć poza początkową rezerwę, a jeśli 1 MB jest przesadą dla prostego wątku, to po prostu kroisz swoją przestrzeń adresową. –

+0

Nie powiedziałem, że to zły pomysł. Powiedziałem, że to jest po prostu zły pomysł. Tworzenie gazillionów wątków jest zwykle złym rozwiązaniem problemu, więc zmniejszenie rozmiaru stosu tylko po to, aby stworzyć gazillions of threads jest prawie na pewno pomyłką. Tak, są okoliczności, w których modyfikowanie rozmiaru stosu może przynieść zyski, ale powinno to być wykonywane tylko przez ludzi, którzy naprawdę wiedzą, co robią. Ponadto, nie jestem pewien, co masz na myśli, "Stos zwykle może wyjść poza początkową rezerwę". AFAIK, nie ma API do uprawy stosu. –

+0

@Adrian to powszechne nieporozumienie. [W rzeczywistości CLR ** zobowiązuje ** 1 MB pamięci RAM na wątek dla stosu.] (Http://www.bluebytesoftware.com/blog/PermaLink,guid,733d7537-f982-4886-af62-66bed0f97ab5.aspx) –

1

Narzut pamięci (w RAM) będzie jedną stroną pamięci. Tak więc (w zależności od platformy) będzie to prawdopodobnie 4KB.

Domyślny rozmiar stosu dla obu wynosi 1 MB. Jednak jest to tylko pamięć wirtualna, więc nie ma narzutów RAM, chyba że jest używany.

+0

Nie dotyczy to zarządzanego kodu. CLR zawsze uprzednio zatwierdza stos wątków zarządzanych wątków, więc dla wątków CLR stos jest kosztowany w stosunku do limitu commit. Oczywiście nadal nie jest to pamięć fizyczna, dopóki się jej nie dotknie. – Stewart

+2

To jest to, co napisałem (lub chciałem). Wyjaśniłem odpowiedź, aby wyjaśnić, że opisuje ona obciążenie pamięci RAM. – Foxfire

3

Zobacz blog Marka Russinovicha o jądrze Win32 limits, aby zobaczyć, jak duży jest pojedynczy wątek i ile narzutu jest używane.

Ile zasobów używanych przez wątki .NET może być trudnych do przewidzenia. Zgaduję, niewiele więcej.

+0

@ Christopher: +1 dla linku –

1

Zgodnie z poprzednimi odpowiedziami podstawowe obciążenie wynosi 1 MB na wątek. Nie będę wchodził w różne niuanse - inne odpowiedzi obejmują je.

Dla wątków Microsoft Visual C/C++ masz również narzut na wątek dowolnego obszaru roboczego środowiska wykonawczego C, który jest przydzielany na żądanie (i przechowywany za pomocą wątku lokalnego magazynu TlsAlloc()) do wykonywania pracy, takich jak sprintf(), scanf(), strtol() itp. Nie mam żadnych dokładnych liczb - aby to obliczyć, musisz przeskanować źródło do Microsoft CRT.

Dla innych środowisk wykonawczych C/C++ (gcc/g ++/borland/digital mars) mogą być lub nie być podobne przechowywane dane o wątku, jego szczegóły implementacji.

Nikt z nas nie zna wewnętrznych elementów aparatu .Net Execution Engine, ale prawdopodobnie istnieje tam również pewna ilość danych dotyczących wątków. Będzie ciężko, aby dowiedzieć się, co to za obciążenie.

Powiązane problemy