1.阻塞IO
阻塞 IO: 在内核将数据准备好之前 , 系统调用会一直等待 . 所有的套接字 , 默认都是阻塞方式 .
阻塞IO是最常见的IO模型.
2.非阻塞IO
非阻塞 IO: 如果内核还未将数据准备好 , 系统调用仍然会直接返回 , 并且返回 EWOULDBLOCK 错误码 .
非阻塞 IO 往往需要程序员循环的方式反复尝试读写文件描述符 , 这个过程称为 轮询 . 这对 CPU 来说是较大的浪费 , 一般只有特定场景下才使用.
3.信号驱动IO
信号驱动 IO: 内核将数据准备好的时候 , 使用 SIGIO 信号通知应用程序进行 IO 操作.
4.IO多路转接
IO 多路转接 : 虽然从流程图上看起来和阻塞 IO 类似 . 实际上最核心在于 IO 多路转接能够同时等待多个文件描述符的就绪状态.
5.异步IO
异步 IO: 由内核在数据拷贝完成时 , 通知应用程序 ( 而信号驱动是告诉应用程序何时可以开始拷贝数据 ).
6.总结
任何 IO 过程中 , 都包含两个步骤 . 第一是 等待 , 第二是 拷贝 . 而且在实际的应用场景中 , 等待消耗的时间往往都远远高于拷贝的时间. 让 IO 更高效 , 最核心的办法就是让等待的时间尽量少 .即 IO=等+数据拷贝。