如何仅使用用户区内存进行传输来实现NIO通道?

时间:2016-04-01 17:54:11

标签: java multithreading nio channel

上下文

我有一个使用NIO的应用程序。它有一个可插拔的传输机制,我正在根据传输基准测试各种底层传输的执行情况。 IO性能很重要,应用程序只能与同一台计算机上的其他进程通信,因此我使用TCP套接字,UDP套接字,FileChannel和几个UNIX_AF套接字库的非阻塞包装器进行测试

为了获得这些基准测试,并对这个系统进行测试,最快可能的是"#34;控制组实现,使用标准NIO函数遍历整个服务器/处理堆栈,但以线程/内存访问的速度运行。

问题:

如何实现可以与NIO生态系统的其余部分一起使用的Channel实现,但是只执行内存中的用户空间操作?基本上,我想要替换通过epoll / select / kevent /等访问的底层传输系统。使用线程安全的数据结构访问。

我尝试过的事情:

我已使用Pipe(通过默认创建的Pipe.SinkChannelPipe.SourceChannel个对象)设置解决方案,该解决方案可用于测试。

然而,Java告诉我管道由KQueue通道支持,strace似乎证实了这一点。文档表明Pipes将根据使用它们的环境选择后端。因此,Pipes对于基准测试不会太有用,因为Pipe实现的性能将根据我正在进行基准测试的操作系统而改变。

我知道管道可能比做老式学校更快/更有效率#34;通过队列结构在线程之间传递数据,但第二种方法在主机环境中的性能可能更加一致。

1 个答案:

答案 0 :(得分:1)

我将实现ByteChannel,使用内部分配的字节数组作为缓冲区自己编写代码,同步访问以确保刷新到主内存。这将强制执行内存复制,这样可以避免nio的字节缓冲区类中的可能效率,并使时序更具可重复性。