老师,NIO是同步非阻塞,那么异步接受,异步发送又是怎么回事呢?
来源:8-8 构建有序消息体-基本接收调度实现-2
95287
2019-06-01
3回答
-
Qiujuer
2019-06-19
关于为什么回答问题不及时的原因:http://www.imooc.com/article/288131
我来说一下吧:
IO:普通的流操作,该操作最大的弊端是发送或接收数据需要持续等待,如果网络通道未就绪比如没有数据到达时会持续阻塞到数据到达,从而浪费大量CPU资源。
NIO:说的没错可以理解为同步非阻塞,这里分2部来说:非阻塞是指我们要发送或接收数据时可以在通道上注册事件,当通道就绪,比如有真正的数据到达时我们遍历到了才进行处理,而在没有达到的这个时期可以做其他的事情。但是同步如何理解呢,同步是说虽然我们的注册到发送或者接收这个时机是异步的,但是到真正的通道就绪后我们肯定是需要进行数据的发送或者接收的,此时的发送接收其实是同步操作,如果此时我们要接收数据到文件,那么我们需要读取数据并存储到文件,这个过程同时受限于网络和磁盘速度;所以往往在NIO调度中会有一层IoArgs层用来做缓冲,减少磁盘的速度影响,但是从网络数据和IoArgs之间的交互却依然是同步的。
AIO:可以理解为在NIO的基础上把数据的发送接收也进行了异步操作。在NIO中我们发送数据是把数据填充到IoArgs中,随后等到就绪时进行发送,而发送操作是由我们的线程也就是当前用户态来完成的。而在AIO中是把数据交给系统了,让系统底层在合适的机会上自己发送数据,或者接收数据,然后再通知到业务层。所以他的数据发送接收是在系统内核态完成的,对于上层业务层来说就是完全异步的。我只需要把数据打包好,丢给系统,系统发送后给我一个回调就好了。当然并不是说这样就是绝对的最优解,实际使用AIO中会有较多的内存控制问题;这些也是需要进行处理的。
222019-06-19 -
等待灬
2019-06-03
连接和消息的处理是异步的
012019-06-04 -
等待灬
2019-06-03
老师住院做手术去了,不能回答问题,另外NIO是异步的,连接时注册读写的事件,也就是说客户端连接上了服务端,但是只要不发送消息,就不会有线程去处理,不会占用线程
012019-06-04
相似问题