gpt4 book ai didi

java - JDK7 NIO.2 是否在 Linux 上使用 Epoll 等?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:25 24 4
gpt4 key购买 nike

我正在研究不同语言的网络 IO API 的架构,并且想了解 Java 中的异步 IO API 是如何在底层实现的。 “旧”流 IO API(1.4 之前)提供同步阻塞读/写功能。 JDK 1.4 NIO API 使用 epoll/select 来测试 IO 准备情况(通过 SelectableChannel 和 Selector 等暴露给用户)。这大概是 Windows 和 *nix 上的情况。这就是 react 器模式。现在,JDK7 引入了 NIO.2 API,除其他外,它提供异步 API(proactor 模式),并使用内部(可配置)线程池在后台执行 IO,并在完成时回调到用户代码。它大概在 Windows 上使用 IOCP,但我想知道:1. 它在 Linux 上有什么用,这是我主要感兴趣的平台。是用epoll之类的,还是用线程池做blocking IO?2. NIO.2 中的实际 IO(不考虑平台)是由 Java 线程池中的用户线程完成的,还是由内核线程完成的,Java 线程池线程只负责复制字节缓冲区并回调用户代码?

最佳答案

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

这是 DefaultSelectorProvider.java 的一部分 source (来自 Java 7):

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 1)都必须使用低级事件通知机制或 Linux AIO API(相对较新),因为您永远不知道机器上的内核是什么您的应用程序运行。如果看到 NIO 2 实际上使用 Linux AIO 或者 POSIX AIO(它们完全不同),我不会感到惊讶。

关于java - JDK7 NIO.2 是否在 Linux 上使用 Epoll 等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33692992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com