以下是我认为异步和非阻塞I/O最可能的定义:
异步I/O:
在异步I/O应用程序中,返回结果立即进行,操作系统会在字节可供处理时通知它们。
非阻塞I/O:
这里应用程序立即返回任何可用数据,应用程序应具有轮询机制以查找更多数据何时准备就绪。
了解了这些定义后,如果我们分析Java通道,即SocketChannel
,ServerSocketChannel
,DatagramSocketChannel
,我们可以发现这些通道可以通过方法configureBlocking(boolean block)
以阻止或非阻止模式使用。假设我们将它们用作非阻塞模式。那么问题来了:
如果我使用Selector
即将通道注册到selector
中,它是异步I/O还是非阻塞I/O?
我认为只有在底层操作系统通知Java应用程序有关通道选择准备就绪的情况下,这是Java中的异步I/O。否则,它是非阻塞I/O,而selector
只是一种帮助我们轮询上述通道的机制,就像我在定义中提到的那样。哪一个是正确的?提前致谢。
编辑:
我已回答了问题的一部分,即I/O类型以及Java如何实现这些功能。
但是一个问题仍然存在,那就是Java提供的所有这些功能都是在Java层模拟还是使用底层操作系统来实现的?假设底层操作系统具有所有这些功能的支持。
请参考答案。