五种IO模型:阻塞IO、非阻塞IO、信号驱动IO、 异步IO、多路复用IO。
一、阻塞IO——最常见的IO模型
在内核将数据准备好之前,系统调用会一直等待,所有的套接字默认都是阻塞的。
二、非阻塞IO
如果内核还未将数据准备好, 系统调用仍然会直接返回,,并且返回EWOULDBLOCK错误码。
非阻塞IO往往需要程序员采用循环的方式,反复尝试读写文件描述符, 这个过程称为轮询.。这对CPU来说是较大的浪费,,一般只有特定场景下才使用。
三、信号驱动IO
内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作。
四、异步IO
由内核在数据拷贝完成时, 通知应用程序。(而信号驱动是告诉应用程序何时可以开始拷贝数据)
五、多路复用IO
从流程图上看起来和阻塞IO类似。都是阻塞等待,内核将数据准备好的时候,给用户反馈。实际上最核心在于多路转接能够同时等待多个文件描述符的就绪状态。 其实现是采用select,poll,epoll来实现的。