2013-05-23 13 views
7

W procesie systemu Windows istnieje ograniczenie dotyczące używanych wątków naraz. Jeśli tak, to jaka jest maksymalna liczba wątków, które mogą być używane w jednym procesie?Jaka jest maksymalna liczba wątków, które proces może mieć w systemie Windows

+0

próbowałeś https://www.google.de/#q=What+is+the+maximum+number+of+threads+a+process+ Czy + można już mieć + w systemie Windows? –

+0

Przetestowałem to. Moja 64-bitowa wersja Vista nie chce stworzyć więcej niż ~ 7000 wątków, nie potrafi zapamiętać dokładnej liczby. –

+5

To nie jest tylko "prawdziwe pytanie", jest wartościowe. Nie jest od razu oczywiste, że limit nie wynosi 16 lub 32 ani jakiejś niepotrzebnie małej liczby. Co więcej, nie jest to wcale "trudno powiedzieć, o co tu chodzi", ani nie ma niejasności, niejasności itp. Chciałbym, aby ludzie zamykający takie pytania bardziej odnieśli się do wartości, jaką pytania mogą dać innym, że nie dostarczajcie sobie. To pytanie zadawało dokładnie to, co chciałem wiedzieć, a odpowiedzi były bardzo pomocne. Jak inaczej powinniśmy to wiedzieć - przez ESP? Doświadczenie? omatai

Odpowiedz

4

Nie ma ograniczeń, które znam, ale są dwa praktyczne ograniczenia:

  1. przestrzeni wirtualnej na stosach. Na przykład w 32-bitowej przestrzeni wirtualnej procesu wynosi 4 GB, ale tylko około 2G są dostępne do ogólnego użytku. Domyślnie każdy wątek zarezerwuje 1 MB miejsca na stos, więc najwyższą wartością jest 2000 wątków. Oczywiście można zmienić rozmiar stosu i zmniejszyć go, aby zmieściło się więcej wątków (parametr dwStackSize w CreateThread lub opcja /STACK w komendzie linker). Jeśli używasz systemu 64-bitowego, ten limit praktycznie znika.
  2. Narzut menedżera. Po przeczytaniu tysięcy wątków, zaplanowanie ich zajmie prawie 100% czasu procesora, więc i tak są one w większości bezużyteczne. To nie jest twardy limit, tylko twój program będzie wolniejszy i wolniejszy, im więcej wątków utworzysz.
+0

Cóż, zależy od stanu gwintu. 6000 zablokowanych wątków ma zerowy wpływ na działanie mojej maszyny. Ponadto, nie widzę, jak, nawet jeśli nici byłyby gotowe/działające, to miałoby duże znaczenie, gdybym miał 16 wątków lub 1600 - moje rdzenie 4/8 byłyby w obu przypadkach wyczerpane. –

+0

@MartinJames: Ponieważ algorytmy używane przez program planujący jądra decydują, co uruchomić kolejną skalę z rozmiarem tabeli wątków. Bez wątpienia szczegóły różnią się w zależności od wersji systemu Windows, ale pamiętam, że tworzenie 2000 wątków w WinXP odbywało się w trybie 'for (;;) Sleep (1000)', a użycie procesora przekroczyło 80%. – rodrigo

+0

IIRC, struktura wątków readdt jest po prostu uporządkowaną według priorytetów tablicą kolejek wskaźników bloku informacji o wątkach. Jeśli jedna kolejka ma 2000 wpisów, ale są tylko cztery rdzenie, poruszanie się po wątkach w przerwie zegarowej wymaga jedynie popchnięcia "starych" czterech nitek z tyłu i wyskoczenia czterech "nowych" z przodu - nie ma znaczenia jak długo jest kolejka. To nie potrwa długo? –

1

Rzeczywiste ograniczenie zależy od ilości dostępnej pamięci na różne sposoby. Nie ma limitu "nie można mieć więcej niż te wiele" wątków lub procesów w systemie Windows, ale istnieją ograniczenia co do ilości pamięci, z której można korzystać w systemie, a kiedy to się skończy, nie można tworzyć więcej wątki.

Zobacz ten blog przez Mark Russinovichem: http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

Powiązane problemy