Существует три вида «серверов» - разветвление, резьба и однопоточность (без блокировки). Все они, как правило, контур, как вы показываете, разница в том, что происходит, когда есть что-то, что нужно обслуживать.
Услуга разветвления - это только то, что. Для каждого запроса вызывается fork(), создавая новый дочерний процесс, который обрабатывает запрос, а затем выходит (или остается в живых, для обработки последующих запросов, в зависимости от дизайна).
Потоковая служба похожа на службу forking, но вместо всего нового процесса создается новая нить для обслуживания запроса. Как вилки, иногда потоки остаются вокруг, чтобы обрабатывать последующие запросы. Разница в производительности и занимаемой площади - это просто разница между витками и вилками. В зависимости от использования памяти не, обслуживающий клиента (и склонный к изменению), обычно лучше не клонировать все адресное пространство. Единственная дополнительная сложность здесь - синхронизация.
Один процесс (один однопоточный) сервер будет вилка только один раз для демонтизации. Он не будет порождать новые потоки, он не будет порождать дочерние процессы. Он будет продолжать опрос() сокета, чтобы узнать, когда файловый дескриптор готов к приему данных или данные доступны для обработки. Данные для каждого соединения хранятся в своей структуре, идентифицируются различными состояниями (запись, ожидание ACK, чтение, закрытие и т. Д.). Это может быть чрезвычайно эффективный дизайн, если все сделано правильно. Вместо того, чтобы блокировать несколько дочерних элементов или потоков, ожидая выполнения работы, у вас есть один запрос на обработку процесса и событий, когда они готовы.
Есть случаи, когда однопоточные службы порождают несколько потоков, однако дополнительные потоки не работают на обслуживание входящих запросов, можно было бы (например) настроить локальный сокет в потоке, который позволяет администратору получать статус всех подключений.
Небольшой поисковый запрос для не блокирующего HTTP-сервера даст некоторые интересные ручные веб-серверы, написанные как проблемы с кодом гольфа.
Короче говоря, разница в том, что происходит после того, как бесконечный цикл ввода, а не только бесконечный цикл :)
Не далеко fromt он правда ..Но чтение, как правило, представляет собой блокировку, считываемую системой, которая возвращается только тогда, когда у нее есть что-то, что нужно вернуть. Нет полученных данных == нет выполнения. – eaanon01
@ eaanon01 - если (команда) в основном мой способ сказать «если данные получены». – Tony
..why помечен C? –