2010-04-28 3 views
10

Является ли сервер по существу фоновым процессом, выполняющим бесконечный цикл, прослушивающий порт? Например:Является ли сервер бесконечным циклом, работающим как фоновый процесс?

while(1){ 
    command = read(127.0.0.1:xxxx); 
    if(command){ 
     execute(command); 
    } 
} 

Когда я говорю сервер, я, очевидно, не имею в виду физический сервер (компьютер). Я имею в виду сервер MySQL, или Apache и т. Д.

Полное раскрытие информации - У меня не было времени протащить какой-либо исходный код. Фактические примеры кода были бы замечательными!

+1

Не далеко fromt он правда ..Но чтение, как правило, представляет собой блокировку, считываемую системой, которая возвращается только тогда, когда у нее есть что-то, что нужно вернуть. Нет полученных данных == нет выполнения. – eaanon01

+0

@ eaanon01 - если (команда) в основном мой способ сказать «если данные получены». – Tony

+1

..why помечен C? –

ответ

6

Это более или менее то, что серверное программное обеспечение обычно делает.

Обычно он становится более сложным, потому что бесконечный цикл «только» принимает соединение, и каждое соединение часто может обрабатывать несколько «команд» (или то, что они вызывают в используемом протоколе), но основная идея примерно такая.

+0

Вы в основном говорите, что мой псевдокод + threading в значительной степени правилен? – Tony

+0

@ Тони: да. Конечно, псевдокод подразумевает, что все еще есть много деталей, чтобы получить право, но это идея. –

+0

Не совсем. Остается _how_. –

2

В вопросе говоря, да. Сервер - это просто то, что «пеет навсегда» и служит. Однако, как правило, вы обнаружите, что «демоны» делают такие вещи, как открытые STDOUT и STDERR для файлов или/dev/null вместе с двойными вилками, среди прочего. В некотором смысле ваш код является очень упрощенным «сервером».

4

Существует три вида «серверов» - разветвление, резьба и однопоточность (без блокировки). Все они, как правило, контур, как вы показываете, разница в том, что происходит, когда есть что-то, что нужно обслуживать.

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

Потоковая служба похожа на службу forking, но вместо всего нового процесса создается новая нить для обслуживания запроса. Как вилки, иногда потоки остаются вокруг, чтобы обрабатывать последующие запросы. Разница в производительности и занимаемой площади - это просто разница между витками и вилками. В зависимости от использования памяти не, обслуживающий клиента (и склонный к изменению), обычно лучше не клонировать все адресное пространство. Единственная дополнительная сложность здесь - синхронизация.

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

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

Небольшой поисковый запрос для не блокирующего HTTP-сервера даст некоторые интересные ручные веб-серверы, написанные как проблемы с кодом гольфа.

Короче говоря, разница в том, что происходит после того, как бесконечный цикл ввода, а не только бесконечный цикл :)

+1

отличное объяснение. – Tony

Смежные вопросы