Как записывается блок в мультиплексировании ввода / вывода? - PullRequest
0 голосов
/ 29 марта 2012

Я учусь писать неблокирующие серверные и клиентские приложения, используя epoll, poll и т. Д., И наткнулся на флаг этого события:

POLLOUT: Запись сейчас не будет блокировать.

Я понимаю концепцию блокировки чтения. Но что блокирует запись?

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

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

2 голосов
/ 29 марта 2012

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

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

...