Linux IO 模型

专业盗图,就引用这位大神的图,简洁的说明下IO模型

异步/同步的区别?

我们引入两个相互交流的实体A和B
A发送请求给B,采用忙等待一直等待B返回结果。就像A一直催B出结果,直到B给个结果。这是同步

A发送请求给B,不催B,B什么时候能给A结果了,就给A发个消息。这是异步。异步有一个术语,叫回调函数。在JS事件模型和Java Swing中的EventListener就有回调函数。B出结果了就调用这个回调函数。

两个同步的例子:
Linux IO 模型
同步阻塞模型,你看左边一直在等…忙等待在这个模型不存在,因为A和B都在同一个进程里,但是的确一直在等。

同步不阻塞模型则只是不再阻塞,而也是忙等待,这个是一个标准的轮询(a.k.a 忙等待):
Linux IO 模型
两个异步的例子:
异步则是有回调函数的,也就是发送请求的一方不是忙等待,而是被请求方完成工作主动给请求方发送通知。

异步阻塞例子:

Linux IO 模型
这个也称作IO多路模型(I/O Multiplexing Model),进程在等待某个端口有消息可用,没有端口有消息时阻塞,但一旦有消息,被请求方主动给请求发送一个可用的消息。

看另一个异步非阻塞的例子:
Linux IO 模型
会发现在异步非阻塞是请求方请求后立即返回,而不是像上面那样没有消息就阻塞。
被请求方完成任务后,主动给A发消息并顺带完成从系统空间到用户空间的数据复制。

阻塞/非阻塞 & 异步/同步

再盗个图
Linux IO 模型
它们是两个维度的事情。详情参考链接1吧…

Reference List

  1. Linux异步IO操作
  2. https://notes.shichao.io/unp/ch6/#io-multiplexing-model