以下是异步和非阻塞I / O最可能的定义:
Asynchronous I/O:
在异步I / O应用程序中立即返回,操作系统会在字节可供处理时让他们知道。
NON-blocking I/O:
此处应用程序立即返回可用数据,应用程序应具有轮询机制,以确定何时准备好更多数据。
在了解了这些定义之后,如果我们分析了java频道,即SocketChannel
,ServerSocketChannel
,DatagramSocketChannel
,那么我们可以发现这些频道可以通过该方法用作阻塞或非阻塞模式configureBlocking(boolean block)
。并假设我们将它们用作非阻塞模式。所以问题出现了:
如果我将使用Selector
,即。将频道注册到selector
是否异步I / O或非阻塞I / O ?
我觉得这是java中的异步I / O,当且仅当底层操作系统通知java应用程序有关通道的准备选择时。否则它是非阻塞I / O而selector
只是一种机制,可以帮助我们轮询上面提到的通道,就像我在定义中提到的那样。哪个是对的?提前谢谢。
修改
我已经回答了问题的一部分,即I / O的类型以及java如何促进这些功能。
但仍有一个问题仍然是java是否提供所有这些功能是在java层模拟还是使用底层操作系统来促进?假设底层操作系统具有对这些功能的所有支持。
请参考答案。
答案 0 :(得分:14)
我想通过做更多的功课来回答我的问题。这篇文章还将有助于理解w.r.t.的I / O概念。底层操作系统。
这是阻止I / O:FileInputStream
,FileOutputStream
甚至从Socket读取或写入属于此类别
这是非阻塞I / O:Java中的ServerSocketchannel
,SocketChannel
,DatagramChannel
等套接字通道使用此功能
Selector
使用它来处理多个通道,这些通道本质上应该是non-blocking
。因此,套接字通道可以注册到Selector
,Selector
可以通过操作系统底层的I / O多路复用工具进行管理。
AsynchronousSocketChannel
,AsynchronousServerSocketChannel
,AsynchronousFileChannel
。
对于上述这些功能,java会大量使用底层操作系统。当我通过book时,这是显而易见的。在第4章中,作者提到了
真正的就绪选择必须由操作系统完成。操作系统执行的最重要功能之一是处理I / O请求并在数据准备就绪时通知进程。因此,将此功能委托给操作系统才有意义。 Selector类提供了抽象,通过该抽象,Java代码可以以可移植的方式从底层操作系统请求准备选择服务。
因此很明显,Java会对这些功能大量使用底层操作系统。
答案 1 :(得分:2)
如果我将使用Selector,即将通道注册到选择器,无论是异步I / O还是非阻塞I / O?
频道正在进行非阻塞I / O.选择器本身正在执行多路复用 I / O. Java中的异步I / O通过Futures完成,其他语言通过信号量或回调完成。
但是仍然存在一个问题,即java是否提供了所有这些功能是在java层模拟还是使用底层操作系统来促进?假设底层操作系统完全支持这些功能。
操作系统可以做到。应用程序不能,并且Java有资格作为操作系统的应用程序。