在进入IO之前,我们需要先明白一个概念,IO实际上是分两步的——1.等待,2.数据拷贝
正式进入IO时,先来通过一个例子简单理解一下五种IO模型:
1 | 我们在食堂吃饭,需要点餐后等待做好才能吃到。现在有: |
看了上边的例子大家是不是更!懵!了!好啦好啦,我们进入正题:
阻塞IO
在内核将数据准备好之前,系统调用会一直等待。(所有的套接字默认都是阻塞方式)
阻塞IO是最常见的IO模型。
非阻塞IO
如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称之为轮询。这对CPU来说是极大的浪费,一般只有特定场景下才使用
信号驱动IO
内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作
IO多路转接
虽然从流程图上看起来和阻塞IO类似,但是实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态
异步IO
由内核在数据拷贝完成时,通知应用程序(与信号驱动不同的是,信号驱动是等到了数据告诉应用程序可以拷贝数据了)
现在回去看例子是不是懂了一些!