Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
чтиво_ч2.doc
Скачиваний:
4
Добавлен:
15.11.2019
Размер:
284.67 Кб
Скачать

Модели ввода / вывода

Я пытался найти подробное описание всех моделей ввода/вывода с целью выбрать оптимальную модель, но не нашел действительно хорошего варианта. Возможно потому, что свойства и понятие (а)синхронизации для каждой модели немного различны. Поэтому я решил привести таблицу всех моделей, чтобы показать разницу между ними. Примечание: в нижеприведенной таблице некоторые названия приведены на английском языке, во избежание нелепых названий на русском языке.

Рисунок 1. Модели ввода/вывода

Первые пять моделей часто используются и довольно удобны в применении. Последние четыре имеют одинаковую модель (перекрытый вход/выход), но разные методы реализации. На практике Вам вряд ли понадобится использовать перекрытые модели (если только Вы не собираетесь писать программу, поддерживающую тысячи соединений). Большинство людей не будут писать подобные программы, но я включил эти модели в таблицу, потому что хорошую информацию о них тяжело найти в сети. Если Вам не интересно знать про перекрытые модели, то Вы можете пропустить значительную (по объему) часть этой главы (начиная с раздела «Введение в перекрытый ввод/вывод» и до конца).

Один из критериев разделения моделей ввода/вывода основан на блокирующем режиме, который использует модель. Как Вы видите из таблицы, единственной моделью, использующей блокирующий режим, являются блокирующие socket’ы (к этой модели можно добавить модель select, но в ней отсутствует явное блокирование и используются оба режима: блокирующий и неблокирующий). Блокирующий режим не применим к перекрытому вводу/выводу, потому что эти операции всегда работают асинхронно.

Другой способ классификации методов – по способу уведомления. Тут, как Вы видите из таблицы, существует три типа: отсутствует - нет никакого уведомления, операция просто терпит неудачу или завершается успешно. на сетевое событие - уведомление посылается в ответ на определенное сетевое событие. Операция терпит неудачу, если не может быть мгновенно завершена. Этот способ уведомления может использоваться для определения удачного времени для повторения попытки операции. при завершении - уведомление отправляется, когда сетевая операция была завершена. Операция либо мгновенно завершается (успешно), либо нет. При таком типе уведомления, Вам сообщат, когда операция закончится, избавляя от необходимости повторить операцию позже. Блокирующий режим не использует уведомлений. Основой процесс программы будет заблокирован до тех пор, пока операция не завершится. WSAAsyncSelect – пример модели, отвечающей на сетевое событие. Это значит, что Вам будет отправлено оконное сообщение, когда произойдет тот или иной сетевой процесс. Способ уведомления при завершении используется исключительно с перекрытыми моделями. Эти модели связаны непосредственно с операциями. Большое различие между уведомлением при завершении и на сетевое событие в том, что уведомление о завершении будет вызвано при завершении определенной операции, в то время как «сетевое событие» может возникнуть в любой момент и по любой причине. Кроме того, перекрытые модели ввода/вывода могут - как видно из названия - перекрываться. Это означает, что многократные запросы ввода/вывода могут образовывать очередь. Далее будут рассмотрены все модели по отдельности. Чтобы более наглядно объяснить каждую модель, я сделал рисунки и использовал приблизительный «диалог» программы и WinSock, чтобы принцип работы модели был более понятен.

Примечание: во многих методах будет рассмотрен вариант, в котором WinSock функция терпит неудачу (посредством WSAEWOULDBLOCK), т.к. это довольно интересный случай.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]