Was sind Threads?

Pfranzy

Kabelverknoter(in)
Ich verstehe jetzt nicht so ganz, was ein Thread ist. Ich habe jetzt schon mehrmals gelesen, dass es wie so ein Art "Warteschlange" ist wo die Befehle "warten". Aber eigentlich dachte ich, dass Threads so Abschnitte eines Befehls sind.
Also was sind jetzt Threads? (vereinfacht)
LG
 
Ja es ist eine Art Warteschlange. Ein Prozessor kann nicht alles Zeitgleich abarbeiten. Darum werden die auszuführenden Befehle auf Threads aufgeteilt (Multithreading) welche dann vom Prozessor je nach Priorität und verfügbarer Rechenkapazität abgearbeitet werden. Das Ziel ist es, dass es keine ungenutzte Rechenkapazität gibt.
 
Ja es ist eine Art Warteschlange. Ein Prozessor kann nicht alles Zeitgleich abarbeiten. Darum werden die auszuführenden Befehle auf Threads aufgeteilt welche dann vom Prozessor je nach Priorität und verfügbarer Rechenkapazität abgearbeitet werden.
Also wird der Befehl quasi auf mehrere Kernen aufgeteilt, damit der Prozess schneller ausgeführt werden kann? Und fals ja, wer legt das denn eigentlich fest? Legt es derjenige fest, der den Code geschrieben hat?
 
Also wird der Befehl quasi auf mehrere Kernen aufgeteilt, damit der Prozess schneller ausgeführt werden kann?
Nein, es wird nur die Befehlabarbeitung eines Kernes optimiert. Wenn es nur einen Thread hat und dieser Thread z.B. auf etwas warten muss ist der komplette Kern blockiert. Wenn du zwei Threads hast wird in der Wartezeit vom ersten Thread der zweite Thread abgearbeitet.

Zu deiner zweiten Frage müsste man wissen welchen Code du meinst. CPU-Befehlssätze, Treiber, Applikationen?

PS: Das Thema ist aber sehr komplex und darum würde vielleicht helfen wenn wir wissen auf was du hinaus willst.
 
Nein, es wird nur die Befehlabarbeitung eines Kernes optimiert. Wenn es nur einen Thread hat und dieser Thread z.B. auf etwas warten muss ist der komplette Kern blockiert. Wenn du zwei Threads hast wird in der Wartezeit vom ersten Thread der zweite Thread abgearbeitet.

Zu deiner zweiten Frage müsste man wissen welchen Code du meinst. CPU-Befehlssätze, Treiber, Applikationen?

PS: Das Thema ist aber sehr komplex und darum würde vielleicht helfen wenn wir wissen auf was du hinaus willst.
Aber in dem Video :
Eingebundener Inhalt
An dieser Stelle findest du externe Inhalte von Youtube. Zum Schutz deiner persönlichen Daten werden externe Einbindungen erst angezeigt, wenn du dies durch Klick auf "Alle externen Inhalte laden" bestätigst: Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit werden personenbezogene Daten an Drittplattformen übermittelt.
Für mehr Informationen besuche die Datenschutz-Seite.
Wird gesagt, dass Threads so Abschnitte eines Befehls sind. Ist das jetzt falsch?
 
Prozesse können mehere Threads haben, die muss ich aber das Programm selber anlegen/anfordern! Das macht das OS nicht von alleine (das weiß ja nicht was gleichzeitg laufen könnte).

@taks
Du meinst das auf HW Ebene in der CPU (HT, SMT sind da die Stichworte), ich glaube das meint der TE nicht.
 
Prozesse können mehere Threads haben, die muss ich aber das Programm selber anlegen/anfordern! Das macht das OS nicht von alleine (das weiß ja nicht was gleichzeitg laufen könnte).

@taks
Du meinst das auf HW Ebene in der CPU (HT, SMT sind da die Stichworte), ich glaube das meint der TE nicht.

