2012-01-29 2 views
11

Я читать о каналах в JDK 7 Документов (here), и наткнулся на это:Почему «мультиплексированный, неблокирующий I/O, [..] гораздо более масштабируемый, чем поточно-ориентированный, блокирующий ввод-вывод»?

Мультиплексного, неблокирующий ввод/вывод, который является гораздо более масштабируемым, чем поточно-ориентированным, блокированием ввода/O, [...]

Есть ли объяснение, почему это так?

ответ

3

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

Как правило, неблокирующими решениями являются сложнее,, но они избегают конфликтов ресурсов, что значительно упрощает масштабирование. (Тем не менее, пункт Channel должен сделать это менее сложным.)

+1

Неблокирующий ввод-вывод не означает, что потоки не ждут, это просто означает, что операция ожидания отделена от операции ввода-вывода. –

6

Поскольку стек потоков обычно намного больше, чем структура данных, необходимая для поддержки асинхронного ввода-вывода. Кроме того, планирование тысяч потоков неэффективно.

+3

Это обычный аргумент, но: я могу запускать десятки тысяч потоков на моем настольном компьютере, но я еще не вижу проблемы, где я может фактически обслуживать десятки тысяч подключений с одной машины, без того, чтобы все не было ползти. Так что это кажется слабым аргументом для меня. Кроме того, NIO неблокируется с селекторами [не так уж большой выбор достаточно часто] (http://www.mailinator.com/tymaPaulMultithreaded.pdf) – Voo

+0

@Voo: Некоторые соединения могут отсутствовать в течение десятков минут за раз, но все же открытый. –

+1

@Voo, я сомневаюсь, что у вас есть десятки тысяч Runnable (а не просто холостых) потоков. контекстный переключатель даже дешевый по-прежнему является тайником TLB, который выдает больше промахов в кэше. Работая над тысячами подключений, я бы сказал, что для пользователей с 2 ​​тыс. Пользователей/около 85 тыс. Сообщений в секунду на двухэлементном соке xeon занимает 20% -ный процессор (всего CPUS) ... Кроме того, NIO позволяет «справедливую» доставку трафика, что очень важно и очень часто игнорируется, поскольку это обеспечивает стабильную задержку для клиентов. (Iirc контрольный показатель не измеряет задержку) – bestsss