Java选择器是异步或非阻塞架构。

11

以下是我认为异步和非阻塞I/O最可能的定义:

异步I/O:在异步I/O应用程序中,返回结果立即进行,操作系统会在字节可供处理时通知它们。

非阻塞I/O:这里应用程序立即返回任何可用数据,应用程序应具有轮询机制以查找更多数据何时准备就绪。

了解了这些定义后,如果我们分析Java通道,即SocketChannelServerSocketChannelDatagramSocketChannel,我们可以发现这些通道可以通过方法configureBlocking(boolean block)以阻止或非阻止模式使用。假设我们将它们用作非阻塞模式。那么问题来了:

如果我使用Selector 即将通道注册到selector,它是异步I/O还是非阻塞I/O

我认为只有在底层操作系统通知Java应用程序有关通道选择准备就绪的情况下,这是Java中的异步I/O。否则,它是非阻塞I/O,而selector只是一种帮助我们轮询上述通道的机制,就像我在定义中提到的那样。哪一个是正确的?提前致谢。

编辑:

我已回答了问题的一部分,即I/O类型以及Java如何实现这些功能。

但是一个问题仍然存在,那就是Java提供的所有这些功能都是在Java层模拟还是使用底层操作系统来实现的?假设底层操作系统具有所有这些功能的支持。

请参考答案。

2个回答

17

我想通过做一些更多的功课来回答我的问题。本文还将帮助理解与底层操作系统相关的I/O概念。

  • 这是阻塞 I/O:FileInputStreamFileOutputStream,甚至读取或写入套接字都属于此类别。

  • 这是非阻塞 I/O:Socket 通道使用此类,例如 Java 中的 ServerSocketchannelSocketChannelDatagramChannel

  • 这是复用 I/O:Java 中使用 Selector 来处理多个通道,这些通道在性质上应该是非阻塞的。因此,Socket 通道可以注册到 Selector 并且 Selector 可以利用底层操作系统的 I/O 多路转接功能进行管理。

  • 现在是异步 I/O。在异步 I/O 中,应用程序立即返回,并且操作系统会在可供处理的字节可用时通知它们。Java 中通过 AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel 来实现。

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

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

因此,很明显Java在这些功能中大量使用了底层操作系统。


3
如果我使用Selector,即向选择器注册通道,它是异步I/O还是非阻塞I/O?
通道正在执行非阻塞I/O。选择器本身正在执行多路复用I/O。在Java中,异步I/O是通过Futures完成的,在其他语言中则通过信号量或回调完成。
但仍有一个问题,所有这些功能是由Java模拟在Java层还是使用底层操作系统来实现?假设底层操作系统具有所有这些功能的支持。
操作系统执行此操作。应用程序无法执行,而Java将其归类为操作系统的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接