Java NIO windows实现

在使用NIO.2 AIOfunction处理项目时,我查看了“旧的”NIO选择器实现,并在Windows上看到使用默认的select-function,由于内部实现不良,因此在Windows上根本无法扩展。 大家都知道,在Windows上IOCP是唯一真正的解决方案。 当然,回调完成模型不适合NIO选择器模型,但这是否有效意味着在Windows上使用NIO基本上不是一个好主意?

例如:新的AIOfunction包括IOCP实现。

在使用支持AIO的最新Netty框架时,尤其如此。 那么Netty在Windows上的速度并不像它那么快?

NIO.2使用IOCP

下面的调用树通过在几个被调用的类名中使用“Iocp”来演示文件i / o,它来自测试平台上的Java 7:NIO.2文件通道 。

另请参见sun.nio.ch.Iocp.java ,“封装I / O完成端口的AsynchronousChannelGroup Windows实现”。

NIO不使用IOCP,因为它只支持“非阻塞i / o”(选择器),而不支持仅与NIO.2一起添加的“异步i / o”(完成处理程序)。

在此处输入图像描述

我认为你更快速地混淆异步。 当然,NIO缓冲区比序列化缓冲区中的相同数据更快,但许多AIO技术会产生成本和延迟,从而为同步IO带来优势。

前段时间有一篇文章对各种IO技术进行了一些非常好的基准测试,结果有点令人惊讶。 Netty人员可能决定与提到的性能更好(阻塞)的IO模型保持一致。

IOCP和Java的问题在于IOCP创建和管理线程。 我的理解是,对于IOCP在Java中工作,事件系统实际上必须通过Windows IOCP线程,然后在Java ThreadPool上安排执行。 这使得在Java和C ++ / C#中实现IOCP非常昂贵。

AIO可能已从Netty中移除,因为没有人愿意为了使用AIO而不是NBIO而牺牲450,000个潜在交易。 AIO和NBIO之间的交易性能差距很大。

Interesting Posts