2009-08-06 4 views
36

Когда-то я столкнулся с статьей Introduction to Indy и не мог перестать думать о блокировании и не блокирующем IO с тех пор.Блокировка IO по отношению к неблокирующему IO; ищу хорошие статьи

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

ответ

15

Позитив и негативы довольно ясна:

Blocking - Линейное программирование, проще кода, меньше контроля.
Non-blocking - Параллельное программирование, сложнее кода, больше контроля.

44

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

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

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

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

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

В любом случае, только моя таппантность.

+1

Формы приложений занимают почти 100% времени, если IO блокирует. Пользователям не нравятся графические интерфейсы, которые зависают. –

+7

Ничего не мешает вам запускать отдельную нить, которая выполняет все операции ввода-вывода и блокировки ... – Goz

0

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

Я просил здесь для предложений о том, как выложить асинхронный IO код: tidy code for asynchronous IO

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

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