目录
要搞懂Netty首先需要了解什么是异步I/O?什么是同步I/O?什么是阻塞I/O?什么是非阻塞I/O? 在《UNIX网络编程》一书中介绍了五种I/O模型。分别为:阻塞I/O模型、非阻塞I/O模型、I/O多路复用模型、信号驱动I/O模型和异步I/O模型。下面分别介绍以下这五种I/O模型
一、I/O模型介绍
场景描述:一次网络的数据读取分为:数据准备和数据读取两个阶段。下面就以从网络读取数据为例介绍以下这五种模式。
1、阻塞I/O模型
阻塞I/O模型是最常见的I/O模型。当用户进程调用 recvfrom,此次调用直到数据到达且数据从内核复制到应用进程中的缓冲区中或者发生错误返回,再次期间应用进程一直等待。也就是用户调用后在内核数据准备阶段和数据读取阶段应用进程将一直阻塞。如下图所示:
2、非阻塞I/O模型
非阻塞I/O模型就是当应用程序冲网络读取数据时,如果内核中数据还未准备就绪,就会直接返回一个EWOUDBLOCK错误,一般是应用程序会循环查询数据就绪状态,如果内核中数据准备就绪,应用程序就会等待内核把就绪的数据拷贝到应用程序缓存区中(此阶段是同步的)。流程如下图所示:
3、I/O多路复用模型
I/O多路复用模型就是应用程序把一个或者多个I/O读取,注册到一个select上,阻塞在select操作上,有select检测数据的就绪状态,当有一个或者多个数据就绪后就立即返回已就绪的I/O操作,有应用程序在进行数据的拷贝。一般在使用多路复用模型是都为把socket设置为非阻塞模式。直接有select检测就绪状态,不用应用程序自己循环的去查询就绪状态。多路复用的概念就绪有一个线程同时检查多个应用程序的I/O就绪状态。
如下图所示:
4、信号驱动I/O模型
此模型首先开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据准备就绪时,就为进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理数据。如下图所示:
5、异步I/O模型
用户进程发起读取操作之后,立刻就可以开始去做其它的事。而另一方面,从内核的角度,当它受到一个异步读取操作之后,首先它会立刻返回,所以不会对用户进程产生任何阻塞。然后,内核会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,内核会给用户进程发送一个signal,告诉它读取操作完成了。所以这一切都要内核完成后包括数据准备就绪和数据拷贝。如下图所示:
二、同步/异步IO,阻塞/非阻塞IO
上面介绍完了5中I/O模型,下面在回答一下同步I/O和异步I/O的区别、阻塞I/O和非阻塞I/O的区别
1、阻塞/非阻塞IO
根据个人理解首阻塞和非阻塞值得是在用户进程调用内核时,如果内核中数据未准备就绪时,如果要去用户进程等待数据准备就绪这表明是阻塞的,如果数据未准备就绪用户进程不等待数据的就绪而是立即返回则说明是非阻塞的。
2、同步/异步IO
在说明同步I/O/异步I/O的区别之前,需要先给出两者的定义。Stevens给出的定义是这样子的:
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;
An asynchronous I/O operation does not cause the requesting process to be blocked;
根据Stevens的定义可知同步、异步指的是I/O读取环节,如果在读取数据时用户线程一直被阻塞,则说明是同步IO操作,如上边介绍的阻塞I/O、非阻塞I/O和I/O多路复用都属于同步IO操作。如果读取数据时有内核完成,用户线程没有被阻塞,则说明属于异步IO操作。
综上所述:阻塞、非阻塞值只得是数据准备阶段,同步、异步指的是IO读取阶段。
说明:在学习过程中主要参考了 《Netty实践》、《Netty权威指南第二版》和网络博客。写此博客主要是作为学习笔记,增强记忆。