Wie viel Speicher verbraucht ein Thread beim ersten Erstellen?

8

Ich verstehe, dass das Erstellen zu vieler Threads in einer Anwendung nicht das ist, was Sie als "guter Nachbar" zu anderen laufenden Prozessen bezeichnen könnten, da CPU- und Speicherressourcen verbraucht werden, selbst wenn diese Threads in einem effizienten Schlafzustand sind / p>

Was mich interessiert, ist folgendes: Wie viel Speicher (win32-Plattform) wird von einem schlafenden Thread verbraucht?

Theoretisch würde ich irgendwo im Bereich von 1 MB (da dies die Standard-Stack-Größe ist) annehmen, aber ich bin mir ziemlich sicher, dass es weniger ist, aber ich bin mir nicht sicher warum.

Jede Hilfe hierzu wird geschätzt.

( Der Grund, warum ich frage, ist, dass ich über die Einführung eines Thread-Pools nachdenke, und ich würde gern verstehen, wie viel Speicher ich sparen kann, indem ich einen Pool von fünf Threads im Vergleich zu 20 manuell erstelle erstellte Threads )

    
Alan 01.11.2008, 22:15
quelle

6 Antworten

7

Ich habe eine Serveranwendung mit hohem Thread-Verbrauch, sie verwendet einen konfigurierbaren Thread-Pool, der vom Kunden eingerichtet wird, und in mindestens einer Site hat sie mehr als 1000 Threads und beim Start werden nur 50 MB verwendet . Der Grund dafür ist, dass Windows 1 MB für den Stack reserviert (es bildet seinen Adressraum ab), aber es ist nicht notwendigerweise im physischen Speicher reserviert, nur ein kleinerer Teil davon. Wenn der Stapel mehr wächst, wird ein Seitenfehler generiert und mehr physischer Speicher zugewiesen. Ich weiß nicht, was die anfängliche Zuweisung ist, aber ich würde annehmen, dass es gleich der Seitengranularität des Systems ist (normalerweise 64 KB). Natürlich würde der Thread auch etwas mehr Speicher für andere Dinge verwenden, wenn er erstellt wird (TLS, TSS, usw.), aber meine Schätzung für die Summe würde ungefähr 200 KB betragen. Beachten Sie, dass nicht häufig genutzter Speicher vom virtuellen Speichermanager entladen wird.

    
Fabio Ceconello 01.11.2008, 23:23
quelle
4

Hinzufügen zu Fabios-Kommentaren:

Erinnerung ist deine zweite Sorge, nicht deine erste. Der Zweck eines Threadpools besteht normalerweise darin, den Overhead des Kontextwechsels zwischen Threads einzuschränken, die gleichzeitig ausgeführt werden sollen, idealerweise mit der Anzahl der verfügbaren CPU-Kerne.

Ein Kontextwechsel ist sehr teuer, oft mit ein paar tausend bis mehr als 10.000 CPU-Zyklen.

Ein kleiner Test auf WinXP (32 Bit) tastet etwa 15k private Bytes pro Thread ein (999 Threads erstellt). Dies ist die initial festgelegte Stack-Größe sowie alle anderen vom Betriebssystem verwalteten Daten.

    
peterchen 02.11.2008 09:42
quelle
1

Wenn Sie Vista oder Win2k8 verwenden, verwenden Sie einfach die native Win32-Threadpool-API. Lass es die Dimensionierung herausfinden. Ich würde auch die Partitionierung von Arten von Arbeitslasten in Erwägung ziehen, z. CPU-intensiv vs. Festplatten-I / O in verschiedene Pools.

  

MSDN-Threadpool-API-Dokumente

     

Ссылка

    
stephbu 02.11.2008 07:34
quelle
0

Ich denke, es fällt Ihnen schwer, die Auswirkungen einer solchen Änderung des Arbeitscodes zu erkennen - 20 Threads auf fünf. Und dann noch die zusätzliche Komplexität (und Overhead) der Verwaltung des Thread-Pools. Vielleicht eine Überlegung wert auf einem eingebetteten System, aber Win32?

Und Sie können die Stapelgröße auf das einstellen, was Sie wollen.

    
dkretz 01.11.2008 22:30
quelle
0

Das hängt stark vom System ab:

Aber normalerweise ist jeder Prozess unabhängig. Normalerweise stellt der Systemplaner sicher, dass jeder Prozesse den gleichen Zugriff auf den verfügbaren Prozessor erhält. Somit wird eine Multi-Thread-Anwendungszeit zwischen den verfügbaren Threads gemultiplext.

Speicher, der einem Thread zugewiesen ist, beeinflusst den für die Prozesse verfügbaren Speicher, nicht jedoch den für andere Prozesse verfügbaren Speicher. Ein gutes Betriebssystem wird ungenutzten Stack-Speicherplatz auslagern, so dass es nicht im physischen Speicher ist. Wenn Ihre Threads jedoch während des Live-Betriebs genügend Speicher reservieren, kann dies zu einem Überschwingen führen, da der Speicher jedes Prozessors zum / vom sekundären Gerät ausgelagert wird.

Ich bezweifle, dass ein schlafender Faden einen (sehr geringen) Einfluss auf das System hat.

  • Es verwendet keine CPU
  • Jeder von ihm verwendete Speicher kann auf ein sekundäres Gerät ausgelagert werden.
Martin York 01.11.2008 23:22
quelle
0

Ich denke, das kann ziemlich einfach gemessen werden.

  1. Ermitteln Sie die Menge der vom System verwendeten Ressourcen, bevor Sie einen Thread erstellen
  2. Erstellen Sie einen Thread mit Standardsystemwerten (Standard-Heap-Größe und andere)
  3. Holen Sie sich die Menge an Ressourcen nach dem Erstellen eines Threads und machen Sie den Unterschied (mit Schritt 1).

Beachten Sie, dass einige Threads anders als die Standardwerte angegeben werden müssen.

Sie können versuchen, eine durchschnittliche Speicherbelegung zu finden, indem Sie verschiedene Anzahl von Threads erstellen (Schritt 2).

Der vom Betriebssystem beim Erstellen eines Threads zugewiesene Speicher besteht aus lokalen Thread-Daten: TCB TLS ...

Aus wikipedia : "Threads besitzen keine Ressourcen außer einem Stack, eine Kopie der Register einschließlich der Programmzähler und Thread-lokaler Speicher (falls vorhanden). "

    
INS 02.11.2008 09:02
quelle

Tags und Links