NIO
技术概览
NIO
(
Non-blocking I/O
,在
Java
领域,也称为
New I/O
),是一种同步非阻塞的
I/O
模型,也是
I/O
多路
复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、
I/O
处理问题的有
效方式。
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
。
阻塞
I/O
模型 :在
linux
中,默认情况下所有的
socket
都是
blocking
非阻塞
I/O
模型:
linux
下,可以通过设置
socket
使其变为
non-blocking
。
I/O
复用模型:我们可以调用
select
或
poll
,阻塞在这两个系统调用中的某一个之上,而不是真
正的
IO
系统调用上:
信号驱动式
I/O
模型:我们可以用信号,让内核在描述符就绪时发送
SIGIO
信号通知我们
异步
I/O
模型:用户进程发起
read
操作之后,立刻就可以开始去做其它的事。而另一方面,从内核
的角度,当它受到一个
asynchronousread
之后,首先它会立刻返回,所以不会对用户进程产生任
何
block
。然后,内核会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,
内核会给用户进程发送一个
signal
,告诉它
read
操作完成了: