<aside>
💡 一次典型的网络IO分为两个阶段:数据就绪 与 数据读写
</aside>
数据就绪:根据系统IO操作的就绪状态
- 阻塞:调用IO方法的线程进入阻塞状态
- 非阻塞:不会改变线程状态,通过返回值判断执行情况
- 如,调用
recv
时:
- 返回-1:调用出错或一些需要处理的情况(如
EINTR
、EAGAIN
/EWOULDBLOCK
等错误号)
- 返回0:读取到数据的末尾,对方关闭连接
- 返回>0:代表读取到的字节数
数据读写:根据应用程序和内核的交互方式
- 同步:
- 应用程序发出一个数据读写请求后,必须等待这个操作完成才能继续执行后续代码(应用程序被阻塞)
- 这个等待时间是应用程序的执行时间,花费的是应用程序的时间
- 异步:
- 应用程序发出数据读写请求后,可以立即继续执行后续代码,而不需要等待操作完成(应用程序不阻塞)
- 操作系统会在数据读写操作完成后,通过回调、事件通知或其他机制通知应用程序
- 花费的主要是操作系统的时间
异步IO接口
- 在处理 IO 的时候,阻塞和非阻塞都是同步 IO(都消耗应用程序的时间),只有使用了特殊的 API 才是异步 IO
- Linux中的异步IO接口:
aio_read
/ aio_write
