参考:

《Linux-unix系统编程手册》

聊聊Netty那些事儿之从内核角度看IO模型

《Unix环境高级编程》

简介

从内核当中来看可以分为五种IO模型:阻塞IO,非阻塞IO,IO多路复用 ,信号驱动IO,异步IO,每一种IO模型的出现都是对前一种的升级优化。

传统的阻塞IO,就是默认的read()和write()系统调用。

<aside> 🚞 磁盘文件是个特例,因为内核使用缓冲区进行了优化。

满足两种需求:

有两种部分解决的手段:

  1. 非阻塞IO,即设置O_NONBLOCK 来实现非阻塞的打开文件,如果系统调用无法完成,则会返回错误。周期性的检查某个 fd 是否能进行IO操作,但是轮询的周期设置很重要,容易造成无意义的CPU空转。
  2. 多进程或者多线程:利用子进程阻塞直到IO执行完毕,而父进程去执行其他任务,该方式的资源开销较为昂贵,如果优化为多线程来实现,则需要实现复杂的线程之间的通信等等操作。

fd 准备就绪的通知模式