老师,NIO是同步非阻塞,那么异步接受,异步发送又是怎么回事呢?

来源:8-8 构建有序消息体-基本接收调度实现-2

95287

2019-06-01

写回答

3回答

Qiujuer

2019-06-19

关于为什么回答问题不及时的原因:http://www.imooc.com/article/288131

我来说一下吧:

  1. IO:普通的流操作,该操作最大的弊端是发送或接收数据需要持续等待,如果网络通道未就绪比如没有数据到达时会持续阻塞到数据到达,从而浪费大量CPU资源。

  2. NIO:说的没错可以理解为同步非阻塞,这里分2部来说:非阻塞是指我们要发送或接收数据时可以在通道上注册事件,当通道就绪,比如有真正的数据到达时我们遍历到了才进行处理,而在没有达到的这个时期可以做其他的事情。但是同步如何理解呢,同步是说虽然我们的注册到发送或者接收这个时机是异步的,但是到真正的通道就绪后我们肯定是需要进行数据的发送或者接收的,此时的发送接收其实是同步操作,如果此时我们要接收数据到文件,那么我们需要读取数据并存储到文件,这个过程同时受限于网络和磁盘速度;所以往往在NIO调度中会有一层IoArgs层用来做缓冲,减少磁盘的速度影响,但是从网络数据和IoArgs之间的交互却依然是同步的。

  3. AIO:可以理解为在NIO的基础上把数据的发送接收也进行了异步操作。在NIO中我们发送数据是把数据填充到IoArgs中,随后等到就绪时进行发送,而发送操作是由我们的线程也就是当前用户态来完成的。而在AIO中是把数据交给系统了,让系统底层在合适的机会上自己发送数据,或者接收数据,然后再通知到业务层。所以他的数据发送接收是在系统内核态完成的,对于上层业务层来说就是完全异步的。我只需要把数据打包好,丢给系统,系统发送后给我一个回调就好了。当然并不是说这样就是绝对的最优解,实际使用AIO中会有较多的内存控制问题;这些也是需要进行处理的。


2
2
Qiujuer
回复
95287
不客气哈,麻烦设置一下采纳问题哈;不然会持续提醒到我这边。
2019-06-19
共2条回复

等待灬

2019-06-03

连接和消息的处理是异步的

0
1
95287
你说的我都知道,我还是觉得没有解答我的疑惑。NIO是将感兴趣的时间注册到通道上,通过轮询的机制遍历得到可读或可写的操作。然后进行读写操作,所以老师代码中的意思,发送和接收只需要通过读写线程池发送一个携带着ioargs的send或recv信号,然后对应的客户端就可以干自己事情了,对channel的读写操作是由ioargs完成,信号负责注册,轮询到可读可写的时候,ioargs就开始操作channel.你觉得我这样理解对吗
2019-06-04
共1条回复

等待灬

2019-06-03

老师住院做手术去了,不能回答问题,另外NIO是异步的,连接时注册读写的事件,也就是说客户端连接上了服务端,但是只要不发送消息,就不会有线程去处理,不会占用线程

0
1
95287
我知道老师身体抱恙,所以不急收到解答。另外NIO的确是同步非阻塞,而IO的是同步阻塞,AIO是异步。Java里有专门的AIO类
2019-06-04
共1条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程