阻塞 IO

在 Linux 中,阻塞 IO 是最流行的 IO 模型,默认情况下所有的 socket 都是阻塞的(blocking)。对于阻塞 IO 来说,读操作的流程如下所示:

Blocking IO Model

当用户进程发起 recvfrom 系统调用后,内核开始 IO 的第一个阶段:等待数据准备好,把数据从硬件拷贝到内核缓冲区(对于网络 IO,要先等待数据报文到达)。当数据准备好后,开始 IO 的第二个阶段:把数据从内核缓冲区拷贝到用户进程的缓冲区。当两个 IO 阶段都完成后,recvfrom 系统调用返回,也就是说用户进程从发起 recvfrom 系统调用直到返回都是处于阻塞状态。

因此,对于阻塞 IO 来说,用户进程在 IO 的两个阶段都被 recvfrom 系统调用阻塞了