Является ли сервер бесконечным циклом, работающим в качестве фонового процесса? - PullRequest
10 голосов
/ 28 апреля 2010

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

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

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

Полное раскрытие - у меня не было времени, чтобы просмотреть любой исходный код. Реальные примеры кода были бы великолепны!

Ответы [ 3 ]

6 голосов
/ 28 апреля 2010

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

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

5 голосов
/ 29 апреля 2010

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

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

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

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

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

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

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

2 голосов
/ 28 апреля 2010

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

...