Java 选择器是如何在内部实现的?

Java 选择器是如何在内部实现的?,java,nio,Java,Nio,我刚刚开始探索JavaNIO,非阻塞IO。 我有兴趣了解实施背后的基本原理。Java选择器和物理套接字之间的通信是如何建立的?是否存在连续轮询底层资源的操作系统级线程?每个选择器是否有java线程连续轮询以接收这些事件?你们谁能给我指一下这个吗 因为文档中没有指定它,所以我假设(严格地说)这取决于实现 但是,在*NIX和Windows中,实现通常直接依赖于select系统调用。此系统调用不是通过生成多个线程来实现的。否,select的要点是,当没有任何事情发生时,您不必浪费周期轮询。每个操作系统

我刚刚开始探索JavaNIO,非阻塞IO。
我有兴趣了解实施背后的基本原理。Java选择器和物理套接字之间的通信是如何建立的?是否存在连续轮询底层资源的操作系统级线程?每个选择器是否有java线程连续轮询以接收这些事件?你们谁能给我指一下这个吗

因为文档中没有指定它,所以我假设(严格地说)这取决于实现


但是,在*NIX和Windows中,实现通常直接依赖于
select
系统调用。此系统调用不是通过生成多个线程来实现的。

否,
select
的要点是,当没有任何事情发生时,您不必浪费周期轮询。每个操作系统都以某种方式(通常通过硬件中断)实现此功能,并通过
select()
系统调用将其提供给用户空间程序。与Java语言的联系是,JVM现在包含的代码将调用操作系统的
select
,如果您使用正确的NIO类和方法。但这需要对JVM代码本身进行更改,这不是NIO之前完全可以在Java中完成的事情。

这取决于所使用的操作系统。在Linux上,当前的实现使用内核的机制


通常,底层内核网络系统正在为套接字填充或耗尽缓冲区,可能是在它的IRQ处理线程上。因此,您等待的是内核告诉您缓冲区已准备就绪,可以填充(写入)或读取(读取)

我认为最好先给你一张照片(从其他人的博客上拍摄)

(来源:)


还有从该博客获得的一些信息

  • 对于select实现,它取决于操作系统。对于*nix ENV中的epoll/select,您可以从《Unix网络编程》中获得更多信息
  • 对于通知/唤醒select,JVM也使用不同的实现,比如windows上的TCP/IP,*nix上的管道

  • 基兰,谢谢你的快速回复。但是,下面这一点违背了我对>>的理解,并通过select()系统调用No使用户空间程序可以使用它,当您使用NIO select时,如本例(www.exampledepot.com/egs/java.NIO/NbClient.html),JVM在解释NIO
    select
    的字节码时调用
    select
    。这意味着调用线程将被挂起,直到有答案可用为止-没有分配任何新线程。aioobe,即使我们假设操作系统正在使用某种硬件中断和设置,取消标志来表示事件,难道不应该有java线程持续监视这些标志并抛出事件吗,选择是阻塞呼叫对吗?执行select的线程将在一个select系统调用中结束,该调用在中断之前不会返回,因此没有“持续监视标志”的java线程。您能给博客添加一个参考链接吗?以及java是如何被epoll事件中断的?Java如何中断您自己的代码以通知接收到tje事件?