Java 选择器是如何在内部实现的?
我刚刚开始探索JavaNIO,非阻塞IO。Java 选择器是如何在内部实现的?,java,nio,Java,Nio,我刚刚开始探索JavaNIO,非阻塞IO。 我有兴趣了解实施背后的基本原理。Java选择器和物理套接字之间的通信是如何建立的?是否存在连续轮询底层资源的操作系统级线程?每个选择器是否有java线程连续轮询以接收这些事件?你们谁能给我指一下这个吗 因为文档中没有指定它,所以我假设(严格地说)这取决于实现 但是,在*NIX和Windows中,实现通常直接依赖于select系统调用。此系统调用不是通过生成多个线程来实现的。否,select的要点是,当没有任何事情发生时,您不必浪费周期轮询。每个操作系统
我有兴趣了解实施背后的基本原理。Java选择器和物理套接字之间的通信是如何建立的?是否存在连续轮询底层资源的操作系统级线程?每个选择器是否有java线程连续轮询以接收这些事件?你们谁能给我指一下这个吗 因为文档中没有指定它,所以我假设(严格地说)这取决于实现
但是,在*NIX和Windows中,实现通常直接依赖于
select
系统调用。此系统调用不是通过生成多个线程来实现的。否,select
的要点是,当没有任何事情发生时,您不必浪费周期轮询。每个操作系统都以某种方式(通常通过硬件中断)实现此功能,并通过select()
系统调用将其提供给用户空间程序。与Java语言的联系是,JVM现在包含的代码将调用操作系统的select
,如果您使用正确的NIO类和方法。但这需要对JVM代码本身进行更改,这不是NIO之前完全可以在Java中完成的事情。这取决于所使用的操作系统。在Linux上,当前的实现使用内核的机制
通常,底层内核网络系统正在为套接字填充或耗尽缓冲区,可能是在它的IRQ处理线程上。因此,您等待的是内核告诉您缓冲区已准备就绪,可以填充(写入)或读取(读取) 我认为最好先给你一张照片(从其他人的博客上拍摄)
(来源:)
还有从该博客获得的一些信息
基兰,谢谢你的快速回复。但是,下面这一点违背了我对>>的理解,并通过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事件?