非阻塞IO

Non-blocking IO

Linux下,可以通过设置socket使其变为non-blocking,当对一个non-blocking socket执行读操作时,流程是这个样子:

  • 用户进程发出read操作时,如果内核中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果

  • 用户进程判断结果是一个error时,它就知道数据还没有准备好,于是用户就可以在本次到下次再发起read询问的时间间隔内做其他事情,或者直接再次发送read操作

  • 一旦内核中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存(这一阶段仍然是阻塞的),然后返回

所以,在非阻塞式IO中,用户进程其实是需要不断的主动询问内核数据准备好了没有

非阻塞IO示例

但是非阻塞IO模型绝不被推荐

我们不能否定其优点:

但是也难掩其缺点:

此外,在这个方案中recv()更多的是起到检测“操作是否完成”的作用,实际操作系统提供了更为高效的检测“操作是否完成“作用的接口,例如select()多路复用模式,可以一次检测多个连接是否活跃

Last updated