网络I/O的同步与异步、阻塞与非阻塞
基本概念
一般而言同步与异步指的是某个主体在等待消息时是否可以去做别的事,阻塞与非阻塞则关注某个主体发起调用后结果是立即返回还是成功后才返回。而在I/O中,同步与异步、阻塞与非阻塞则有更加明确的定义。本文做一些总结。
阻塞与非阻塞I/O
阻塞与非阻塞I/O的关键在于某个主体是否等待调用结果的最终完成。在I/O模型中,阻塞I/O与非阻塞I/O主要差别指的是数据准备阶段确认数据准备是否完recvfrom这个系统调用是立刻返回还是直到数据准备成功才返回。下图是UNIX网络编程书里面的示意图,我们可以根据recvfrom系统调用(第一阶段数据准备阶段)何时返回来确认是同步I/O还是异步I/O
同步与异步I/O
同步与异步I/O的最主要差别是用户态发起I/O系统调用后是否能去做别的事情。在Linux中,在5.1内核版本之前都是同步的,也就是说用户进程/线程必须等待I/O结果才能做别的事。5.1内核版本以后有io_uring新的异步库可以使用。
参考资料
- [微信公众号] 彻底搞懂Java的网络IO
- 为什么NIO被称为同步非阻塞?