неблокирующий (управляемый событиями ввод / вывод) против блокирующего ввода / вывода - PullRequest
6 голосов
/ 25 сентября 2010

Недавно я наткнулся на эту симпатичную библиотеку JS под названием nodeJS, которая действует как серверная JS.

Основная особенность языка - Evented I / O, который дает полную способность I / O быть полностью неблокируемой с помощью обратных вызовов !!!

У меня такой вопрос: если этот вид полностью неблокирующего механизма ввода-вывода существовал в прошлом (учитывая, что управляемый событиями ввод-вывод существовал давно), почему он не более популярен в языках высокого уровня? как C # и Java (хотя Java имеет реализацию NIO, которая поддерживает неблокирующий ввод / вывод)?

В настоящее время простая операция чтения / записи файла приводит к полной блокировке ввода / вывода, чего не происходит с управляемым событиями вводом / выводом.

Я бы хотел лучше понять управляемый событиями ввод-вывод и то, как он отличается от того, что мы имеем в Java.

Ответы [ 4 ]

5 голосов
/ 25 сентября 2010

Java: http://en.wikipedia.org/wiki/New_I/O

Мультиплексированное, неблокирующее средство ввода / вывода для записи масштабируемых серверов

.NET: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx

public IAsyncResult BeginReceive(
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    AsyncCallback callback,
    Object state
)
3 голосов
/ 25 сентября 2010

Tcl имел управляемый событиями ввод / вывод с 1990-х (если я не ошибаюсь). Конечно, до 2000 года, потому что когда-то в 2000 году tclhttpd побил Apache в тестах производительности, люди действительно стали обращать внимание на неблокирующий ввод-вывод. Когда люди увидели это, они начали переписывать веб-серверы. Одним из первых результатов этого был Lighttpd: один из первых неблокирующих веб-серверов, написанных на C. В то время использование управляемых событиями ввода-вывода в tcl с помощью команды fileevent уже считалось стандартным. практика в мире tcl.

AOLserver имел (и все еще имеет) ядро ​​tcl, и на нем размещен один из самых загруженных сайтов в Интернете (по крайней мере, в первые дни): http://www.aol.com/. Хотя сам сервер написан на C, он использует API-интерфейс tcl для реализации обработки событий и ввода-вывода. Причина, по которой AOLserver использовал подсистему ввода / вывода tcl, заключается в том, что он использует tcl в качестве языка сценариев, и разработчики подумали, что, поскольку кто-то еще написал его, он может также использовать его.

Я полагаю, что AOLserver был впервые выпущен в 1995 году. Это должно подтвердить, что управляемый событиями ввод-вывод уже был доступен в tcl еще в середине 1990-х годов.

Tcl - один из самых ранних, если не , самый ранний язык , в котором его построил механизм, управляемый событиями. Подсистема событий изначально была реализована для библиотеки Tk, а затем была объединена в сам tcl.

1 голос
/ 25 сентября 2010

Насколько я понимаю, широко распространено восприятие , что многопоточность проще, чем управляемая событиями, поскольку в многопоточном программировании каждый поток имеет простой последовательный поток выполнения, в то время как управляемая событиями состоит из множества маленьких фрагменты кода.

Конечно, это лучше заявить в другом месте, см., Например, Q.2 ЧАСЫ о состоянии * FAQ .

0 голосов
/ 25 сентября 2010

Java плохо поддерживает даже базовый файловый ввод-вывод. Эти языки созданы для быстрого создания портативных приложений с графическим интерфейсом, а не для оптимизированных и зависящих от ОС операций ввода-вывода низкого уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...