阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO

Linux 五种 IO 模型

1、基本概念

五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO

首先需要了解下系统调用的几个函数和基本概念。

1.1 简单介绍几个系统调用函数

recvfrom: Linux系统提供给用户用于接收网络IO的系统接口。从套接字上接收一个消息,可同时应用于面向连接和无连接的套接字。

如果此系统调用返回值 <0,并且 errno 为 EWOULDBLOCK或EAGAIN(套接字已标记为非阻塞,而接收操作被阻塞或者接收超时 )时,连接正常,阻塞接收数据(这很关键,前4种IO模型都设计此系统调用)。

select: select系统调用允许程序同时在多个底层文件描述符上,等待输入的到达或输出的完成。以数组形式存储文件描述符,64位机器默认2048个。当有数据准备好时,无法感知具体是哪个流OK了,所以需要一个一个的遍历,函数的时间复杂度为O(n)

poll: 以链表形式存储文件描述符,没有长度限制。本质与select相同,函数的时间复杂度也为O(n)

epoll: 是基于事件驱动的,如果某个流准备好了,会以事件通知,知道具体是哪个流,因此不需要遍历,函数的时间复杂度为O(1)

sigaction: 用于设置对信号的处理方式,也可检验对某信号的预设处理方式。Linux使用SIGIO信号来实现IO异步通知机制。

1.2 同步 & 异步

同步和异步是针对应用程序和内核交互而言的,也可理解为被被调用者(操作系统)的角度来说。 同步是用户进程触发IO操作并等待或轮询的去查看是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知,需要CPU支持

1.3 阻塞 & 非阻塞

阻塞和非阻塞是针对于进程在访问数据的时候,也可理解为调用者(程序)角度来说。根据IO操作的就绪状态来采取的不同的方式。 阻塞方式下读取或写入方法将一直等待,而非阻塞方式下读取或写入方法会立即返回一个状态值。

2、详细

阻塞式IO

非阻塞式IO

IO多路复用

信号驱动式IO

异步IO

3、对比