Prozesse können mehere Threads haben, die muss ich aber das Programm selber anlegen/anfordern! Das macht das OS nicht von alleine (das weiß ja nicht was gleichzeitg laufen könnte).

@taks
Du meinst das auf HW Ebene in der CPU (HT, SMT sind da die Stichworte), ich glaube das meint der TE nicht.
Also sind Threads so Abschnitte eines Befehls bzw. Prozesses oder nicht? Fals nein, was sind sie dann sonst?
 
Ein SW-Thread, übersetzt Faden, ist ein singulärer Ausführungspfad eines Programmes.
In einem Thread muss (aus OS Sicht) ein Befehl nach dem anderen in der vom Programmierer definierten Reihenfolge abgearbeitet werden damit das Ergebnis am Ende stimmt.
Kann man Dinge gleichzeitig ausführen startet man (der Programmierer) dafür einen zweiten Pfad/Faden/Thread.
Das OS sieht dann ganz viele Anwendungen mit jeweils 1-x SW-Threads und sortiert die auf die vorhandenen CPU(HW)-Threads.

@DOcean Ich kenne das Buch sonst als eher spezifisches Nachschlagewerk, aber der Abschnitt ist tatsächlich eine gute C-Unabhängige Erklärung :daumen:
 
Ein SW-Thread, übersetzt Faden, ist ein singulärer Ausführungspfad eines Programmes.
In einem Thread muss (aus OS Sicht) ein Befehl nach dem anderen in der vom Programmierer definierten Reihenfolge abgearbeitet werden damit das Ergebnis am Ende stimmt.
Kann man Dinge gleichzeitig ausführen startet man (der Programmierer) dafür einen zweiten Pfad/Faden/Thread.
Das OS sieht dann ganz viele Anwendungen mit jeweils 1-x SW-Threads und sortiert die auf die vorhandenen CPU(HW)-Threads.

@DOcean Ich kenne das Buch sonst als eher spezifisches Nachschlagewerk, aber der Abschnitt ist tatsächlich eine gute C-Unabhängige Erklärung :daumen:
Also sind Threads jetzt so einzelne kleinere Befehle (die von den "Haupt-Befehl" "aufgefordert" wurden) die unabhängig von den anderen Threads abgearbeitet werden können? (wie z. B bei Netflix. der eine Thread "kümmert" sich mit den herunterladen der Daten von der Servern und der Andere Thread kümmert sich mit der allgemeinen Kommunikation mit den Server)
 
Dein Befehlsbegriff passt nicht. Ein Befehl ist viel kleiner als ein Thread. Ein Befehl z.B. ist eine einzelne Addition.
Das was du "Befehl" nennst sind Prozesse. Die Unterscheidung Prozess/Thread steht dann im Link von @DOcean prima beschrieben, passt aber grob zu dem was du da formuliert hast.
 
PS: Das Thema ist aber sehr komplex und darum würde vielleicht helfen wenn wir wissen auf was du hinaus willst
Ich Programmiere in letzter Zeit in meiner Freizeit gerne mit Python, C usw. Und bei den tutorials stand meistens das man den Code in Threads
Aufteilen sollte und ich hab mich gefragt, was genau Threads sind ( weil ich zu den Thema Threads mehre Antworten finde)
 
Dann sei dir die C-Bibel von Rheinwerk sehr ans Herz gelegt.
Es gibt auch keine zwei Definitionen von Threads aus SW-Sicht, nur mehrere Gründe sie zu nutzen und mehrere APIs um sie zu erstellen.
 
Dein Befehlsbegriff passt nicht. Ein Befehl ist viel kleiner als ein Thread. Ein Befehl z.B. ist eine einzelne Addition.
Das was du "Befehl" nennst sind Prozesse. Die Unterscheidung Prozess/Thread steht dann im Link von @DOcean prima beschrieben, passt aber grob zu dem was du da formuliert hast.
Also sind jetzt Threads u. A Abschnitte von einem Prozess? (Also ganzzzz Grob und einfach gesehen)
 
