Netty-4.1.3X NIO与平台相关性

Netty NIO 底层实现

Netty 实现了 Reactor 模型,核心是 Selector;

Netty 的 Selector 底层是基于 JDK 的 Selector 实现的,依赖于 操作系统的 NIO实现;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static SelectorProvider provider() {
synchronized (lock) {
if (provider != null)
return provider;
return AccessController.doPrivileged(
new PrivilegedAction<SelectorProvider>() {
public SelectorProvider run() {
if (loadProviderFromProperty())
return provider;
if (loadProviderAsService())
return provider;
provider = sun.nio.ch.DefaultSelectorProvider.create();
return provider;
}
});
}
}


JDK DefaultSelectorProvider.create()

下载 openjdk-8 的源码

搜索 SelectorProvider 即可发现,不同的操作系统 有不同的 DefaultSelectorProvider 实现:

在mac下

DefaultSelectorProvider 定义 封装:

1
2
3
4
5
6
7
8
9
10
11
12
public class DefaultSelectorProvider {
/**
* Prevent instantiation.
*/
private DefaultSelectorProvider() { }
/**
* Returns the default SelectorProvider.
*/
public static SelectorProvider create() {
return new sun.nio.ch.KQueueSelectorProvider();
}
}

KQueueSelectorProvider 定义 kqueue 实现;

KQueueSelectorImpl 定义 kqueue 的实现逻辑;

KQueueArrayWrapper 真正通过 jni 调用 操作系统实现 kqueue;

在window下

可以看到NIO只有 poll

在 solaris 下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class DefaultSelectorProvider {
/**
* Returns the default SelectorProvider.
*/
public static SelectorProvider create() {
String osname = AccessController
.doPrivileged(new GetPropertyAction("os.name"));
if (osname.equals("SunOS"))
return createProvider("sun.nio.ch.DevPollSelectorProvider");
if (osname.equals("Linux"))
return createProvider("sun.nio.ch.EPollSelectorProvider");
return new sun.nio.ch.PollSelectorProvider();
}
}

可以看到如果 操作系统是 SunOS 下,则调用 DevPollSelectorProvider,否则调用 EPollSelectorProvider, 如果不能确定,默认调用 PollSelectorProvider;

可以看到 EPoll 的实现也是 jni 调用系统实现