Алгоритм параллельного сервера без установления логического соединения
Наиболее простой вариант параллельного сервера без установления логического соединения может быть реализован на основе алгоритма 8.3. Ведущий поток сервера принимает входящие запросы (дейтаграммы) и формирует ведомые потоки, возможно в новом процессе, для обработки каждого из них http://www.knapsack-and-bags.ru/
Алгоритм 8.3. Параллельный сервер без установления
- Ведущий поток. Создать сокет и выполнить его привязку к общепринятому адресу предоставляемой службы. Оставить сокет неподключенным.
- Ведущий поток. Вызывать в цикле функцию recvfrom для приема очередного запроса от клиента и создавать новые ведомые потоки (возможно, в новом процессе) для формирования ответа.
- Ведомый поток. Работа потока начинается с получения конкретного запроса от ведущего потока, а также доступа к сокету.
- Ведомый поток. Сформировать ответ согласно прикладному протоколу и отправить его клиенту с использованием функции sendto.
- Ведомый поток. Завершить работу (т.е. работа ведомого потока завершается после обработки одного запроса).
Продумывая проект параллельного сервера, необходимо учитывать, что операция создания нового потока или процесса может оказаться весьма дорогостоящей, хотя общий объем затрат может зависеть от операционной системы и базовой архитектуры. При использовании протокола без установления логического соединения необходимо тщательно взвесить, оправдывают ли затраты, связанные с обеспечением параллельной работы, достигнутое повышение скорости.
Поскольку операция процесса или потока является весьма дорогостоящей, параллельные реализации серверов без установления логического соединения встречаются редко.
Алгоритм параллельного сервера с установлением логического соединения
В прикладных протоколах с установлением логического соединения основным средством связи является соединение. Такие протоколы позволяют клиенту установить соединение с сервером, обменяться данными через это соединение, а затем его закрыть. В большинстве случаев соединение между клиентом и сервером используется для последовательной обработки нескольких запросов, поскольку протокол позволяет клиенту неоднократно отправлять запросы и получать ответы, не разрывая существующее соединение и не создавая новое.
Серверы с установлением логического соединения обеспечивают параллельное использование соединений, а не параллельную обработку отдельных запросов.
В алгоритме 8.4 перечислены этапы работы параллельного сервера, в котором применяется протокол с установлением логического соединения. Ведущий поток сервера принимает входящие запросы на установление соединения и создает ведомые потоки или процессы для выполнения каждого из них. После завершения своей работы ведомый поток закрывает соединение.
Алгоритм 8.4. Параллельный сервер с установлением логического соединения
- Ведущий поток. Создать сокет и выполнить его привязку к общепринятому адресу предоставляемой службы. Оставить сокет неподключенным.
- Ведущий поток. Перевести сокет в пассивный режим, подготовив его для использования сервером.
- Ведущий поток. Вызывать в цикле функцию accept для получения очередного запроса от клиента и создавать новый ведомый поток или процесс для формирования ответа.
- Ведомый поток. Работа потока начинается с получения доступа к соединению, полученному от ведущего потока (т.е. к сокету соединения).
- Ведомый поток. Выполнять обмен данными с клиентом через соединение: принимать запрос (запросы) и передавать ответ (ответы).
- Ведомый поток. Закрыть соединение и завершить работу. Ведомый поток завершает свою работу после обработки всех запросов от одного клиента.
Как и в случае с сервером без установления логического соединения, ведущий поток не вступает непосредственно во взаимодействие с клиентом. Сразу после получения нового запроса на установление соединения ведущий поток создает ведомый поток для поддержки этого соединения. Ведущий поток ждет поступления следующих запросов на установление соединения одновременно с тем, как ведомый поток взаимодействует с клиентом.