Unix 五种I/O模型

一个输入操作通常包括两个不同的阶段:
(1)等待数据准备好
(2)从内核向进程复制数据
对于一个 Socket 套接字上的输入操作,第一步通常涉及等待网络中的数据到达。当等待分组的数据到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到进程缓冲区

1. 阻塞I/O

阻塞I/O.png

通过 recvfrom 函数进行系统调用,直到内核中有数据准备好之后,内核将数据从内核空间复制到用户空间,此刻 revfrom 调用过程中是阻塞的

2. 非阻塞I/O

非阻塞I/O.png

可以看出非阻塞 I/O 的 recvfrom 函数并不会像阻塞 I/O 那样阻塞等待数据复制到用户空间进程的缓冲区,而是立马返回一个 EWOULDBLOCK 的错误 来通知调用进程,这时进行通过轮询反复调用 recvfrom 函数来达到非阻塞的作用,但需耗费大量的 CPU 时间,且当内核空间的数据报准备好之后,仍然需要阻塞等待内核空间将数据复制到用户空间,因此这本非完全的非阻塞。

3. I/O 复用模型

I/O 复用模型.png

I/O 多路复用是通过调用函数,如:select、poll、epoll ,让内核来监听当前套接字的连接状态,从而将阻塞转移到操作系统的内核,当内核若有:可连接、可读、可写等事件时,会通知应用进程,应用进行收到通知后,调用 recvfrom 函数来获取准备好的数据报,此时仍然有一部分时间会阻塞在内核复制数据到用户空间

4. 信号驱动 I/O(SIGIO)

信号驱动 I/O.png

应用进程通过 sigaction 系统调用安装一个信号处理函数。该系统调用立即返回,应用进程继续工作且不阻塞。当数据报准备好时,内核向应用进程发送 SIGIO 信号,此时应用进行立即通知数据处理函数调用 recvfrom 函数进行读取数据报

5. 异步I/O(asynchronous i/o)

异步I/O(.png

异步I/O(asynchronous i/o) 工作机制为:应用进程通过 sigaction 系统调用通知内核某个感兴趣的动作,并让内核在等待数据、将数据从内核复制到用户空间过程中都不通知应用进程,而是在数据真正可用时,通知应用进行处理数据报。同时应用进程在等待 I/O 完成的过程中也不会阻塞

各种I/O 模型对比

各种I/O 模型对比.png

前四种模型主要区别在第一阶段,因为它们的第二阶段是一样的:在数据从内核空间复制到用户空间期间,进程阻塞于 recvfrom 调用。相反,异步 I/O 模型在这两个阶段都是非阻塞的,从而不同于其他四种模型

参考:《UNIX 网络编程卷1》

你可能感兴趣的:(Unix 五种I/O模型)