2010-04-28 3 views
10

Ist ein Server im Wesentlichen ein Hintergrundprozess, bei dem eine Endlosschleife über einen Port läuft? Zum Beispiel:Ist ein Server eine Endlosschleife, die als Hintergrundprozess ausgeführt wird?

while(1){ 
    command = read(127.0.0.1:xxxx); 
    if(command){ 
     execute(command); 
    } 
} 

Wenn ich Server sage, bezieht ich mich offensichtlich nicht auf einen physischen Server (Computer). Ich beziehe mich auf einen MySQL-Server oder Apache, etc.

Volle Enthüllung - ich hatte keine Zeit, durch irgendeinen Quellcode zu stochern. Aktuelle Codebeispiele wären großartig!

+1

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

+0

@ eaanon01 - wenn (Befehl) ist meine Art zu sagen "wenn Daten empfangen werden." – Tony

+1

..why mit C markiert? –

Antwort

6

Das ist mehr oder weniger was Server-Software im Allgemeinen tut.

Normalerweise wird es komplizierter, weil die Endlosschleife "nur" die Verbindung akzeptiert und jede Verbindung oft mehrere "Befehle" (oder wie auch immer sie im verwendeten Protokoll genannt werden) verarbeiten kann, aber die Grundidee ist ungefähr diese.

+0

sagst du im Grunde, dass mein Pseudo-Code + threading ziemlich korrekt ist? – Tony

+0

@Tony: ja. Natürlich impliziert Pseudo-Code, dass es noch viele Details gibt, um richtig zu werden, aber das ist die Idee. –

+0

Nicht ganz. Was bleibt, ist _how_. –

2

In einer Sache zu sprechen, ja. Ein Server ist einfach etwas, das "für immer loopt" und bedient. In der Regel werden Sie feststellen, dass "Daemons" Dinge wie STDOUT und STDERR unter anderem auf Dateihandles oder/dev/null zusammen mit Doppelgabeln öffnen. Ihr Code ist in gewisser Weise ein sehr vereinfachter "Server".

4

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 :)

+1

großartige Erklärung. – Tony

Verwandte Themen