首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDK7 NIO.2在Linux上使用Epoll等吗?

JDK7 NIO.2在Linux上使用Epoll等吗?
EN

Stack Overflow用户
提问于 2015-11-13 20:40:20
回答 1查看 3.1K关注 0票数 7

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

EN

回答 1

Stack Overflow用户

发布于 2015-11-13 22:30:15

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

下面是DefaultSelectorProvider.java source的一部分(来自Java7):

代码语言:javascript
复制
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();
}

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33692992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档