# 二、非阻塞 IO
# 1. 概念
应用进程与内核交互,目的未达到之前,不再一味的等着,而是直接返回。然后通过轮询的方式,不停的去问内核数据准备有没有准备好。如果某一次轮询发现数据已经准备好了,那就把数据拷贝到用户空间中。
应用进程通过 recvfrom
调用不停的去和内核交互,直到内核准备好数据。如果没有准备好,内核会返回error
,应用进程在得到error
后,过一段时间再发送recvfrom
请求。在两次发送请求的时间段,进程可以先做别的事情。
# 2. 优点
- 能够在等待任务完成的时间里干其他活了(包括提交其他任务,也就是 “后台” 可以有多个任务在同时执行),并发性强了。
# 3. 缺点
- 任务完成的响应延迟增大了,因为每过一段时间才去轮询一次 read 操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。
# 4. 适用场景
- 适用于连接数目较小且固定架构,这种方式对服务器资源要求较高,并发局限于应用中。
- 适用并发量较小、且不需要及时响应的网络应用开发。
# 5. 方案
- socket(设置为 NONBLOCK)