原先对于IO模型的认识总是很模糊,前段时间系统的学习了一下,分享出来,希望对看到的人有帮助。

UNIX网络编程中,将IO模型划分为5种:

(1)阻塞IO (2)非阻塞IO (3)信号驱动IO (4)IO复用 (5)异步IO

1、IO操作的2个步骤

以上5种IO操作都分成了两个步骤:发起IO请求实际IO操作

(1)发起IO请求:IO请求一般需要请求特殊资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源。

(2)实际IO操作:真正进行数据接收。

2、IO分类

步骤1(发起IO请求):分为阻塞IO非阻塞IO,区别(看发起IO请求是否阻塞进程):

应用程序调用后,不能立即返回的称为阻塞IO:即资源不可用时,IO请求一直阻塞,直到反馈结果(有数据或超时)。

能立即返回的称为非阻塞IO:资源不可用时,IO请求离开返回,返回数据标识资源不可用。

步骤2(实际IO操作):分为同步IO异步IO,区别(看实际IO操作是否阻塞进程):

在将数据从内核拷贝到用户空间时,将数据拷贝到应用缓冲区期间是否阻塞。

也就是说,如果实际IO读写阻塞请求进程(应用阻塞在发送或接收数据的状态,直到数据成功传输或返回失败),那么就是同步IO。

如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你(应用发送或接收数据后立刻返回,数据写入OS缓存,由OS完成数据发送或接收,并返回成功或失败的信息给应用),那么就是异步IO。

 

综上所述,前4种属于同步IO,最后一种才是异步IO。虽然(2)(3)(4)种IO是非阻塞IO,但其实也只是同步非阻塞,不能算异步