Хммм.Вы (оригинальный постер) и другие ответы, я думаю, приходят к этому задом наперед.
Вы, кажется, понимаете управляемую событиями часть, но зацикливаетесь на том, что происходит после того, как событие происходит.
Ключевым моментом, который необходимо понять, является то, что веб-сервер обычно очень тратит мало времени на "обработку" запроса и очень много времени ожидает дискового и сетевого ввода-вывода.
Когда приходит запрос, обычно сервер должен выполнять одну из двух вещей.Либо загрузите файл и отправьте его клиенту, либо передайте запрос другому объекту (классически, CGI-скрипт, в наши дни FastCGI более распространен по очевидным причинам).
В любом случае работа сервераминимально в вычислительном отношении, это просто посредник между клиентом и диском или «что-то еще».
Вот почему эти серверы используют то, что называется неблокирующим I / O.
Точные механизмы варьируются от одной операционной системы к другой, но ключевой момент заключается в том, что запрос на чтение или запись всегда возвращается мгновенно (или достаточно близко).Когда вы пытаетесь записать, например, в сокет, система либо сразу принимает все, что может, в буфер, либо возвращает что-то вроде ошибки EWOULDBLOCK, сообщая, что она не может принять больше данных прямо сейчас.
Как только запись была «принята», программа может записать состояние соединения (например, «5000 из 10000 байт отправлено» или что-то в этом роде) и перейти к следующему соединению, которое готово к действию, возвращаясь кпервый после того, как система готова принять больше данных.
В отличие от обычного блокирующего сокета, где большой запрос на запись может блокироваться на некоторое время, так как ОС пытается отправить данные по сети клиенту.
В некотором смысле это на самом деле не отличается от того, что вы могли бы сделать с многопоточным вводом-выводом, но значительно уменьшило накладные расходы в виде памяти, переключения контекста и общего "домашнего хозяйства", и требуетМаксимальное преимущество от того, что операционные системы делают лучше (или, как предполагается, в любом случае): быстро обрабатывать ввод / вывод.
Как и для несколькихПроцессорные / многоядерные системы, применяются те же принципы.Этот стиль сервера все еще очень эффективен на каждом отдельном процессоре.Вам нужен только тот, который будет разветвляться на несколько экземпляров, чтобы воспользоваться преимуществами дополнительных процессоров.