2012-04-11 3 views
11

Ich habe ein Missverständnis über den Unterschied zwischen Single-Threading und Multi-Threading-Programmierung, also möchte ich eine Antwort auf die folgende Frage, um alles klar zu machen.Missverstehen den Unterschied zwischen Singlethreading und Multi-Threading-Programmierung

Angenommen, es gibt 9 unabhängige Aufgaben, und ich möchte sie mit einem single-threaded-Programm und einem Multi-threaded-Programm erreichen. Grundsätzlich wird es so etwas wie dieses:

eingängig:

- Execute task 1 
- Execute task 2 
- Execute task 3 
- Execute task 4 
- Execute task 5 
- Execute task 6 
- Execute task 7 
- Execute task 8 
- Execute task 9 

Multi-Threaded:

Thread1:

- Execute task 1 
- Execute task 2 
- Execute task 3 

Thread2:

- Execute task 4 
- Execute task 5 
- Execute task 6 

Thread3:

- Execute task 7 
- Execute task 8 
- Execute task 9 

Wie ich verstehe, nur ONE Thread zu einem Zeitpunkt ausgeführt werden (erhalten die CPU), und sobald die Quanten beendet ist, der Scheduler-Thread Gib der CPU Zeit für einen anderen Thread.

Also, welches Programm wird früher fertig sein? Ist es das Multi-Thread-Programm (logisch)? oder ist es das Single-Thread-Programm (da das Multithreading eine Menge Kontextwechsel hat, was einige Zeit in Anspruch nimmt)? und warum? Ich brauche eine gute Erklärung bitte :)

+2

'Welches Programm wird früher beendet? ' Antwort: Es kommt darauf an –

+0

Viele Dinge passieren asynchron, sogar auf einer einzelnen CPU: Speicherabruf, Festplatten-E/A, Netzwerk-E/A ... Kontextwechsel passieren oft während dieser "erzwungenen Timeouts". Wie auch immer, wer hat heute wirklich nur eine CPU? –

+0

Die Frage ist in ihrer jetzigen Form nicht zu beantworten. Sind die Aufgaben voneinander unabhängig oder beruhen sie auf Ergebnissen früherer Aufgaben? Wie viele CPUs/Kerne sind verfügbar? Sind die Aufgaben Prozessorgebunden oder E/A gebunden? Unter idealen Umständen für Parallelität (mehrere CPUs/Kerne, prozessorgebundene, unabhängige Tasks) wäre die Multithread-Version * wahrscheinlich * schneller. Aber vielleicht nicht. – dlev

Antwort

17

Es kommt darauf an.

Wie viele CPUs haben Sie? Wie viel I/O ist in Ihre Aufgaben involviert?

Wenn Sie nur 1 CPU haben und die Tasks keine blockierende E/A haben, dann wird der Singlethread gleich oder schneller enden als Multithread, da es Overhead zum Switching von Threads gibt.

Wenn Sie über 1 CPU verfügen, die Tasks jedoch viele blockierende E/A enthalten, wird möglicherweise eine Beschleunigung durch Verwendung von Threads angezeigt, vorausgesetzt, es kann während der E/A-Vorgänge gearbeitet werden.

Wenn Sie mehrere CPUs haben, sollten Sie eine Beschleunigung der Multithread-Implementierung über den einzelnen Thread feststellen, da mehr als ein Thread parallel ausgeführt werden kann. Es sei denn natürlich die Aufgaben sind I/O dominiert, in welchem ​​Fall der begrenzende Faktor ist Ihre Gerätegeschwindigkeit, nicht CPU-Leistung.

+0

Wenn Sie 1 CPU haben, aber die Tasks eine Menge blockierender E/A beinhalten, wird es eine große Beschleunigung geben, da alle neun Tasks wahrscheinlich eine gewisse CPU bekommen, wenn sie durch die abgeschlossene IO signalisiert werden. –

+1

Und mit cpus meinen Sie wirklich Kerne? Die meisten Computer haben eine einzelne CPU, aber die CPU hat mehrere Kerne. – Guffa

+0

ja [15 Zeichen] – hvgotcodes

6

Wie ich verstehe, nur ein Thread zu einem Zeitpunkt

ausgeführt werden, dass der Fall, wenn die CPU nur einen Kern hatten sein würde. Moderne CPUs haben mehrere Kerne und können mehrere Threads parallel ausführen.

Das Programm, das drei Threads ausführt, würde fast dreimal schneller ausgeführt werden. Selbst wenn die Aufgaben unabhängig sind, gibt es immer noch einige Ressourcen im Computer, die zwischen den Threads gemeinsam genutzt werden müssen, z. B. Speicherzugriff.

2

Nun, das ist nicht völlig sprachunabhängig. Einige interpretierte Programmiersprachen unterstützen keine echten Threads. Das heißt, Ausführungs-Threads können vom Programm definiert werden, aber der Interpreter ist single-threaded, sodass die Ausführung in einem Kern der CPU erfolgt.

Für kompilierte Sprachen und Sprachen, die True Multithreading unterstützen, kann eine einzelne CPU viele Kerne haben. Tatsächlich haben die meisten Desktop-Computer jetzt zwei oder vier Kerne. So kann ein Multithread-Programm, das wirklich unabhängige Tasks ausführt, basierend auf der Anzahl der verfügbaren Kerne in der CPU 2-4 mal schneller abschließen.

+0

Aufgaben sind selten wirklich unabhängig. Nach meiner Erfahrung kommt es häufig vor, dass Ihr Code nicht mehr wie ein einzelner Thread und/oder Core mit der CPU verbunden ist, sondern jetzt wahrscheinlich E/A-gebunden ist. Die Anstrengungen, die Sie in die Nutzung der vier Kerne investieren, werden dann oft größtenteils verschwendet. Diese Lektion wird auf die harte Tour gelernt. –

+1

@ A-B-B, Sie haben Recht. Es ist auch wichtig, sicher zu sein, dass die gleichzeitige Berechnung signifikant komplex genug ist, um den Overhead zu rechtfertigen. Stellen Sie sich jedoch in IO vor, dass es eine IO-intensive Aufgabe gibt. Diese Aufgabe würde immer noch von Multithreading profitieren, da ein Thread computingfähig ist, während ein anderer den Kommunikationsbus verwendet. Schließlich gibt es spezielle Architekturentwürfe, die effizientes paralleles IO ausführen können. –

2

Annahme-Set: Single-Core ohne Hyper-Threading; Aufgaben sind CPU-gebunden; Jede Aufgabe dauert 3 Quanten der Zeit; Jede Scheduler-Zuweisung ist auf 1 Quanten der Zeit beschränkt; FIFO-Scheduler Nonpreemptive; Alle Threads treffen den Scheduler gleichzeitig; Alle Kontextwechsel benötigen die gleiche Zeit;

Processes abgegrenzt sind wie folgt:

  • Test 1: Einzelprozess, einzelnen Thread (enthält alle 9 Aufgaben)
  • Test 2: Einzelprozess, drei Fäden (enthält 3 Aufgaben jeweils)
  • Test 3: drei Prozesse, wobei jeder einzelne mit Gewinde (3 Aufgaben enthalten jeweils)
  • Test 4: drei Prozesse, die jeweils mit drei Fäden (enthalten jeweils eine Task)

Mit den obigen Annahmen werden alle gleichzeitig beendet. Dies liegt daran, dass für die CPU ein identischer Zeitbetrag geplant ist, Kontextschalter sind identisch, es gibt keine Interruptbehandlung, und nichts wartet auf IO.

Für mehr Tiefe in der Natur dieser, finden Sie this book.