阻塞式I/O
非阻塞式I/O
I/O复用(select poll)
信号驱动式I/O(SIGIO)
异步I/O(POSIX的aio_系列函数)
一个输入操作通常包括两个不同阶段:
1 等待数据准备好
2 从内核向进程复制数据
对于套接字上的输入操作,第一步等待数据从网络中到达,当等待分组到达时,它被复制到内核的某个缓冲区。第二步把数据从内核缓冲区复制到应用进程缓冲区。
阻塞式I/O
最流行的I/O模型,系统调用直到数据报到达并且复制到应用进程缓冲区中或者发生错误才返回。最常见的错误是系统调用被信号中断。
非阻塞式I/O
非阻塞是告诉内核:当所请求的I/O操作非得把本进程投入睡眠时,不要把本进程投入睡眠,而是返回一个错误。
当一个应用进程对一个非阻塞的描述符循环调用系统调用时,可能返回错误或者成功,称为轮询(polling).会耗费大量的cpu时间。
I/O复用模型
调用select和poll,阻塞在这两个系统调用中的一个,而不是阻塞在真正的I/O系统调用上。I/O复用的优势在于可以等待多个描述符。
信号驱动式I/O
让内核在描述符就绪时发送SIGIO信号通知我们。这种模型优势在于等待数据到达期间进程不被阻塞,主循环可以继续执行,只要等待来自信号处理函数的通知:既可以是数据准备好被处理,也可以是数据报准备好被读取。
异步I/O模型
异步IO由POSIX规范定义,告知内核启动某个操作并在整个操作(包括数据从内核复制到进程的缓冲区)完成后通知我们,和信号驱动式IO的区别:信号驱动式IO是内核通知我们何时可以启动一个IO操作,异步IO则是内核通知我们IO操作何时完成。