1、(20191212)查到的一些资料:java从 JDK7开始 引入AOI(即 NIO2)。然后 实现 IOCP使用的是 AsynchronousChannelGroup、AsynchronousServerSocketChannel相关的内容。
ZC:据说 AsynchronousChannelGroup 在Windows下使用的是 IOCP,在 Linux下使用的还是 NIO那一套 只是在NIO上又套了一层 假装AIO。
ZC:查到 Netty至今使用的 还是 NIO(具体原因,几点我记住的是:A、异步IO和Netty原本的架构不配套 改成AIO那一套的话 会4不像;B、不注重Windows上的使用;… …)
1.1、测试了一下,貌似 JDK 8u202 上的也是阉割版的IOCP?
PS:<
用 java的AsynchronousChannelGroup 简单测试了一下,accept操作 只能投递一个,接收操作 也只能投递一个…
具体报错 如下:
(1)投递 2次 accpt操作,会报错:java.nio.channels.AcceptPendingException
在 "AcceptPendingException (Java Platform SE 8 ).html(https://docs.oracle.com/javase/8/docs/api/index.html)"中搜索 "AcceptPendingException",会看到 这样的讲解:“Unchecked exception thrown when an attempt is made to initiate an accept operation on a channel and a previous accept operation has not completed.”
(2)投递 2次 接收(read)操作,会报错:java.nio.channels.ReadPendingException
在 "ReadPendingException (Java Platform SE 8 ).html(https://docs.oracle.com/javase/8/docs/api/java/nio/channels/ReadPendingException.html?is-external=true)"中可以看待这样的讲解:“Unchecked exception thrown when an attempt is made to read from an asynchronous socket channel and a previous read has not completed.”
这样可以看出,8u202版的 网络异步IO,只支持1次 投递操作… 后面的收费版 JDK有修改吗?
ZC:只能投递 1次,这样的AIO 与NIO相比 性能能比NIO快?能快多少?
ZC:但是,这样避免了一个坏处:同一个socket上投递多个接收缓冲区的话,由于缓冲区使用顺序的不同 可能会造成接收到的数据是乱序的。(我查MS的WSARecv,上面说 投递缓冲区的顺序就是驱动中使用[填充]缓冲区的顺序,建议不要多线程同时投递同一个socket的多个接收缓冲区 导致不可预知的缓冲区顺序 [个人理解是 ∵线程调度 顺序无法预测/确定],要在一个线程中投递同一个socket的多个接收缓冲区。然后对投递的缓冲区进行编号 就可以得到正确的接收顺序。[没有测试是否使用线程同步 就可以在多线程中投递同一个socket的多个接收操作了…?]) 1个socket上只能投递一个相同类型的异步操作的话 就不会有这个问题了…
2、
3、
4、
5、
手机扫一扫
移动阅读更方便
你可能感兴趣的文章