我正在研究不同语言的网络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线程池线程只负责复制字节缓冲区并回调用户代码?
发布于 2015-11-13 22:30:15
如果检测到linux内核EPOL2.6,则java.nio.channels.spi.SelectorProvider将使用>=。
下面是DefaultSelectorProvider.java source的一部分(来自Java7):
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 (它们是完全不同的),我不会感到惊讶。
https://stackoverflow.com/questions/33692992
复制相似问题