Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDK7NIO.2是否在Linux上使用Epoll等?_Java_Asynchronous_Nio - Fatal编程技术网

Java JDK7NIO.2是否在Linux上使用Epoll等?

Java JDK7NIO.2是否在Linux上使用Epoll等?,java,asynchronous,nio,Java,Asynchronous,Nio,我正在研究不同语言的网络IO API的体系结构,并询问Java中的异步IO API是如何在底层实现的。“旧”流IO API(1.4之前)提供了同步阻塞读/写功能。JDK1.4NIOAPI使用epoll/select测试IO就绪性(通过SelectableChannel和Selector等向用户公开)。Windows和*nix上可能都是这样。这是反应堆的模式。现在,JDK7引入了NIO.2API,它提供了异步API(proactor模式),并使用内部(可配置)线程池在后台执行IO,完成后回调用户代

我正在研究不同语言的网络IO API的体系结构,并询问Java中的异步IO API是如何在底层实现的。“旧”流IO API(1.4之前)提供了同步阻塞读/写功能。JDK1.4NIOAPI使用epoll/select测试IO就绪性(通过SelectableChannel和Selector等向用户公开)。Windows和*nix上可能都是这样。这是反应堆的模式。现在,JDK7引入了NIO.2API,它提供了异步API(proactor模式),并使用内部(可配置)线程池在后台执行IO,完成后回调用户代码。它可能在Windows上使用IOCP,但我想知道: 1.它在Linux上使用了什么?Linux是我感兴趣的主要平台。它是使用epoll和friends,还是使用threadpool来执行阻塞IO?
2.NIO.2中的实际IO(不考虑平台)是由Java线程池中的用户线程完成的,还是由内核线程完成的,Java线程池线程只负责复制bytebuffers并回调用户代码

如果检测到linux内核>=2.6,则
java.nio.channels.spi.SelectorProvider
将使用epoll

下面是一段
DefaultSelectorProvider.java
(来自Java7):


NIO 2和“原始”NIO 1(我们称之为NIO 1)都必须使用低级事件通知机制或Linux AIO API(相对较新),因为您永远不知道应用程序运行的机器上的内核是什么。看到NIO 2实际使用Linux AIO或POSIX AIO(它们完全不同),我不会感到惊讶。

NIO.2甚至使用SelectorProvider吗?我不太确定的是,NIO.2中的异步实现在底层是否类似于NIO通过Epoll等进行就绪性检查的方式,或者它使用执行阻塞io的线程池模拟异步?“模拟异步”??这里没有“模拟”-每个异步框架都使用抢占式(线程)或协作式多任务(光纤、协同路由、绿色线程)来实现异步处理。据我所知,AsynchronousFileChannel会阻止池上的同步文件读取,所以它不是真正的异步,而是模拟。另一方面,它确实为真正异步的套接字选择:)
public static SelectorProvider create() {
    String osname = AccessController.doPrivileged(
        new GetPropertyAction("os.name"));
    if ("SunOS".equals(osname)) {
        return new sun.nio.ch.DevPollSelectorProvider();
    }

    // use EPollSelectorProvider for Linux kernels >= 2.6
    if ("Linux".equals(osname)) {
        String osversion = AccessController.doPrivileged(
            new GetPropertyAction("os.version"));
        String[] vers = osversion.split("\\.", 0);
        if (vers.length >= 2) {
            try {
                int major = Integer.parseInt(vers[0]);
                int minor = Integer.parseInt(vers[1]);
                if (major > 2 || (major == 2 && minor >= 6)) {
                    return new sun.nio.ch.EPollSelectorProvider();
                }
            } catch (NumberFormatException x) {
                // format not recognized
            }
        }
    }

    return new sun.nio.ch.PollSelectorProvider();
}