2009-07-10 3 views
2

Im Blocking-Modus wird diese bestimmte Aufgabe in einen "Process Wait" -Zustand versetzt, da ich denke, dass nicht-blockierende Sockets explizit eine "busy-wait" - oder "spin-lock" -Implementierung vom Benutzer erfordern. Oder blockierende Modus-Sockets sind nichts anderes als implizite Implementierungen von busy-wait vom Kernel.Wie funktioniert der Blocking-Modus in Unix/Linux Sockets?

In Mechanismen wie Semaphore/mutexes Sperren/Monitore eine Sperre in der Regel durch Drücken der Aufgabe in blockierten Zustand erreicht. Ich denke, wenn solche Dinge mit Verriegelung möglich sind, dann könnte die Verriegelung auch auf die gleiche Weise erreicht werden.

ich nicht sicher weiß, ich denke, Polling kein effizienter Weg ist, besonders für den Kernel, wie der Kernel immer alle Hände voll mit so vielen Aufgaben hat.

thx.

Antwort

0

Nach dem, was ich lernte von net/Buch/und Antworten zur Verfügung gestellt. Ich werde versuchen, auf den Punkt zu kommen.

Standardmäßig blockieren alle Sockets. Dies bedeutet, dass wenn wir einen Socket-Aufruf absetzen, der nicht sofort abgeschlossen werden kann, unser Prozess in den Ruhezustand versetzt wird und auf die Bedingung wartet. unp - P435

Schlaf geschieht, indem der Prozess im Warte/gesperrten Zustand umgesetzt. Der Scheduler prüft auf die Bedingung, um den Prozess zu entblocken, wenn der blockierte Prozess an der Reihe ist, dh wenn der Scheduler ihm die CPU gibt. Die Reaktionszeit hängt in diesem Fall von der zeitlichen Auflösung des Schedulers ab.

So sind die blockierende Anrufe nicht implizite Umsetzung von „busy wait“ oder „Spin-Lock“ aus dem Kernel.

Ja zugrunde liegende Mechanismus der Verriegelung ist für die meisten Implementierungen der gleichen. Putting Prozess zu blockiert/Wartezustand.

Of-Kurs war Polling nicht effizient, also warum Blockierung nicht implementiert Polling.

8

Nein, blockierende Sockets sind im Kernel implementiert. Der Prozess befindet sich in einem nicht ausgeführten Status und verbraucht keine CPU-Zeit.

Der Kernel ist frei, um andere Aufgaben auszuführen, bis eine Nebentätigkeit verursachen würde es die Aufgabe zu wecken. Zum Beispiel ein Hardware-Interrupt für die Netzwerkkarte, der sie darüber informiert, dass dort Daten zu lesen sind. Der Kernel liest ihn und schiebt ihn durch den Netzwerkstapel, wobei er schließlich die Anwendung zum Verarbeiten der Daten aufweckt.

Timer funktionieren auf die gleiche Weise, aber mit dem Timer-Interrupt.

Der Kernel möglicherweise tatsächlich Polling-Hardware unter der Haube, aber es muss nicht sein ... das ist alles eine Frage, wie die Hardware konzipiert ist.

+0

@Chris - Was ist "beiseite gelegt". Ein Prozess muss in einem der Staaten sein. Mit "beiseite legen" meinst du Wartezustand, aber das was ich in der Frage gefragt habe. Ich selbst habe keine Ahnung, da ich denke, dass das Polling kein effizienter Weg ist, besonders für den Kernel, vor allem dann, wenn der Kernel immer seine Hände voll mit so vielen Aufgaben hat. –

+1

Wenn eine blockierende Socket-Operation blockiert wird, befindet sich der Prozess im Ruhezustand ("S" in der STAT-Spalte von ps). – mark4o

+0

"Durch beiseite legen" Ich denke Chris bedeutet, dass das Betriebssystem es auf die Liste der Prozesse setzen wird, die auf Eingabe warten. Der Prozess wird vom Betriebssystem nicht geweckt, bis es ein Paket empfängt, das an den Port gerichtet ist, der an den Socket gebunden ist, der gerade gelesen wird. – cygil