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