Jiahonzheng's Blog

四种IO模型的区别

字数统计: 720阅读时长: 2 min
2017/11/08 Share

小编在刚开始学习异步编程模型 Node.js 时,对I\O模型(同步、异步、阻塞、非阻塞等)的概念是一种云里雾里的感觉。在查看了一些知乎上的通俗易懂的神解释以及专业性较强的技术文章,才有了一个较为清晰的认识。写下此篇博客,既是为了更好地搭建自己的知识网络,也是为了能尽量帮助还在雾里的人。

本篇博文旨在通过浅显的语言解释四种I\O模型的区别,若想深入了解I\O模型,观客可以去查阅 《UNIX Network Programming》

煮开水的故事

这里引用了知乎上的一个例子。我们将借用该例子解释上述四种简单的I\O模型。

老张是个爱喝茶的人,他拥有两把水壶(不会响的水壶,简称水壶;会响的水壶,简称响水壶)。

下面给出四个煮开水的情景:

序号 事件 种类
1 老张把水壶放在火上,立等水开 同步阻塞
2 老张把水壶放在火上,去客厅看电视,时不时去厨房查看水是否烧开 同步非阻塞
3 老张把响水壶放在火上,立等水开 异步阻塞
4 老张把响水壶放在火上,去客厅看电视,只有在水壶响时才去厨房拿响水壶 异步非阻塞

观客可以根据这四个简单的情景,对各I\O模型先拥有个稍微清晰的初步印象。

同步与异步

同步和异步强调的是 消息通信机制

同步,就是“调用者”主动等待“调用结果”;而异步,就是“调用结果”主动通知“调用者”。

在煮开水的故事里,同步和异步是针对于“水是否烧开”这个消息的通信机制而言的:

  • 使用普通水壶,即为同步,因为“调用者”需要通过各种途径去等待“调用结果”,如“立等水开”、“时不时去厨房查看”。
  • 使用响水壶,即为异步,因为“调用结果”会主动通知“调用者”,如“响水壶在水烧开时,能够提示老张,让他去厨房拿响水壶”。

阻塞与非阻塞

阻塞和非阻塞关注的是程序在等待调用结果时的状态

通俗地说,阻塞和非阻塞是针对“调用者”而言。

  • 立等的老张,即为阻塞。
  • 看电视的老张,即为非阻塞。

写在结尾

事实上,I\O模型不仅仅只有上述提到的四种模型,还有 I\O Multiplexing (多路复用)等模型。限于文章篇幅和小编知识水平的局限,有关I\O模型的深奥知识并未在本文展开,尽请谅解。

CATALOG
  1. 1. 煮开水的故事
  2. 2. 同步与异步
  3. 3. 阻塞与非阻塞
  4. 4. 写在结尾