选择器如何在内部实施?

时间:2011-08-29 11:08:30

标签: java nio

我刚刚开始探索java NIO,非阻塞IO。 我很想知道实施背后的基本原理。如何建立Java选择器和物理套接字之间的通信?是否有持续轮询底层资源的操作系统级线程?并且每个选择器是否有连续轮询接收这些事件的java线程?有人可以指点我这个。

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

由于文档中未指定,我认为(严格来说)这取决于实现。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

我认为最好先给你一张照片(从其他人的博客中获取)
old IO and NIO http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_java.nio.00.jpg
还有一些信息来自该博客,

  1. 对于select实现,它取决于操作系统。对于* nix ENV中的epoll / select,您可以从“Unix网络编程”
  2. 获得更多信息
  3. 对于通知/唤醒选择,JVM也使用不同的实现,如Windows上的TCP / IP,* nix上的管道。