Подтвердить что ты не робот

Какая разница между событиями и асинхронными? Между epoll и AIO?

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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