Also sind jetzt Threads u. A Abschnitte von einem Prozess? (Also ganzzzz Grob und einfach gesehen)
Siehe Link: ein Thread ist ein "Unterprozess" der (bis zur Synchronisation) unabhängig von anderen Threads läuft so dass etwa beim Warten auf xy nicht der ganze Prozess steht.
Dein Netflix Beispiel ist da durchaus zutreffend.
Entscheidend für den Begriff ist die Parallelität, nicht die Aufgabentrennung (auch wenn sich ersteres oft aus letzterem ergibt).
 
Wikipedia hat eine relativ einfache Definition davon.
Ein Prozess ist deutlich komplexer und besteht häufig aus mehr als nur einem Thread.

Wie tief möchtest du heute in das Thema Betriebssysteme einsteigen? :D


Da du nun auch noch den Kontext zum Prozessor gesucht hast:
Ein Prozessor kann üblicherweise nur einen Thread zur gleichen Zeit bearbeiten. Daher gibt es Multikernprozessoren, bei denen jeder Prozessorkern einen eigenen Thread verarbeitet. Damit kommt man dann schon mal auf mehrere Threads, die wirklich parallel laufen.
Das wurde noch durch Simultaneous Multithreading verbessert: Dabei hat jeder Prozessorkern zwei vollständige Speicher-Stacks, zwischen denen er umschalten kann, wenn ein Thread gerade darauf warten muss, dass irgendwelche weiteren Daten nachgeladen werden.

So kommen die meisten aktuell verfügbaren Prozessoren auf 4-16 parallel ausführbare Threads.
Dass dein Rechner mehrere hundert oder tausend davon offen hat, die scheinbar parallel laufen, liegt nur daran, dass das Betriebssystem versucht möglichst sinnvoll abzuwechseln, woran gerade gearbeitet wird.
 
In vielen Belangen ist ein Thread eher einem eigenen, neuen Prozess ähnlich.
Dein Netflix Beispiel ist da gar nicht so schlecht. Als Beispiel nimmt man häufig ein Programm, dass 20 Webseiten aufrufen soll um deren Inhalt zu scannen.

Ohne Threads/Prozesse wäre der Ablauf des Programms so:
1. Rufe Webseite 1 auf
2. Empfange Daten von Webseite 1
3. Scanne die erhaltenen Inhalte von Webseite 1
4. Rufe Webseite 2 auf
5. Empfange Daten von Webseite 2
6. Scanne die erhaltenen Inhalte von Webseite 2
7. Rufe Webseite 3 auf
...

Hier wird jede Webseite streng sequentiell nacheinander bearbeitet. Da das Aufrufen der Webseite und das Empfangen der Daten nahe zu keine CPU-Arbeit benötigt und obendrein deutlich länger dauert als das Scannen des Inhalts, macht der Prozesser die meiste Zeit gar nichts.


Mit Threads sieht das ganze so aus:
1. Spawne 20 Threads x
-> x.1 Rufe WEbseite x auf
x.2 Empfange Daten von Webseite x
x.3 Scanne Inhalte von Webseite x

Das Programm verlagert die Bearbeitung einer Webseite jeweils in einen eigenen Thread, die gleichzeitig* bearbeitet werden. Damit wird auch die Wartezeit parallelisiert, sprich du musst nicht 20mal warten, sondern nur einmal für alle 20 Seiten gleichzeitig. Dadurch wird das Programm insgesamt nahezu 20mal so schnell ausgeführt wie ohne Threads.

