2009-08-06 7 views
36

Es war einmal ich stieß auf Introduction to Indy Artikel und kann nicht aufhören zu denken über Blockierung vs nicht-blockierende IO seitdem.Blockieren von IO gegenüber nicht blockierenden IO; Auf der Suche nach guten Artikeln

Auf der Suche nach ein paar gute Artikel beschreiben, was Vor- und Nachteile der Blockierung IO und nicht-blockierende IO und , wie Sie Ihre Anwendung in jedem Fall, um natürliche, leicht zu verstehen und leicht zu pflegen Code zu entwerfen.
Möchten Gesamtbild verstehen ...

Antwort

15

Das Positive und Negative sind ziemlich eindeutig:

Blocking - Lineare Programmierung, einfacher Code, weniger Kontrolle.
Non-Blocking - Parallele Programmierung, schwieriger zu programmieren, mehr Kontrolle.

44

Gut blockierende IO bedeutet, dass ein bestimmter Thread nichts mehr tun kann, bis der IO vollständig empfangen wurde (im Falle von Sockets könnte diese Wartezeit lange dauern).

Nicht blockierende IO bedeutet, dass eine IO-Anfrage sofort in die Warteschlange gestellt wird und die Funktion zurückkehrt. Die tatsächliche IO wird dann zu einem späteren Zeitpunkt vom Kernel verarbeitet.

Zum Blockieren von IO müssen Sie entweder akzeptieren, dass Sie auf jede IO-Anfrage warten, oder Sie müssen einen Thread pro Anfrage auslösen (was sehr schnell sehr kompliziert werden wird).

Für nicht blockierende E/A können Sie mehrere Anfragen senden, aber Sie müssen bedenken, dass die Daten erst zu einem späteren Zeitpunkt verfügbar sind. Diese Überprüfung, dass die Daten tatsächlich angekommen sind, ist wahrscheinlich der komplizierteste Teil.

In 99% der Anwendungen müssen Sie sich nicht darum kümmern, dass Ihre IO-Blöcke blockieren. Manchmal benötigen Sie jedoch die zusätzliche Leistung, dass Sie eine E/A-Anforderung initiieren und dann etwas anderes tun können, bevor Sie zurückkommen und hoffentlich feststellen, dass die E/A-Anforderung abgeschlossen wurde.

Wie auch immer, nur meine tuppence.

+1

Formulare Anwendungen kümmern sich ziemlich 100% der Zeit, wenn IO-Blöcke. Benutzer mögen keine GUIs, die hängen. –

+7

Nichts, was Sie daran hindert, einen separaten Thread auszuführen, der alle IO seriell ausführt und blockiert ... – Goz

0

Ich habe keine guten Artikel gefunden.

Ich habe hier gefragt für Vorschläge, wie async IO-Code legen: tidy code for asynchronous IO

Die Antworten waren eigentlich nicht sehr Erwärmung.

Async IO ist ein Biest, mit dem man sich herumstöbern und debuggen kann, besonders wenn man Edge-Trigger benutzt (z. B. Linux's epoll mit EPOLLET-Flag). Aber was Sie für Code-Komplexität zahlen, gewinnen Sie in Leistung und Skalierbarkeit.