Управляемая данными активизация обработки в одном потоке

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

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

В основе разработки программы однопотокового, параллельного сервера лежит использование асинхронного ввода/вывода, организованного с помощью примитива select операционной системы. Сервер создает сокет для каждого соединения, которое он должен поддерживать, а затем вызывает функцию select, которая ожидает поступления данных через каждое из них. По существу, функция select может ожидать поступления запросов на выполнение операций ввода/вывода через все возможные сокеты, поэтому она может также одновременно ожидать поступления новых запросов на установление соединения. Этапы работы однопотокового сервера подробно описаны в алгоритме 8.5.

13.4. Схема организации работы однопотокового сервера

На рис. 13.1 показана схема организации работы и состав сокетов однопотокового, параллельного сервера. Для управления обмена данными через все сокеты применяется один поток.

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

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

Для определения того, какие операции (ведущего или ведомого потока) должны быть выполнены для данного дескриптора, в однопотоковом сервере используется сам дескриптор. Если к работе готов дескриптор, соответствующий ведущему сокету, сервер выполняет для него такие же операции, какие выполнил бы ведущий поток: он вызывает функцию accept с этим сокетом для получения нового соединения. Если же к работе готов дескриптор, соответствующий ведомому сокету, сервер выполняет операцию ведомого потока: он вызывает функцию read для получения запроса, а затем отвечает на этот запрос.