文档章节

Unix I/O模型-通俗篇

laichendong
 laichendong
发布于 2014/09/18 13:32
字数 1050
阅读 16
收藏 1

什么是I/O?

I/O可以认为是在两个不同速率的“设备”间进行数据传送。一般情况下,都是站在高速率设备的角度。将数据发送到低速率设备的操作叫做输出(O)。比如,将内存里的数据写到磁盘上。或者将内存里的数据发往网络。反之,从低速率的设备上读取数据的操作则叫做输入(I)。比如,读取磁盘文件,和网络数据等。 因为I/O涉及到两个速率不一致的设备。如何达到最大化的资源利用率则是I/O模型要处理的问题。(不让速率快的设备等待,不让速率慢的设备成为瓶颈)

阻塞I/O模型 (blocking I/O BIO)

最流行,也是最简单的模型。 想象你去一个餐厅吃饭的场景。遗憾的是,这个餐厅只有一个人(老板,服务员,厨子全包了)。
  1. 你到餐厅,说:我要吃饭!(发起I/O请求)
  2. 老板说:好嘞!然后开始去做饭。这时候,你只能等着。(你被阻塞了,除了在这等着,什么也干不了)
  3. 饭做好了,把饭端给你。(收到数据,本次I/O结束)
这个模型,很简单,很可靠。确定也很明显。等待(阻塞)不可避免。 082155536289553

非阻塞I/O模型(polling, non blocking I/O)

继续想象刚才的场景,当你在坐着等的时候,你很无聊,又很饿。所以你就不断的问老板:好了没?好了没?好了没?(轮询)。但是,在没有真正好之前,老板都只能回答你:还没呢!还没呢!还没呢!直到饭做好了,才能把饭给你。(完成I/O操作) 好吧,你也看到了。这种方式将会耗费你很多精力,好像也没有太多的帮助。所以,这种方式的使用不太广泛。 082155571121722

I/O复用模型(I/O multiplexing)

好吧,老板被你吵的烦了。于是,他招了一个厨子。下次你去吃饭的场景将是这样的了。
  1. 你到餐厅柜台,说:我要吃饭!(你发起I/O请求)
  2. 老板说,知道了。并且将你要吃的菜名告诉厨子(select 老板发起I/O请求)。在老板和厨子沟通的过程中,你只能等着。(你被阻塞)
  3. 老板说,你的单子我已经给你下了。厨子这时候开始做菜。(你和老板都被阻塞)
  4. 厨子做好菜了。把菜给你。(完成I/O操作)
这种模型。加了一个人,但和阻塞模型比起来,貌似效率并没有很大提升。反而需要多一次沟通的过程。这种模型的优势在于,当你要点好几个菜,也有好几个厨师的时候。厨师们可以同时炒菜。而只需要一个老板接客就够了。老板时被复用的。这才是这种模型的真谛。 082156006903861

信号驱动模型(signal-driven I/O)

I/O复用模型虽然可以同时做几个菜了。但是你还是觉得不太爽。因为你还是要在柜台前等着那些菜做好。什么也干不了。于是,老板又想了一个新招儿。当你点完菜以后给你个号。然后你就可以拿着号去干点别的了(玩会儿手机,瞄一眼美女……)。当你的菜做好了。老板就叫你的号(信号通知)。你听到叫号就去把做好的菜拿过来吃就号了。(信号驱动) 082156034098131

异步I/O模型(asynchronous I/O)

顾客就是上帝。即使叫号了。你还是不爽。于是老板进行了服务升级行动。这次你去吃饭的场景就是这样的了。到店里。直接做到桌上。然后告诉服务员说,我要吃饭!(发起I/O请求)然后服务员就给你下单,厨子开始做菜,做好了服务员直接把菜端到你桌上!(这整过程中,你想做什么就做什么。下单和做菜的过程和你是异步的。) 082156066597071

© 著作权归作者所有

laichendong
粉丝 10
博文 85
码字总数 71483
作品 0
朝阳
程序员
私信 提问
I/O复用——几种I/O模型对比

在这篇文章中: I/O复用——几种I/O模型对比 I/O复用——几种I/O模型对比 之前在服务器进程终止中讨论的情形,TCP客户端同时要处理两个输入,一是标准输入,二是TCP套接口。而此时若是服务器...

jackieluo
2018/12/02
0
0
关于IO的同步,异步,阻塞,非阻塞

上次写了一篇文章:Unix IO 模型学习。恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现。中途正好讨论了网络IO的同步、异步、阻塞、非阻塞的概念,当时...

大数据之路
2012/10/08
0
0
阻塞,非阻塞IO和同步,异步IO

在看ACE的过程中,难免对socket的一些特别的api有点质疑,于是不得不求助于unix网络编程,在看的过程中 终于懂得了阻塞,非阻塞和同步,异步的区别,以前认为非阻塞就是一中异步模式呢,哎,...

shawn chen
2010/12/24
0
2
Adaboost、SVM、LDA、贝叶斯网络、谱聚类等几篇博客的LaTeX文件下载

Adaboost、SVM、LDA、贝叶斯网络、谱聚类等几篇博客的LaTeX文件下载 今年以前,在我自己的博客上写过一系列的机器学习系列文章,如下图所示: 随后,微博上有一些朋友帮忙制作了latex版本(非...

Airship
2015/02/05
0
0
IO基础入门之Linux网络I/O模型简介

Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符 )。而对一个socket的读写也会有相应的描述符,...

柳哥
2015/01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
5
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
5
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
15
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部