Среда, 21.08.2019, 17:32
Приветствую Вас, Гость
Главная » 2012 » Август » 28 » Мультиплексированный ввод-вывод
11:14
Мультиплексированный ввод-вывод

В приложениях часто возникает необходимость фиксироваться на нескольких

файловых дескрипторах, жонглируя вводом-выводом между клавиатурой (вход

stdm), взаимодействием процессов и несколькими файлами. Современные основанные

на событиях приложения с графическим интерфейсом пользователя

(graphical user interface, G U I) могут сражаться в своих главных циклах1 буквально

с сотнями ожидающих обработки событий.

Без помощи потоков выполнения, которые фактически обслуживают каждый

дескриптор файла отдельно, один процесс не мог бы разумно справляться с

фиксацией более чем на одном файловом дескрипторе одновременно. Работать

с несколькими дескрипторами просто, если они всегда готовы к операции чтения

или записи. Но как только встречается дескриптор файла, который еще невозможно

использовать, — предположим, выполняется системный вызов read(),

а данных для считывания еще нет, — процесс блокируется и не может обслужить

другие файловые дескрипторы. Блокировка может продолжаться несколько

секунд, делая приложение малопроизводительным и раздражая пользователя.

А если для данного дескриптора файла доступные данные не появляются, то

процесс может заблокироваться навсегда. Так как ввод-вывод для различных

дескрипторов файла зачастую взаимосвязан — вспомните конвейеры, — вполне

возможно, что один файловый дескриптор будет приходить в состояние готовности

только после обслуживания другого. В частности, это может превращаться

в большую проблему для сетевых приложений, которые одновременно открывают

множество сокетов.

Представьте себе блокировку дескриптора файла, связанного с взаимодействием

процессов, пока данные ожидают на входе stdin. Приложение не узнает,

что с клавиатуры уже поступили какие-то данные, пока заблокированный файловый

дескриптор в итоге не вернет данные; но что делать, если заблокированная

операция никогда ничего не возвращает?

Ранее в этой главе мы уже рассмотрели ввод-вывод в режиме без блокировки

как одно из решений этой проблемы. Применяя ввод-вывод без блокировки,

приложения могут создавать запросы ввода-вывода, которые вместо блокировки

будут возвращать особое условие ошибки. Однако это решение неэффективно

по двум причинам
Просмотров: 282 | Добавил: piligrim | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: