Это сервер бесконечный цикл выполняется как фоновый процесс?

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

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

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

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

3 ответов


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

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


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

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

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

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

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

немного googling для неблокирующего http-сервера даст несколько интересных ручных веб-серверов, написанных как проблемы с кодом golf.

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


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