Почему "мультиплексированный, неблокирующий I/O, [..] гораздо более масштабируемый, чем поточно-ориентированный, блокирующий ввод-вывод"?
Я читаю о Каналах в документах JDK 7 (здесь) и наткнулся на это:
Мультиплексированный, неблокирующий ввод-вывод, который гораздо более масштабируемый, чем поточно-ориентированный, блокирующий ввод-вывод, [...]
Есть ли простое объяснение, почему это так?
Ответы
Ответ 1
"Блокировка" означает, что потоки должны ждать столько, сколько необходимо для того, чтобы ресурс стал доступным... что означает, что по определению потоки будут сидеть в ожидании ресурсов. Неблокирование позволяет избежать такого рода вещей.
Как правило, неблокирующие решения сложнее, но они избегают конфликтов ресурсов, что значительно упрощает масштабирование. (Тем не менее, точка Channel
заключается в том, чтобы сделать это менее сложным.)
Ответ 2
Поскольку стек потоков обычно намного больше, чем структура данных, необходимая для поддержки асинхронного ввода-вывода. Кроме того, планирование тысяч потоков неэффективно.