Ответ 1
Хорошая блокировка ввода-вывода означает, что данный поток не может делать больше ничего, пока ввод-вывод полностью не будет получен (в случае сокетов это ожидание может занять много времени).
Неблокирующая IO означает, что IO-запрос сразу ставится в очередь, и функция возвращается. Фактический ввод-вывод затем обрабатывается ядром.
Для блокировки ввода-вывода вы должны либо согласиться с тем, что будете ждать каждого запроса ввода-вывода, либо вам нужно будет запускать поток для каждого запроса (что очень быстро усложняется).
Для неблокирующих операций ввода-вывода вы можете отправлять несколько запросов, но вам нужно помнить, что данные не будут доступны до некоторого "более позднего" момента. Эта проверка того, что данные действительно поступили, является, вероятно, самой сложной частью.
В 99% приложений вам не нужно заботиться о том, что ваш IO блокируется. Иногда, однако, вам нужна дополнительная производительность, чтобы позволить себе инициировать запрос ввода-вывода, а затем сделать что-то еще, прежде чем вернуться и, надеюсь, обнаружить, что запрос ввода-вывода завершен.
Во всяком случае, просто мое tuppence.
Изменить: Чтобы ответить, как разработать приложение для обработки блокировки ввода-вывода при хорошей производительности, сопрограммы могут быть хорошими.