2009-09-26 7 views

Antwort

9

Blockieren von E/A bedeutet, dass die Programmausführung angehalten wird, während die E/A läuft. Das Programm wartet also, bis die E/A beendet ist und setzt dann die Ausführung fort. In nicht blockierenden E/A kann das Programm während der E/A-Operationen fortgesetzt werden.

+7

... und das über eine benachrichtigt Rückruf, wenn die IO-Operation beendet ist. Dies zwingt Sie, Ihre Programme anders zu gestalten, aber sie werden viel besser funktionieren. –

+0

@ Lex, irgendein Beispiel für blockierende und nicht blockierende Operation? Vielen Dank. – Kalanidhi

+1

@etc_passwd In JS ist es einfach zu verstehen; Ein Aufruf von "alert();" blockiert, da die Ausführung angehalten wird, bis der Benutzer auf "OK" klickt. Ein AJAX-Aufruf ist nicht blockierend. Die Ausführung von wird fortgesetzt, während die HTTP-Anforderung gesendet wird. –

0

sagte einfach .. die nicht blockierende E/A (asynchron) ermöglicht es andere Operationen durchgeführt werden, während es seine Sache tut und blockieren i/o andere Operationen

4

blockieren würde Es ist eine Gleichzeitigkeit Problem. Im Normalfall wird dieses Programm, nachdem ein Betriebssystemkernel eine E/A-Operation von einem Benutzerprogramm empfangen hat, nicht erneut ausgeführt, bis die E/A-Operation abgeschlossen ist. Andere Programme werden in der Regel zwischenzeitlich geplant.

Dies löst viele kleine Probleme. Wie kann beispielsweise ein Programm wissen, wie viele Bytes gelesen wurden, wenn die E/A nicht vollständig ist, wenn die read(2) zurückgibt? Woher weiß es, ob es einen write(2) Puffer wiederverwenden kann, wenn der Vorgang noch läuft, wenn write(2) zurückgibt? Offensichtlich wird eine komplexere Schnittstelle für wirklich asynchrone I/O benötigt.

Letztlich kommt es darauf an:

  1. I/O geschieht synchron in Bezug auf das Programm, durch das Programm zu blockieren, bis E/A abgeschlossen ist
  2. I/O nur durch einen Systemaufruf geplant , und ein Benachrichtigungsmechanismus existiert, um das reale Ergebnis zu kommunizieren
  3. Es gibt einen Kompromiss, bei dem E/A-Operationen einfach fehlschlagen, wenn sie nicht sofort abgeschlossen werden können. Dies ist die häufigere Verwendung von "nicht blockierenden" E/A in der Praxis.

Das ganze Thema ist kompliziert darüber hinaus durch die Anstrengung multithreaded Programme zu planen, wenn I/O denkbar nur einen Thread blockieren könnte, aber das ist eine andere Frage ...