Ein Thread ist "leichtgewichtig", weil der größte Teil des Overheads bereits durch die Erstellung seines Prozesses erledigt wurde.
Das habe ich in einem der Tutorials gefunden.
Kann jemand erläutern, was das genau bedeutet?
Ein Thread ist "leichtgewichtig", weil der größte Teil des Overheads bereits durch die Erstellung seines Prozesses erledigt wurde.
Das habe ich in einem der Tutorials gefunden.
Kann jemand erläutern, was das genau bedeutet?
Die Behauptung, dass Threads "leichtgewichtig" sind, ist - je nach Plattform - nicht unbedingt zuverlässig.
Ein Betriebssystem-Thread muss die Ausführung von nativem Code, z.B. in C geschrieben, unterstützen. Daher muss er einen anständig großen Stack bereitstellen, der normalerweise in Megabyte gemessen wird. Wenn Sie also 1000 Threads starten würden (vielleicht um 1000 gleichzeitige Verbindungen zu Ihrem Server zu unterstützen), hätten Sie einen Speicherbedarf von 1 GB in Ihrem Prozess, bevor Sie überhaupt mit der eigentlichen Arbeit beginnen.
Dies ist ein echtes Problem bei hoch skalierbaren Servern, so dass sie Threads nicht verwenden, als ob sie leichtgewichtig wären. Sie behandeln sie als schwergewichtige Ressourcen. Stattdessen könnte eine begrenzte Anzahl von Threads in einem Pool angelegt werden, die dann Arbeitselemente aus einer Warteschlange abarbeiten.
Da dies bedeutet, dass die Threads langlebig und in geringer Anzahl vorhanden sind, ist es vielleicht besser, stattdessen Prozesse zu verwenden. Auf diese Weise wird der Adressraum isoliert, und es besteht kein Problem, dass die Ressourcen knapp werden.
Zusammenfassend: Seien Sie vorsichtig mit "Marketing"-Behauptungen, die im Namen von Threads gemacht werden. Parallelverarbeitung ist großartig (und wird immer wichtiger), aber Threads sind nur eine Möglichkeit, dies zu erreichen.
Die Prozesserzeugung ist "teuer", weil für den Prozess ein komplett neuer virtueller Speicherbereich mit eigenem Adressraum eingerichtet werden muss. "Teuer" bedeutet, dass es eine Menge CPU-Zeit in Anspruch nimmt.
Threads brauchen das nicht zu tun, sie ändern nur ein paar Zeiger, und das ist viel "billiger" als die Erstellung eines Prozesses. Der Grund, warum Threads dies nicht brauchen, ist, dass sie im Adressraum und virtuellen Speicher des Elternprozesses laufen.
Jeder Prozess muss mindestens einen Thread haben. Wenn Sie also darüber nachdenken, bedeutet das Erstellen eines Prozesses, dass Sie den Prozess UND einen Thread erstellen. Es liegt auf der Hand, dass die Erstellung nur eines Threads weniger Zeit und Arbeit für den Computer bedeutet.
Darüber hinaus sind Threads "leichtgewichtig", da sie ohne Interprozesskommunikation interagieren können. Der Wechsel zwischen Threads ist "billiger" als der Wechsel zwischen Prozessen (auch hier werden nur einige Zeiger verschoben). Und die Kommunikation zwischen Prozessen erfordert eine teurere Kommunikation als Threads.
Threads innerhalb eines Prozesses teilen sich denselben virtuellen Speicherbereich, haben aber jeweils einen eigenen Stack und möglicherweise einen "thread-lokalen Speicher", falls dieser implementiert ist. Sie sind Leichtgewicht weil bei einem Kontextwechsel einfach der Stack-Zeiger und der Programmzähler gewechselt und andere Register wiederhergestellt werden, während bei einem Prozess Bei einem Kontextwechsel wird auch der MMU-Kontext gewechselt.
Außerdem ist die Kommunikation zwischen Threads innerhalb eines Prozesses Leichtgewicht weil sie sich einen Adressraum teilen.
Prozess:
Thema:
Ein Prozess enthält einen oder mehrere Threads, und ein Thread kann alles tun, was ein Prozess tun kann. Außerdem teilen sich Threads innerhalb eines Prozesses denselben Adressraum, wodurch die Kosten für die Kommunikation zwischen Threads gering sind, da sie denselben Codeabschnitt, Datenabschnitt und Betriebssystemressourcen verwenden.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.