Es gibt drei Arten von "Servern" - Forking, Threading und Single-Threading (nicht blockierend). Sie alle laufen in der Regel so, wie Sie es zeigen, der Unterschied ist, was passiert, wenn etwas zu warten ist.
Ein Gabelservice ist genau das. Für jede Anforderung wird fork() aufgerufen, um einen neuen untergeordneten Prozess zu erstellen, der die Anforderung verarbeitet und dann je nach Entwurf beendet wird (oder am Leben bleibt, um nachfolgende Anforderungen zu verarbeiten).
Ein Threading-Service ist wie ein Forking-Service, aber anstelle eines ganz neuen Prozesses wird ein neuer -Thread erstellt, um die Anfrage zu bedienen. Wie Gabeln bleiben manchmal Threads, um nachfolgende Anfragen zu bearbeiten. Der Unterschied in Leistung und Footprint ist einfach der Unterschied zwischen Threads und Gabeln. Abhängig von der Speicherbelegung nicht Wartung eines Clients (und anfällig für Änderungen), ist es normalerweise besser, nicht den gesamten Adressraum zu klonen. Die einzige zusätzliche Komplexität ist hier die Synchronisation.
Ein einzelner Prozess (auch single-threaded) -Server wird nur einmal zum Daemonieren verzweigen. Es wird keine neuen Threads erzeugen, es werden keine Child-Prozesse erzeugt. Es wird weiterhin den Socket abfragen(), um herauszufinden, wann der Dateideskriptor bereit ist, Daten zu empfangen, oder ob Daten für die Verarbeitung verfügbar sind. Daten für jede Verbindung werden in einer eigenen Struktur gehalten, die durch verschiedene Zustände (Schreiben, Warten auf ACK, Lesen, Schließen usw.) identifiziert wird. Dies kann ein äußerst effizientes Design sein, wenn es richtig gemacht wird. Anstatt mehrere Kinder oder Threads blockieren zu lassen, während Sie darauf warten, Arbeit zu erledigen, haben Sie einen einzigen Prozess und eine Ereignisschleife, die Anforderungen bearbeiten, sobald sie bereit sind.
Es gibt Fälle, in denen einzelne Thread-Dienste mehrere Threads erzeugen, die zusätzlichen Threads jedoch nicht für die Bearbeitung eingehender Anfragen arbeiten. Beispielsweise könnte man einen lokalen Socket in einem Thread einrichten, der einem Administrator einen Status zuweist aller Verbindungen.
Ein wenig Googeln für nicht blockierende http-Server wird einige interessante Hand Roll-Webserver als Code Golf Herausforderungen geschrieben.
Kurz gesagt, ist der Unterschied, was die Endlosschleife geschieht einmal eingegeben wird, nicht nur die endlose Schleife :)
Nicht weit fromt er die Wahrheit ..Aber das Lesen ist normalerweise ein blockierendes Lesen für das System, das nur zurückkehrt, wenn es etwas zurückzugeben hat. Keine empfangenen Daten == keine Ausführung. – eaanon01
@ eaanon01 - wenn (Befehl) ist meine Art zu sagen "wenn Daten empfangen werden." – Tony
..why mit C markiert? –