В чем разница между управляемым событиями и асинхронным?Между Эполлом и AIO? - PullRequest
40 голосов
/ 01 мая 2011

Управляемые событиями и асинхронные часто используются как синонимы. Есть ли различия между ними?

Кроме того, в чем разница между epoll и aio? Как они сочетаются друг с другом?

Наконец, я много раз читал, что AIO в Linux ужасно сломан. Как именно это сломано?

Спасибо.

Ответы [ 3 ]

22 голосов
/ 01 мая 2011

События - одна из парадигм для достижения асинхронного выполнения. Но не все асинхронные системы используют события. Это о семантическом значении этих двух - один является супер-сущностью другого.

epoll и aio используют разные метафоры:

epoll - это операция блокировки (epoll_wait()) - вы блокируете поток до тех пор, пока не произойдет какое-либо событие, а затем отправляете событие в различные процедуры / функции / ветви в вашем коде.

В AIO вы передаете адрес вашей функции обратного вызова (подпрограмма завершения) системе, и система вызывает вашу функцию, когда что-то происходит.

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

20 голосов
/ 01 мая 2011

Это совершенно разные вещи.

Парадигма, управляемая событиями, означает, что объект, называемый «событием», отправляется в программу всякий раз, когда что-то происходит, без необходимости регулярно опрашивать это «что-то», чтобы выяснить, произошло ли это. Это «событие» может быть захвачено программой для выполнения некоторых действий (т. Е. «Обработчик») - синхронных или асинхронных.

Следовательно, обработка событий может быть синхронной или асинхронной. JavaScript, например, использует синхронную систему обработки событий.

Асинхронный означает, что действия могут происходить независимо от текущего «основного» потока выполнения. Имейте в виду, это означает НЕ означает «параллельный» или «другой поток». «Асинхронное» действие может фактически выполняться в главном потоке, блокируя тем самым «основной» поток выполнения. Так что не путайте «асинхронный» с «многопоточностью».

Вы можете сказать, что, технически говоря, асинхронная операция автоматически предполагает событие - по крайней мере, "завершено", "отказано" или "отменено / отменено" события (одно или несколько из них) отправляются инициатору операции (или самому базовому операционному оператору) сообщить о прекращении операции. Таким образом, асинхронность всегда определяется событиями, но не наоборот.

2 голосов
/ 01 мая 2011

Управляемый событиями - это отдельный поток, в котором события регистрируются для определенного сценария. Когда с этим сценарием сталкиваются, события запускаются. Однако даже в это время каждое из событий происходит последовательно. В этом нет ничего асинхронного. Node.js (веб-сервер) использует события для обработки нескольких запросов.

Асинхронный - это в основном многозадачность. Он может порождать несколько потоков или процессов для выполнения определенной функции. Он полностью отличается от событий в том смысле, что каждый поток независим и практически не взаимодействует с основным потоком. Apache (веб-сервер) использует несколько потоков для обработки входящих запросов.

...