应用场景:
大数据基础设施:提高数据传输性能
游戏行业:游戏交互服务器
java中的三种网络IO模型:BIO,NIO,AIO
-
BIO(blocked IO):
特征:1. 同步,阻塞IO
2.一个线程一个连接
3.面向流(只能顺序读取)
问题:线程利用率低
-
NIO(Non-blocking IO,new IO)
特征:1.同步,非阻塞IO,
2.一个线程,多个连接。Netty就是基于NIO的,多个客户端请求都会被注册到多路复用器(selector)上,轮询这些连接是否有IO活动,降低了线程需求量,提高了线程的利用率。
3.面向缓冲区编程,读取时候,游标可在缓冲区前后移动。
-
AIO 异步非阻塞
- Reactor将handle放到select(),等待可写就绪,然后调用write()写入数据;写完处理后续逻辑;
- Proactor调用aoi_write后立刻返回,由内核负责写操作,写完后调用相应的回调函数处理后续逻辑
- reactor:能收了你跟俺说一声。
- proactor: 你给我收十个字节,收好了跟俺说一声。
阻塞:如果线程调用 read/write 过程,但 read/write 过程没有就绪或没有完成,则调用 read/write 过程的线程会一直等待,这个过程叫做阻塞式读写。
非阻塞:如果线程调用 read/write 过程,但 read/write 过程没有就绪或没有完成,调用 read/write 过程的线程并不会一直等待,而是去处理其他工作,等到 read/write 过程就绪或完成后再回来处理,这个过程叫做阻塞式读写。
异步:read/write 过程托管给操作系统来完成,完成后操作系统会通知(通过回调或者事件)应用网络 IO 程序(其中的线程)来进行后续的处理。
同步:read/write 过程由网络 IO 程序(其中的线程)来完成。
-
详解NIO
Channel.class 是顶层接口
-
是双向通道,可读可写
-
常见子类
- FileChannel:用于文件读写
- DatagramChannel:用于 UDP 数据包收发
- ServerSocketChannel:用于服务端 TCP 数据包收发
- SocketChannel:用于客户端 TCP 数据包收发
- selector(选择器)
-
实现IO多路复用,多个channel注册到某个selector上,事件驱动后,调用线程处理事件
-
在上文的使用 Java NIO 编写的服务端示例代码中,服务端的工作流程为:
1)当客户端发起连接时,会通过 ServerSocketChannel 创建对应的 SocketChannel。
2)调用 SocketChannel 的注册方法将 SocketChannel 注册到 Selector 上,注册方法返回一个 SelectionKey,该 SelectionKey 会被放入 Selector 内部的 SelectionKey 集合中。该 SelectionKey 和 Selector 关联(即通过 SelectionKey 可以找到对应的 Selector),也和 SocketChannel 关联(即通过 SelectionKey 可以找到对应的 SocketChannel)。
4)Selector 会调用 select()/select(timeout)/selectNow()方法对内部的 SelectionKey 集合关联的 SocketChannel 集合进行监听,找到有事件发生的 SocketChannel 对应的 SelectionKey。
5)通过 SelectionKey 找到有事件发生的 SocketChannel,完成数据处理。
6.零拷贝(内核缓冲区直接拷贝到soket缓冲区)
省去了内核态和用户态的转变
零”指的是内存中数据拷贝的次数为 0。
转载来源: 作者:烂猪皮 链接:juejin.cn/post/691948… 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。