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