网络IO-探究poll和epoll在内核层面的不同
代码、资料来自于马士兵MAC课程。
本文通过 strace 命令来监控使用 poll 和 epoll 不同模型的同一代码在内核方法调用上的不同。
阅读本文,你将切实体会到 poll 和 epoll 的不同实现方式。对于两种模型的介绍推荐阅读:网络IO-IO模型的演变。
前置:如何用同一段代码使用 poll 和 epoll 两种不同模型
代码 Selector selector = Selector.open(); 在 poll 和 epoll 模型都支持的情况下优先选择 epoll。
可以通过 JVM 参数 -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider 手动选择 poll 模型。
代码 - SocketMultiplexingSingleThread
1 | public class SocketMultiplexingSingleThread { |
用 strace 追踪两种模型
1 | strace -ff -o poll java -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider SocketMultiplexingSingleThread |
这时在文件架下将会出现以下文件:
1 | -rw-r--r--. 1 root root 13893 6月 3 13:27 epoll.8306 |
我们观察 poll.8293 和 epoll.8307 这两个文件。
poll.8293 的内核方法调用
1 | ServerSocketChannel.open() |
epoll.8307 的内核方法调用
1 | ServerSocketChannel.open() |