Linux IO 模型
专业盗图,就引用这位大神的图,简洁的说明下IO模型
异步/同步的区别?
我们引入两个相互交流的实体A和B
A发送请求给B,采用忙等待一直等待B返回结果。就像A一直催B出结果,直到B给个结果。这是同步。
A发送请求给B,不催B,B什么时候能给A结果了,就给A发个消息。这是异步。异步有一个术语,叫回调函数。在JS事件模型和Java Swing中的EventListener
就有回调函数。B出结果了就调用这个回调函数。
两个同步的例子:
同步阻塞模型,你看左边一直在等…忙等待在这个模型不存在,因为A和B都在同一个进程里,但是的确一直在等。
同步不阻塞模型则只是不再阻塞,而也是忙等待,这个是一个标准的轮询(a.k.a 忙等待):
两个异步的例子:
异步则是有回调函数的,也就是发送请求的一方不是忙等待,而是被请求方完成工作主动给请求方发送通知。
异步阻塞例子:
这个也称作IO多路模型(I/O Multiplexing Model),进程在等待某个端口有消息可用,没有端口有消息时阻塞,但一旦有消息,被请求方主动给请求发送一个可用的消息。
看另一个异步非阻塞的例子:
会发现在异步非阻塞是请求方请求后立即返回,而不是像上面那样没有消息就阻塞。
被请求方完成任务后,主动给A发消息并顺带完成从系统空间到用户空间的数据复制。
阻塞/非阻塞 & 异步/同步
再盗个图
它们是两个维度的事情。详情参考链接1吧…