Wie würden Sie einen einfachen Menschen über das Blockieren von IO und nicht blockierenden IO erklären? Ich habe festgestellt, dass diese Konzepte bei vielen von uns Programmierern nicht klar sind.Was blockiert in einfachen Worten IO und nicht-blockierende IO?
Antwort
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.
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
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:
- I/O geschieht synchron in Bezug auf das Programm, durch das Programm zu blockieren, bis E/A abgeschlossen ist
- I/O nur durch einen Systemaufruf geplant , und ein Benachrichtigungsmechanismus existiert, um das reale Ergebnis zu kommunizieren
- 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 ...
- 1. , was der Unterschied zwischen Speicher gemappt io ist und io io
- 2. Haskell, wie IO IO Monad
- 3. Beinhaltet Socket IO Disk IO?
- 4. Synchronisieren und IO-Datei
- 5. Was passiert mit Win32 IO Completion Port und synchron erscheinendem IO?
- 6. Overlapped IO und ERROR_IO_INCOMPLETE
- 7. STM und ausgehende IO
- 8. Was ist WCF in einfachen Worten?
- 9. Welche IO-Aktivität unterstützt der GHC IO-Manager?
- 10. Winkel-socket-io io ist nicht
- 11. Filter IO [Maybe String] zu IO [String]
- 12. ffmpeg async io?
- 13. Haskell Monade: IO [Double] bis [IO Double]
- 14. Was passiert in binären IO in C?
- 15. oData v4 Was sind Funktionen und Aktionen in einfachen Worten?
- 16. Eine Liste von IO Float zusammenfassen: [IO Float] in Haskell
- 17. Datensatzaktualisierungsfehler in IO Monad?
- 18. IO :: Lambda in Perl
- 19. Kurzschluss UND innerhalb IO Monad
- 20. Memoizing und Wiederholen Monaden IO
- 21. "Lazy IO" in Haskell?
- 22. eckig und sockel io klassenmanipulation
- 23. Round Robin Scheduling und IO
- 24. Konvertiere [IO Int] zu IO [Int] in Haskell?
- 25. Haskell Weg zu [IO String] in IO String
- 26. Datei-IO in CasperJS
- 27. android browser und socket io
- 28. Spring Framework in einfachen Worten
- 29. Was ist der Unterschied zwischen Task und IO in Scalaz?
- 30. String-Manipulation und Datei IO in C++?
... 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. –
@ Lex, irgendein Beispiel für blockierende und nicht blockierende Operation? Vielen Dank. – Kalanidhi
@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. –