ISSN 2305-5626. Вестник МГТУ им. Н.Э. Баумана: электронное издание. 2013
1
УДК 004.415.53
Проверка корректности использования
POSIX-сокетов при неблокирующем вводе-выводе
В.В. Казаков
1
, В. А. Крищенко
1
1
МГТУ им. Н.Э. Баумана, Москва, 105005, Россия
Реализация неблокирующего ввода-вывода, необходимого для работы
с несколькими сетевыми соединениям в одном потоке исполнения, до-
статочно трудоемка: ошибки могут привести к блокированию пото-
ка выполнения на неопределенное время. Поставлена задача разра-
ботки и создания программной реализации метода поиска таких
ошибок при тестировании системы. Описан метод, с помощью ко-
торого осуществляется анализ системных вызовов процесса и опре-
деление ошибок при мультиплексировании сетевых соединений на
этапе тестирования. Метод реализован как программный комплекс
для ОС на базе ядра Linux.
E-mail:
Ключевые слова:
сетевые службы, тестирование ПО, мультиплекси-
рование сокетов, ввод-вывод.
Число одновременно поддерживаемых сетевой службой соедине-
ний может достигать нескольких тысяч, что приводит к проявлению
недостатков стратегии, направленной на создание отдельного потока
для каждого соединения. Для организации потока требуется как вы-
деление ресурсов для дескриптора потока в ядре операционной си-
стемы (ОС), так и использование некоторого количества памяти в
пространстве пользователя, в частности для хранения стека потока.
Эффективность работы планировщика задач ОС достаточно резко
снижается, если сетевая служба создает сотни однотипных потоков и
более, из которых одновременно выполняются лишь несколько. При
частом отключении и подключении клиентов играет роль и время,
затрачиваемое на создание и уничтожение потоков. В итоге подход
«одно соединение — один поток» уже при нескольких сотнях сете-
вых соединений приводит к существенно нелинейному снижению
производительности из-за накладных расходов на формирование ра-
бочих потоков [1].
Наиболее распространенным способом преодоления этой про-
блемы является стратегия работы с соединениями, предполагающая
создание нескольких потоков, каждый из которых опрашивает мно-
жество сокетов, считывает из них данные и затем обрабатывает их
[2]. Число таких рабочих потоков обычно фиксировано и может быть
выбрано исходя из числа логических процессоров в системе. В кор-
ректной реализации данной стратегии, называемой мультиплексиро-
ванием сокетов, следует использовать гарантированно неблокирую-
щий ввод-вывод как минимум при чтении и записи данных из
1 2,3,4,5,6,7,8,9,10,11,...15