Однопотоковые параллельные серверы (TCP)

Опубликовано в Технологии > Серверные технологии

13.1. Введение

В предыдущих главах было показано, как функционирует большинство параллельных серверов с установлением логического соединения. В них для создания каждого отдельного процесса или потока, обслуживающего соединение, используются средства операционной системы. Это позволяет операционной системе распределять ресурсы процессора между потоками по принципу квантования времени. В настоящей главе рассматривается проект, который является очень интересным, но на первый взгляд неосуществимым; здесь описан сервер, который предоставляет клиентам возможность псевдопараллельного выполнения работы с использованием только одного потока управления1. В начале этой главы рассматриваются основные понятия, относящиеся к данному вопросу. В ней показано, почему такой подход является вполне реализуемым, и при каких условиях он может превзойти по своим характеристикам версию, основанную на использовании нескольких потоков. Затем в ней представлен пример с однопотоковым сервером. В этом примере показан один из способов использования вызовов системы Linux для поддержки сразу нескольких соединений.

13.2. Активизация обработки данных сервером

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

В приложениях клиент/сервер, характеризующихся тем, что затраты на обеспечение ввода/вывода превышают затраты на подготовку ответа на запрос, в сервере может использоваться асинхронный ввод/вывод для организации псевдопараллельной работы клиентов. В основе этого подхода лежит простой принцип: необходимо предусмотреть, чтобы единственный поток выполнения в сервере держал открытыми соединения TCP с несколькими клиентами и обеспечивал обслуживание сервером того соединения, через которое в определенный момент поступают данные. Таким образом, сам факт поступления данных используется для активизации обработки данных сервером.

Чтобы понять, почему такой подход является осуществимым, рассмотрим параллельный сервер службы ECHO, описанный в предыдущей главе. В этом примере для обеспечения параллельного выполнения кода создается отдельный ведомый поток для обслуживания каждого нового соединения. С теоретической точки зрения, в основе организации работы сервера лежит использование механизма квантования времени операционной системы для разделения ресурсов процессора между потоками и, следовательно, между соединениями. Ссылка http://www.protezirovanie-zubov.ru/

Однако на практике в сервере службы ECHO квантование времени применяется редко. Внимательное изучение процесса работы параллельного сервера службы ECHO показывает, что чаще всего для активизации обработки используется сам факт поступления данных. В основе такого решения лежит изучение структуры потоков данных, проходящих по объединенной сети. Данные поступают на сервер в виде пульсирующего трафика, а не устойчивого потока, поскольку базовая объединенная сеть доставляет данные в отдельных пакетах. Неравномерность трафика еще больше возрастает в связи с тем, что клиенты, как правило, отправляют данные в виде крупных блоков, чтобы каждый из сформированных в результате сегментов TCP мог занять всю дейтаграмму IP. На сервере каждый ведомый поток основную часть времени проводит в состоянии, заблокированном в вызове функции read, ожидая поступления следующей порции данных. Сразу после поступления данных происходит возврат управления из функции read, и выполнение ведомого потока возобновляется. Ведомый поток вызывает функцию write для передачи данных обратно клиенту, а затем снова вызывает функцию read для перехода в состояние ожидания поступления следующей порции данных. Процессор сможет выдержать нагрузку по обработке данных, поступающих от многочисленных клиентов, не внося замедления, только в том случае, если он будет способен завершить цикл чтения и записи одного потока до поступления данных для другого ведомого потока.

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

Параллельные серверы, в которых на обработку каждого запроса требуется мало времени, часто выполняют обработку данных последовательно; при этом причиной активизации процесса обработки является сам факт поступления данных. Квантование времени начинает использоваться только с того момента, когда нагрузка становится настолько высокой, что процессор не может обрабатывать запросы последовательно.

Похожие статьи