非阻塞I/O

非阻塞I/O教程

我们通过 阻塞 I/O 的教程了解到,阻塞 I/O 是发起请求的时候,不会停止,会一直等待,直到获取到结果,而非阻塞 I/O 呢?它和阻塞 I/O 不同,它发起请求后会立刻返回,通过不停的轮询获取到结果。

非阻塞I/O描述

非阻塞 I/O 模型示意图如下:

04 none block io.png

当用户进程发出 recvform 请求数据的时候,如果内核中的数据还没有准备好,它并不会阻塞等待,而是立马返回一个 error,客户端可以知道内核数据没有准备好。这个时候,客户端可以做一些其他的事情,然后再发起一个 recvform 请求。重复上面的过程。这个过程通常被称之为轮询。轮询检查内核数据是否准备好,直到数据准备好,再拷贝数据到进程,进行数据处理。 需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。

非阻塞I/O优缺点

优点

  • 实现难度相对较低。

缺点

  • 进程轮询,消耗 CPU 资源。
  • 适合并发量比较小且不需要及时响应的网络应用开发。

非阻塞I/O总结

与阻塞 I/O 发起请求,拿不到数据不返回不同的是,非阻塞 I/O 会通过轮询的方式来判断内核有没有将数据准备好,如果准备好了,就通过同步的方式将数据从内核区域拷贝到用户区,进行处理。因为轮询有一定的时间间隔,所以,非阻塞 I/O 在执行过程中会有一些延时,它对实时响应要求较低的网络应用比较适用。