Как селекторы реализованы внутри? - PullRequest
11 голосов
/ 29 августа 2011

Я только начал изучать Java NIO, неблокирующий ввод-вывод.Мне интересно знать основы реализации.Как устанавливается связь между селектором Java и физическим сокетом?Есть ли поток уровня операционной системы, который непрерывно опрашивает основной ресурс?И есть ли какой-либо поток Java на каждый селектор, постоянно опрашивающий на получение этих событий?Может кто-нибудь из вас, пожалуйста, укажет мне на это.

Ответы [ 4 ]

5 голосов
/ 29 августа 2011

Нет, смысл select в том, что вам не нужно тратить циклы опроса, когда ничего не происходит.Каждая ОС так или иначе реализует эту возможность (обычно через аппаратные прерывания) и делает ее доступной для программ пользовательского пространства посредством системного вызова select().Связь с языком Java заключается в том, что JVM теперь содержит код, который будет вызывать для вас select ОС, если вы используете правильные классы и методы NIO.Но это потребовало изменений в самом коде JVM, это не то, что вы могли бы сделать исключительно в Java до NIO.

2 голосов
/ 29 августа 2011

Зависит от используемой операционной системы.В Linux в текущей реализации используется механизм ядра epoll .

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

2 голосов
/ 29 августа 2011

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

Однако в * NIX и Windows реализация обычно напрямую зависит от системного вызова select,Этот системный вызов не реализован путем порождения нескольких потоков.

0 голосов
/ 30 августа 2011

Я думаю, что лучше сначала дать вам фотографию (взять из блога другого парня) старый IO и NIO http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_java.nio.00.jpgТакже некоторая информация поступает из этого блога,

  1. Для выбранной реализации, это зависит от ОС.Для epoll / select в * nix ENV вы можете получить дополнительную информацию из network Сетевое программирование Unix》
  2. И для уведомления / пробуждения выбора JVM также использует другую реализацию, такую ​​как TCP / IP в Windows, каналы в* nix.
...