前言
IO,是I/O,Input/Output。对于读操作而言,都需要先将数据拷贝到内核缓冲区,然后再从内核拷贝到用户缓冲区。
blocking I/O
阻塞IO,会阻塞应用程序,直到数据完全拷贝到用户空间。
non-blocking I/O
非阻塞IO,当数据未准备好不会阻塞应用程序,通常需要轮询请求,但第二阶段仍会阻塞。
I/O multiplexing
IO 多路复用,相比 non-blocking I/O,将用户态的轮询转移到内核态,同时监听多个IO,任意一个IO可读则返回。常见的实现有 select、poll 和 epoll。
select、poll 和 epoll 可参考[我终于懂了 I/O 多路复用](/docs/操作系统/我终于懂了 IO 多路复用.html)。
signal driven I/O
信号驱动 IO,设置一个信号处理函数立刻返回,当数据准备好会递交一个SIGIO信号给应用程序,在处理函数中再进行 recvfrom 调用。
asynchronous I/O
发起 aio_read 后立刻返回,当数据完全拷贝到用户空间后通知应用程序处理。
Linux AIO 不完善,仅支持本地操作。Windows 的 IOCP 则完整支持 IO 的异步编程。