10

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

Asynchronous I/O:在异步 I/O 应用程序中,应用程序立即返回,操作系统将在字节可用于处理时通知它们。

NON-blocking I/O:在这里,应用程序立即返回可用的数据,并且应用程序应该有轮询机制来找出更多数据何时准备好。

知道了这些定义之后,如果我们分析一下java通道ie ,SocketChannel那么我们可以通过方法发现这些通道可以作为阻塞或非阻塞模式使用。并假设我们将它们用作非阻塞模式。那么问题来了:ServerSocketChannelDatagramSocketChannelconfigureBlocking(boolean block)

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

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

编辑:

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

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

请参考答案。

4

2 回答 2

15

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

  • 这是阻塞 I/O: FileInputStreamFileOutputStream甚至从 Socket 读取或写入都属于此类别

  • 这是非阻塞 I/O:这由Java 中的ServerSocketchannel,SocketChannel​​ ,等 Socket 通道使用DatagramChannel

  • 这是多路复用 I/O:在 Java 中,它用于Selector处理多个通道,这些通道应该是non-blocking天生的。因此 Socket 通道可以注册到底层 OS 的 I/O 多路复用设备并由其管理SelectorSelector

  • 现在是异步 I/O。在异步 I/O 应用程序中,应用程序立即返回,操作系统将在字节可用于处理时通知它们。在 java 中,它由AsynchronousSocketChannel, AsynchronousServerSocketChannel, AsynchronousFileChannel.

对于上述这些功能,java 大量使用底层操作系统。这一点在我浏览这本书时很明显。在第 4 章中,作者提到

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

因此很明显,Java 大量使用底层操作系统来实现这些功能。

于 2013-07-12T21:22:51.087 回答
2

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

通道正在执行非阻塞 I/O。Selector 本身正在执行多路I/O。Java 中的异步 I/O 是通过 Futures 完成的,而在其他语言中则是通过信号量或回调完成的。

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

操作系统做到了。应用程序不能,Java 有资格作为操作系统的应用程序。

于 2013-07-12T16:42:01.737 回答