20240228-NIO技术概览

2024/2/28

# NIO技术概览

NIO技术概览 | Idea Buffer (opens new window)

https://blog.csdn.net/crazymakercircle/article/details/120946903

# IO模型的分类

按照《Unix网络编程》的划分,I/O模型可以分为:阻塞I/O模型、非阻塞I/O模型、I/O复用模型、信号驱动式I/O模型和异步I/O模型,按照POSIX标准来划分只分为两类:同步I/O和异步I/O。

如何区分呢?首先一个I/O操作其实分成了两个步骤:发起IO请求和实际的IO操作。同步I/O和异步I/O的区别就在于第二个步骤是否阻塞,如果实际的I/O读写阻塞请求进程,那么就是同步I/O,因此阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O都是同步I/O,如果不阻塞,而是操作系统帮你做完I/O操作再将结果返回给你,那么就是异步I/O。

阻塞I/O和非阻塞I/O的区别在于第一步,发起I/O请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞I/O,如果不阻塞,那么就是非阻塞I/O。

# 小灿白话

NIO主要引入了三个玩意来解决阻塞问题、性能问题:1.通道channel,2.buffer缓冲区,3.selector选择器。 1.NIO是面向缓冲区的,通道连接着输入流InputStream、输出流OutputStream,所以在通道里可以进行双向操作,可以读和写操作。BIO的操作是面向流的,InputStream是单向只读流,OutputStream是单向输出流 2.缓冲区buffer理解成一块缓存区域,管道的操作都是建立在缓冲区上,管道的write操作:拿到数据后需要写道缓冲区,再从缓冲区进入到服务器。管道的read操作:也是从缓冲区里面拿再返回 3.selector选择器:用一个线程来监控

1.BIO是一个线程维护一个连接,直到这个任务全部做完了才会释放线程,连接不大情况用这个没问题(1000以下),现在大多数产品用户体系大,且大的长连接也多,如果是十万、百万的长连接的情况线程根本不够用,线程资源是很宝贵的,所以在NIO中引入选择器组件Selector, 这个的原理:把通道注册到选择器中,选择器有select查询方法,可以查询通道中的IO是否有可以进行可读、可写操作的IO,也就是用一个线程来监控Selector,系统开销小,这个依赖selector底层和操作系统IO多路服用技术支持