Преимущества и недостатки порта завершения ввода / вывода - PullRequest
49 голосов
/ 12 марта 2011

Почему многие говорят, что порт завершения ввода-вывода - это быстрая и удобная модель?
Каковы преимущества и недостатки порта завершения ввода-вывода?

Я хочу знать некоторые моменты, которые делают IOCP быстрее, чем другие модели.

Если вы можете объяснить это, сравнивая другие модели (выберите, epoll, традиционную многопоточность / процесс), было бы лучше.

Ответы [ 3 ]

82 голосов
/ 12 марта 2011

Порты завершения ввода / вывода потрясающие. Нет лучшего слова, чтобы описать их. Если что-то в Windows было сделано правильно, это порты завершения.

Вы можете создать некоторое количество потоков (на самом деле не имеет значения, сколько) и сделать так, чтобы все они блокировались на одном порте завершения до события (того, которое вы публикуете вручную, или события из таймера или асинхронный ввод-вывод, или что-то еще) приходит. Затем порт завершения пробудит один поток для обработки события, до указанного вами предела. Если вы ничего не указали, он будет предполагать «до количества ядер ЦП», что действительно хорошо.

Если уже существует больше активных потоков, чем максимальный предел, он будет ждать, пока один из них не будет завершен, и затем передает событие потоку, как только он перейдет в состояние ожидания. Кроме того, он всегда будет пробуждать потоки в порядке LIFO, поэтому есть вероятность, что кэши все еще горячие.

Другими словами, порты завершения - это беспроблемный "опрос на предмет событий", а также решение "заполнить ЦП как можно больше".

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

Кроме того, порты завершения быстрые, действительно очень быстрые. Давным-давно мне нужно было уведомлять одну ветку от другой. Случилось так, что у этого потока уже был порт завершения для файлового ввода-вывода, но он не перекачивал сообщения. Итак, я подумал, стоит ли мне просто прикусить пулю и использовать порт завершения для простоты, хотя публикация сообщения потока, очевидно, будет гораздо более эффективной. Я не определился, поэтому я сравнил. Сюрпризом оказалось, что завершение портов было примерно в 3 раза быстрее. Так что ... быстрее и гибче, решение было несложным.

12 голосов
/ 12 марта 2011

с помощью IOCP мы можем преодолеть проблему «один поток на клиента». Общеизвестно, что производительность сильно снижается, если программное обеспечение не работает на настоящей многопроцессорной машине. Потоки - это системные ресурсы, которые не являются ни неограниченными, ни дешевыми.

IOCP обеспечивает способ, позволяющий нескольким (работникам ввода-вывода) обрабатывать ввод / вывод нескольких клиентов "справедливо". Потоки приостановлены и не используют циклы ЦП, пока не будет чем заняться.

Также вы можете прочитать информацию в этой хорошей книге http://www.amazon.com/Windows-System-Programming-Johnson-Hart/dp/0321256190

0 голосов
/ 12 марта 2011

Порты завершения ввода / вывода предоставляются O / S как асинхронная операция ввода / вывода, что означает, что это происходит в фоновом режиме (обычно в аппаратном обеспечении). Система не тратит ресурсы (например, потоки), ожидая завершения ввода-вывода. Когда ввод / вывод завершен, аппаратное обеспечение отправляет прерывание на O / S, которое затем активизирует соответствующий процесс / поток для обработки результата. НЕПРАВИЛЬНО: IOCP НЕ требует аппаратной поддержки (см. Комментарии ниже)

Обычно один поток может ожидать большое количество завершений ввода-вывода, занимая при этом очень мало ресурсов, когда ввод-вывод не возвращается.

Другие асинхронные модели, которые не основаны на портах завершения ввода-вывода, обычно используют пул потоков и имеют потоки, ожидающие завершения ввода-вывода, тем самым используя больше системных ресурсов.

Обратная сторона в том, что порты завершения ввода / вывода обычно требуют аппаратной поддержки, и поэтому они обычно не применимы ко всем асинхронным сценариям.

...