Действительно ли сервер является бесконечным циклом, работающим как фоновый процесс?

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

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

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

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

10
задан Tony 28 April 2010 в 12:53
поделиться

3 ответа

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

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

6
ответ дан 3 December 2019 в 23:48
поделиться

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

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

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

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

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

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

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

5
ответ дан 3 December 2019 в 23:48
поделиться

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

2
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: