java选择器是异步或非阻塞体系结构

java选择器是异步或非阻塞体系结构,java,asynchronous,io,nio,nonblocking,Java,Asynchronous,Io,Nio,Nonblocking,以下是异步和非阻塞I/O的最可能定义: 异步I/O:异步I/O应用程序中的应用程序立即返回,操作系统将通知它们何时可以处理字节 非阻塞I/O:此处,应用程序立即返回可用数据,并且应用程序应具有轮询机制,以确定何时有更多数据准备就绪 在了解了这些定义后,如果我们分析java通道,即SocketChannel,ServerSocketChannel,DatagramSocketChannel,我们可以发现这些通道可以通过configureBlocking(boolean block)方法用作阻塞或非

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

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

非阻塞I/O:
此处,应用程序立即返回可用数据,并且应用程序应具有轮询机制,以确定何时有更多数据准备就绪

在了解了这些定义后,如果我们分析java通道,即
SocketChannel
ServerSocketChannel
DatagramSocketChannel
,我们可以发现这些通道可以通过
configureBlocking(boolean block)
方法用作阻塞或非阻塞模式。假设我们使用它们作为非阻塞模式。所以问题来了:

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

我觉得这是java中的异步I/O,当且仅当底层操作系统通知java应用程序通道的准备就绪选择时。除此之外,它是非阻塞I/O,
选择器
只是一种机制,可以帮助我们轮询我在定义中提到的上述通道。哪个是正确的?提前谢谢

编辑:

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

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

请参考答案

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

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

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


操作系统做到了这一点。应用程序不能,Java可以作为操作系统的应用程序。

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

  • 这是阻塞I/O:
    FileInputStream
    FileOutputStream
    ,甚至对套接字的读写都属于这一类

  • 这是非阻塞I/O:它由Java中的套接字通道使用,如
    ServerSocketchannel
    SocketChannel
    DatagramChannel

  • 这是多路I/O:在Java中,选择器使用它来处理多个通道,这些通道本质上应该是非阻塞的。因此,套接字通道可以注册到
    选择器
    选择器
    可以通过底层操作系统的I/O多路复用功能进行管理

  • 现在是异步I/O。异步I/O应用程序会立即返回,操作系统会让它们知道字节何时可用于处理。在java中,异步socketchannel,
    异步服务器socketchannel
    异步文件通道
    促进了这一过程

对于上述功能,java大量使用底层操作系统。这一点在我通过考试时就很明显了。在第四章中,作者提到

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

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