В чем разница между управляемым событиями и асинхронным? Между epoll и AIO?

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

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

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

Спасибо.


person Continuation    schedule 30.04.2011    source источник
comment
Представьте себе потоки, которые допускают асинхронное поведение независимо от использования управляемой событиями архитектуры. Архитектура, управляемая событиями, часто позволяет программе жить в одном контейнере (например, в одном потоке, одном процессе и т. Д., Что может упростить некоторые задачи), но не препятствует выполнению других асинхронных методов в разных контейнерах.   -  person    schedule 01.05.2011


Ответы (4)


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

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

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

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

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

person c-smile    schedule 30.04.2011

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

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

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

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

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

person Stephen Chung    schedule 01.05.2011
comment
Вы говорите: имейте в виду, это НЕ означает параллельный или другой поток. Не могли бы вы объяснить больше на примере. Если событие обрабатывается в основном потоке, как оно не зависит от текущего основного потока выполнения? - person Aravind Yarram; 16.01.2015
comment
Некоторые программные системы реализуют совместные подпрограммы, например, которые позволяют переключаться между потоками выполнения в одном потоке. Однако другие системы могут прерывать текущую операцию при получении события, запускать обработчик, а затем возобновлять выполнение исходного потока внутри одного потока - подумайте о прерываниях. Некоторые системы не поддерживают ни один из них и требуют, чтобы события хранились отдельно, ожидая, пока основной поток завершит свою текущую операцию, а затем явно его загрузит - подумайте о цикле сообщений JavaScript и Windows. - person Stephen Chung; 16.01.2015
comment
Привет, Стивен, я думаю, что Linux Singal Handler - это пример совместной подпрограммы в этом сценарии. Это правильно? - person firo; 04.04.2017

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

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

person neebz    schedule 30.04.2011

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

AIO, выполненный с помощью KAIO / _1 _ / _ 2_, имеет множество предостережений и его сложно использовать, если вы хотите вести себя, а не тихо блокировать (например, работает только с определенными типами fd, при использовании файлов / блочных устройств фактически работает только для прямого ввода-вывода, но это только верхушка айсберга). В конечном итоге он получил возможность указывать на готовность дескриптора файла с ядром 4.19), что является полезно для программ, использующих сокеты.

POSIX AIO в Linux на самом деле является реализацией потоков пользовательского пространства от glibc и имеет свои ограничения (например, считается медленным и плохо масштабируется).

В наши дни (2020 г.) надежда на выполнение произвольного асинхронного ввода-вывода в Linux с меньшими трудностями и компромиссами исходит от io_uring .. .

person Anon    schedule 24.04.2020