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操作完成了: