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

时间:2013-07-12 12:47:09

标签: java asynchronous io nio nonblocking

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

Asynchronous I/O: 在异步I / O应用程序中立即返回,操作系统会在字节可供处理时让他们知道。

NON-blocking I/O: 此处应用程序立即返回可用数据,应用程序应具有轮询机制,以确定何时准备好更多数据。

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

如果我将使用Selector ,即。将频道注册到selector 是否异步I / O或非阻塞I / O

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

修改

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

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

请参考答案。

2 个答案:

答案 0 :(得分:14)

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

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

  • 这是非阻塞I / O:Java中的ServerSocketchannelSocketChannelDatagramChannel等套接字通道使用此功能

  • 这是多路复用的I / O:在Java中,Selector使用它来处理多个通道,这些通道本质上应该是non-blocking。因此,套接字通道可以注册到SelectorSelector可以通过操作系统底层的I / O多路复用工具进行管理。

  • 现在是异步I / O.在异步I / O应用程序中立即返回,OS将在字节可用于处理时让他们知道。在java中,AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel
  • 为此提供了便利

对于上述这些功能,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有资格作为操作系统的应用程序。