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

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

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

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

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

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

4 ответов


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
)

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

AOLserver имел (и до сих пор) у TCL ядра и хостинг один из самых посещаемых сайтов в интернете (по крайней мере в первые дни): http://www.aol.com/. Хотя сам сервер написан на C, он использует на TCL с API, чтобы реализовать обработку событий и я/о. причина AOLserver используется ТСЛ подсистемы ввода/вывода, потому что он использует TCL в качестве скриптового языка, и разработчики подумали, что с кем-то еще написал тогда с таким же успехом можно использовать его.

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

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


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

конечно, это лучше изложить в другом месте, см., например, Q. 2 из состояние-темы FAQ.


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