*gleichzeitig gilt hier immer nur in gewissen durch die Hardware vorgegebenen Grenzen. Wirklich gleichzeitig kannst du nur soviele Threads bearbeiten wie die CPU Kerne (+ Hyperthreads) hat. OS+CPU sorgen im obigen Beispiel aber dafür, dass ein Thread der gerade auf eine Antwort wartet "weggeschoben" wird, sodass ein andere Thread stattdessen bearbeitet wird und daher tatsächlich alle 20 Threads nahezu gleichzeitig ausgeführt werden.


Aber nicht jedes Beispiel ist so schön skalierbar wie das obige. Manche Programme lassen sich einfach nicht parallelisieren. Selbst wenn sich einzelne Teilaufgaben unabhängig von anderen Teiulaufgaben erledigen lassen, müssen meist am Ende die Ergebnisse zusammengefügt werden. Es ist daher eine wirkliche Kunst des Programmierens, sein Programm so zu gestalten, dass es nicht einen Thread/Prozess gibt, der alle anderen Threads blockiert, weil diese auf den einen Hauptthread angewiesen sind.
 
Man müßte. um Klarheit herzustellen, ganz von vorn anfangen.

Was ist eine CPU?
Die zentrale Recheneinheit eines Rechners.

Was macht sie?
Sie ruft Daten ab, verarbeitet sie und gibt sie wieder aus.

Wie ist sie aufgebaut?
Eine CPU besteht aus Steuerwerk und Rechenwerk.

Das Steuerwerk steuert den Datenfluß über die Leitungen (BUS).
Bei der Harvard-Architektur heutiger Prozessoren sind die Daten und Befehle im Speicher getrennt:

Das Rechenwerk führt die Operationen aus.
Die kleinste Operation ist ein Befehl in Maschinensprache:

ADD BX, 15
(addw $15, %bx)
Der Wert 15 wird zum Inhalt des Arbeitsregisters BX addiert. Das Flagregister wird entsprechend dem Ergebnis gesetzt.

Pro Takt wurde früher genau ein Befehl ausgeführt.
Der stand in der Befehlspipline:

Die wurde taktgesteuert abgearbeitet.

Später gab es Prozessoren mit mehreren, parallel arbeitenden Pipelines.
So konnte man mehrere Befehle mit einem Takt abarbeiten.
Dabei werden sogar die Befehle in Teilaufgaben zerhackt und auf die verschiedenen Pipilines verteilt.
Danach wird das Ergebins wieder zusammengesetzt.
So etwas nennt man superskalar, da mehr als eine Anweisung/ Anweisungsteil pro Takt abgearbeitet wird

Ein Tread ist dabei einen Folge von Befehlen vor der Bearbeitung.
Ich hab immer gern Teilaufgabe gesagt, das trifft es gut.

Sequentieller Prozeß ist wohl die rechentechnische Bezeichnung.

Der Artikel trifft es schon ganz gut:
 
@wuselsurfer
Alles soweit richtig und gut, aber leider glaube ich für den TE bißchen am Thema vorbei...

Imho, geht es ihm hauptsächlich um die Erklärung was Threads in seiner Programmiersprache bedeuten bzw. was dann passiert...
Da ist das Ganze mit Pipelines und Von-Neumann zwar schön aber für den Einstieg bißchen heftig ;)
 
@taks
Du meinst das auf HW Ebene in der CPU (HT, SMT sind da die Stichworte), ich glaube das meint der TE nicht.
Ja, darum hab ich auch gefragt aus welchem Grund er das wissen will. Da es im Prozessor Unterforum steht bin ich mal auf die Prozessorseite eingegangen :-)

Ich Programmiere in letzter Zeit in meiner Freizeit gerne mit Python, C usw. Und bei den tutorials stand meistens das man den Code in Threads
Aufteilen sollte und ich hab mich gefragt, was genau Threads sind ( weil ich zu den Thema Threads mehre Antworten finde)
Wenn ich dich richtig verstehe suchst du etwas über Parallele Programmierung: https://de.wikipedia.org/wiki/Parallele_Programmierung
 
Zurück