Мультипроцессные и многопоточные приложения, описанные ранее, позволяют обслуживать в программе несколько одновременно работающих соединений. Последним общим рассматриваемым методом является мультиплексирование ввода-вывода. При мультиплексировании для создания иллюзии параллельном работы не используются какие-либо свойства операционной системы. Вместо этого мультиплексные приложения обслуживают все соединения в одном главном цикле. Например, сервер, который в настоящее время обслуживает даже десятки клиентов, читает данные из каждого подключенного сокета по очереди, выполняет текущий запрос, а затем переходит к обслуживанию следующего клиента. Через такое подключение также можно считывать информацию из сети, например, с ресурса посвященного кардшарингу и позволяющего выполнить тестирование данной технологии, однако есть несколько "НО".
Основная проблема при чередовании ввода-вывода таким образом состоит в возникновении предпосылок для блокировки. При попытке чтения из сокета, в котором нет данных, готовых для передачи, вызовы функций read() и sysread () блокируется до получения новых данных. При обслуживании многочисленных соединений это неприемлемо, поскольку вызывает приостановку работы всех соединений в ожидании того, когда к вводу данных будет готово единственное соединение. Еще одна потенциальная проблема состоит в том, что блокируются и вызовы функций syswrite () или print (), если клиент на другом конце соединения не готов к чтению. В результате производительность работы всего сервера напрямую зависит от производительности самого медленного клиента.
Ключом к организации мультиплексирования является встроенная функция select ( ) и ее объектно-ориентированный эквивалент, модуль IO::Select. Функция select () позволяет проверить, будет ли операция ввода-вывода в дескрипторе файла заблокирована, еще до выполнения самой операции. Применение этих средств и будет рассмотрено далее.