java Selector是异步或非阻塞体系结构

Try*_*ing 10 java io asynchronous nio nonblocking

对我来说,下面是异步和非阻塞I/O最可能的定义:

Asynchronous I/O: 在异步I/O应用程序中立即返回,OS将在字节可用于处理时让他们知道.

NON-blocking I/O: 这里应用程序立即返回可用的数据和应用程序应该具有轮询机制以找出何时准备好更多数据.

知道这些定义,如果我们分析Java通道即后SocketChannel,ServerSocketChannel,DatagramSocketChannel那么我们可以发现,这些信道可以被用作阻挡或通过该方法非阻塞模式configureBlocking(boolean block).并假设我们将它们用作非阻塞模式.所以这里有问题:

如果我将使用Selector ie寄存器通道来selector确定它是异步I/O还是非阻塞I/O

我觉得这是java中的异步I/O,当且仅当底层操作系统通知java应用程序有关通道的准备选择时.否则它是非阻塞I/O,并且selector正如我在定义中提到的那样,它只是帮助我们轮询上述通道的机制.哪个是对的?提前致谢.

编辑:

我已经回答了问题的一部分,即I/O的类型以及java如何促进这些功能.

但仍有一个问题仍然是java是否提供所有这些功能是在java层模拟还是使用底层操作系统来促进?假设底层操作系统具有对这些功能的所有支持.

请参考答案.

Try*_*ing 15

我想通过做更多的功课回答我的问题.这篇文章还将有助于理解底层操作系统的I/O概念.

  • 这是阻塞I/O: FileInputStream,FileOutputStream甚至阅读,或从插座写这个类别下

  • 这是非阻塞I/O:这是使用像套接字通道ServerSocketchannel,SocketChannel,DatagramChannel在Java中

  • 这是多路复用的I/O:在Java中,它用于Selector处理多个通道,这些通道non-blocking本质上应该是这样.因此Socket通道可以注册到Selector并且Selector可以通过OS下载的I/O多路复用设备进行管理.

  • 现在是异步I/O. 在异步I/O应用程序中立即返回,OS将在字节可用于处理时让他们知道.在Java中被推动AsynchronousSocketChannel,AsynchronousServerSocketChannel,AsynchronousFileChannel.

对于以上这些功能,Java大量使用底层操作系统.当我阅读这本书时,这是显而易见的.在第4章中,作者提到了这一点

真正的准备选择必须由操作系统完成.操作系统执行的最重要功能之一是处理I/O请求并在数据准备就绪时通知进程.因此,将此功能委托给操作系统才有意义.Selector类提供抽象,Java代码可以通过该抽象以可移植的方式从底层操作系统请求准备选择服务.

因此很明显,Java会对这些功能大量使用底层操作系统.