Подтвердить что ты не робот

Блокировка ввода-вывода против неблокирующего IO; ищет хорошие статьи

Когда-то я столкнулся с Введение в Indy и не мог перестать думать о блокировании и неблокирующем IO с тех пор.

В поисках хороших статей, описывающих преимущества и недостатки блокировки IO и неблокирующих IO и , как создать приложение в каждом случае, чтобы получить естественный, понятный и простой в обслуживании код.
Хотелось бы понять БОЛЬШУЮ картину...

4b9b3361

Ответ 1

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

Неблокирующая IO означает, что IO-запрос сразу ставится в очередь, и функция возвращается. Фактический ввод-вывод затем обрабатывается ядром.

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

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

В 99% приложений вам не нужно заботиться о том, что ваш IO блокируется. Иногда, однако, вам нужна дополнительная производительность, чтобы позволить себе инициировать запрос ввода-вывода, а затем сделать что-то еще, прежде чем вернуться и, надеюсь, обнаружить, что запрос ввода-вывода завершен.

Во всяком случае, просто мое tuppence.

Изменить: Чтобы ответить, как разработать приложение для обработки блокировки ввода-вывода при хорошей производительности, сопрограммы могут быть хорошими.

Ответ 2

Позитивы и негативы довольно четкие:

Блокировка - Линейное программирование, упрощение кода, меньшее управление.
Неблокирование - Параллельное программирование, сложнее кодировать, больше контролировать.

Ответ 3

Я не нашел хороших статей.

Я задал здесь предложения о том, как выложить асинхронный код ввода-вывода: код для асинхронного ввода-вывода

Ответы на самом деле были не очень теплыми.

Async IO - это зверь, который помогает вам отталкивать голову и отлаживать, особенно если вы используете триггеры (например, epune Linux с флагом EPOLLET). Но это то, за что вы платите за сложность кода, вы выигрываете в производительности и масштабируемости.