Как веб-серверы прослушивают новые запросы?
Когда вы узнаете о веб-серверах и о том, как они работают, вам может быть любопытно, постоянно ли они слушают запросы или ждут, пока не получат запрос, чтобы начать действовать. Имея это в виду, в сегодняшнем посте SuperUser Q & A есть ответы, чтобы удовлетворить любопытство читателя..
Сегодняшняя сессия вопросов и ответов пришла к нам благодаря SuperUser - подразделению Stack Exchange, группе веб-сайтов вопросов и ответов, управляемой сообществом..
Снимок экрана любезно предоставлен xmodulo / Linux Screenshots (Flickr).
Вопрос
Читатель SuperUser user2202911 хочет знать, как веб-серверы прослушивают новые запросы:
Я пытаюсь понять детали работы веб-серверов на более глубоком уровне. Я хочу знать, если сервер, скажем, Apache, например, постоянно опрашивает новые запросы или работает ли он какой-то системой прерываний. Если это прерывание, что вызывает прерывание? Это драйвер сетевой карты?
Как веб-сервер прослушивает новые запросы?
Ответ
У автора SuperUser Грега Боузера есть ответ для нас:
Короткий ответ - это какая-то система прерываний. По сути, они используют блокирующий ввод / вывод, то есть они спят (блокируются), ожидая новых данных..
- Сервер создает сокет прослушивания, а затем блокирует при ожидании новых подключений. В течение этого времени ядро помещает процесс в прерываемый сон состояние и запускает другие процессы. Это важный момент; непрерывный опрос процесса будет тратить ресурсы процессора. Ядро может более эффективно использовать системные ресурсы, блокируя процесс до тех пор, пока не будет выполнено работы.
- Когда новые данные поступают в сеть, сетевая карта выдает прерывание.
- Видя, что есть прерывание от сетевой карты, ядро через драйвер сетевой карты считывает новые данные с сетевой карты и сохраняет их в памяти. (Это должно быть сделано быстро и обычно обрабатывается внутри обработчика прерываний.)
- Ядро обрабатывает вновь поступившие данные и связывает их с сокетом. Процесс, который блокирует этот сокет, будет помечен как работоспособный, что означает, что он теперь может быть запущен. Он не обязательно запускается немедленно (ядро может решить запустить другие процессы).
- На досуге ядро разбудит заблокированный процесс веб-сервера. (Так как теперь он работает.)
- Процесс веб-сервера продолжает выполняться, как будто времени не прошло. Его системный вызов блокировки возвращается и обрабатывает любые новые данные. Затем перейдите к шагу 1.
Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полным обсуждением здесь.