我刚刚开始探索java NIO,非阻塞IO。我很想知道实现背后的基本原理。Java选择器和物理套接字之间的通信是如何建立的?是否存在持续轮询底层资源的操作系统级线程?是否每个选择器都有任何Java线程不断轮询以接收这些事件?你们谁能给我指一指这个。
发布于 2011-08-29 19:19:44
不,select
的要点是,当没有发生任何事情时,您不必浪费周期轮询。每个操作系统都以这样或那样的方式(通常通过硬件中断)实现此功能,并通过select()
系统调用将其提供给用户空间程序。与Java语言的联系在于,如果您使用正确的NIO类和方法,则JVM现在包含的代码将为您调用操作系统的select
。但这需要对JVM代码本身进行更改,这不是在NIO之前完全可以在Java中完成的事情。
发布于 2011-08-29 19:19:01
因为文档中没有指定,所以我假设(严格地说)这是依赖于实现的。
然而,在*NIX和Windows中,实现通常直接依赖于select
系统调用。此系统调用不是通过派生多个线程实现的。
发布于 2011-08-29 22:18:00
这取决于所使用的操作系统。在Linux上,当前的实现使用的是内核的epoll机制。
通常,底层内核网络系统正在填充或排空套接字的缓冲区,可能是在它的IRQ处理线程上。因此,您正在等待的是内核告诉您缓冲区已准备好填充(写入)或读取要排出(读取)。
https://stackoverflow.com/questions/7229277
复制相似问题