- •Сетевое программирование. Часть 2: Модели ввода-вывода
- •Модели ввода / вывода
- •Блокирующие socket’ы
- •Polling (последовательный опрос)
- •Select (Выбор)
- •Использование потоков
- •Введение в перекрытый ввод/вывод
- •Перекрытый ввод/вывод: блокирование
- •Перекрытый ввод/вывод: polling
- •Перекрытый ввод/вывод: процедуры завершения
- •Перекрытый ввод/вывод: порты завершения
- •Заключение
Перекрытый ввод/вывод: порты завершения
Наконец мы подошли к последней и, возможно, самой эффективной модели ввода/вывода: перекрытый ввод/вывод с портами завершения. Порт завершения – механизм, доступный в NT ядрах ОС (9x не поддерживают их), позволяющий эффективно управлять потоками. В отличие от всех рассмотренных моделей, «порты завершения» обладают собственным управлением потоков. Как Вы могли заметить, все предыдущие иллюстрации представляли собой что-то типа графиков зависимости от времени. Для этой модели я не делал такого графика и диалога программы с WinSock, т.к. это вряд ли поможет прояснить ситуацию. Вместо этого я изобразил образ самого механизма, который хорошо показывает, что происходит:
Идея в следующем: после создания порта завершения socket’ы могут быть связаны с ним. С этой точки зрения, когда операция перекрытого ввода/вывода завершится, соответствующее уведомление отправляется на порт завершения. На порте есть подобные рабочие потоки, которые заблокированы. При прибытии уведомления порт берет один поток из очереди неактивных потоков и делает его активным. Этот поток обрабатывает поступившее завершенное событие и блокируется на порту.
В порту завершения есть определенное ограничение по количеству потоков, но обычно не все из них активны в одно и тоже время, что позволяет сокращать очередь потоков. Создавая подобный порт, Вы можете указывать, сколько потоков будет активными.
В данной модели нет никакой связи между потоком и соединением. Каждый поток может взаимодействовать с событием, пришедшим на порт. Данную модель не просто реализовать, но реализовав, ее Вы сможете работать с тысячами соединений.
Заключение
Я надеюсь, что этот раздел дал Вам хоть какое-то понимание всех моделей сетевого ввода/вывода. Не огорчайтесь, если Вы что-то не поняли. Если Вы всерьез планируете заниматься сетевым программированием, то полное понимание этих моделей (как впрочем и большинство областей С++) придет с опытом.
В следующих частях мы напишем простые программки, а пока что все.