IO 概念

一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel)。当一个 read 操作发生时,它会经历两个阶段:

  • 通过 read 系统调用想内核发起读请求。
  • 内核向硬件发送读指令,并等待读就绪。
  • 内核把将要读取的数据复制到描述符所指向的内核缓存区中。
  • 将数据从内核缓存区拷贝到用户进程空间中。

IO 模型对比

从等待数据和数据复制这两个时间段,指出了不同 I/O 模型的区别

类比餐厅吃饭

看了几篇文章,为了加深理解,我做了文字排版上的优化,方便从相似的地方发现他们本质上的不同。

  • 我们去餐厅吃饭,会经过以下几个步骤:

    • 首先你(用户态进程)在饭店(内核态的进程)根据菜单点菜
    • 然后等待厨房准备好 ⇒ 等待数据
    • 接着服务员(内核态的进程)上菜。⇒ 将数据从内核复制到用户空间
  • 只点一个菜
    • 然后在餐桌上开始等待

      • 你在这个过程中什么事都不干

        • 直到服务员上菜 ⇒ 阻塞式 I/O 模型
        • 等了一会儿然后就去问服务员,不断重复问,直到服务员上菜 ⇒ 非阻塞式 I/O 模型
      • 你给服务员留下手机,告诉他菜准备好的话
        • 先不要上菜,打个电话给你,然后你就出去玩耍了

          • 等到菜准备好了,服务员手机通知你,你立马回到了餐厅

            • 你对服务员说 “你现在可以上菜了”,于是你在餐桌上等待服务员把菜送上来,然后吃饭。 ⇒ 信号驱动式 I/O 模型
        • 先上菜,菜上桌了打电话给你,然后你就出去玩耍了
          • 等到菜上桌了,服务员手机通知你,你立马回到了餐桌

            • 开始吃饭。 ⇒ 异步 I/O 模型
  • 你点了很多菜
    • 然后在餐桌上开始等待

      • 你在这个过程中什么事都不干

        • 某个时刻其中一个菜或者多个菜厨房里同时好了,

          • 服务员跑过来说,“亲,您的有些菜好了,要现在上桌么?”
          • 你回答,现在就上,于是服务员上一个菜(服务员一次只能上一个菜),你就吃完一个,上一个你就吃完一个 ⇒ I/O 复用模型

参考资料:

1.IO 模型浅析 - 阻塞、非阻塞、IO 复用、信号驱动、异步 IO、同步 IO

2.Linux IO 模型:阻塞 / 非阻塞 / IO 复用 同步 / 异步 Select/Epoll/AIO

🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步的更多相关文章

  1. Python之阻塞IO模型与非阻塞IO模型

    Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...

  2. IO模型之非阻塞IO

    1. IO模型非阻塞 IO Linux下,可以通过设置socket使其变为 non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用 ...

  3. IO模型,非阻塞IO模型,select实现多路复用

    1. IO阻塞模型 IO问题: 输入输出 我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等 将当前进程阻塞住,切换 ...

  4. 深入了解几种IO模型(阻塞非阻塞,同步异步)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zk3326312/article/details/79400805一般来说,Linux下系统IO主要 ...

  5. Java IO 学习(一)同步/异步/阻塞/非阻塞

    关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...

  6. Linux IO 同步/异步 阻塞/非阻塞

    同步IO:导致请求进程阻塞,直到IO操作完成: 是内核通知我们何时进行启动IO操作,而实际的IO操作需要当前进程本身阻塞完成: 包括:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型 ...

  7. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  8. 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

    以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...

  9. (转)同步异步,阻塞非阻塞 和nginx的IO模型

    同步异步,阻塞非阻塞 和nginx的IO模型  原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...

随机推荐

  1. 3款自助型BI分析平台功能盘点,帮助你预测商业发展方向

    在快速发展的今天,商业智能BI已经不同于传统的商业智能BI,商业智能BI已经逐渐转变为自助和业务主导的模式,自助BI分析平台应运而生,自助BI分析平台逐渐成为许多企业的选择. 自助式BI分析平台与传统 ...

  2. 在Mac上安装mysql并配置环境(详细篇)

    在Mac上安装mysql并配置环境(详细篇) 1.下载mysql mysql官网 这一步根据自己电脑架构选择,分为arm和x86 下载完成之后打开就可以 接下来运行安装就可以,一直下一步,设置完密码就 ...

  3. 【C#反射】BindingFlags 枚举

    BindingFlags 枚举用途:Type的类方法中,用于筛选成员. type.InvokeMember方法中 type.GetConstructor 方法中 type.GetFiles方法中 ty ...

  4. C# StopWatch程序性能_时间计时器

    StopWatch 时间计数器简介: Stopwatch 可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.一般用来测量代码执行所用的时间或者计算性能数据,在优化代码性能上可以使用S ...

  5. CAS单点登录(一)——初识SSO

    转载:https://blog.csdn.net/Anumbrella/article/details/80821486 一.初识CAS 首先我们来说一下CAS,CAS全称为Central Authe ...

  6. Qt:QTableWidget

    0.说明 QTableWidget类提供了一个基于Item的Table视图,如下图: Table Widget提供了表格用于显示.Table中的每个Item都是QTableWidgetItem对象. ...

  7. PIL-ImageFont:OSError: cannot open resource

    使用PIL时,创建某个字体Font对象时出错: font=ImageFont.truetype('Arial.ttf',36) 可能原因有两个: 1.PIL无法定位到字体文件的位置. 可以通过提供绝对 ...

  8. HBase常用shell操作

    行(row),列(Column),列蔟(Column Family),列标识符(Column Qualifier)和单元格(Cell) 行:由一个个行键(rowkey)和一个多个列组成.其中rowke ...

  9. petite-vue源码剖析-事件绑定`v-on`的工作原理

    在书写petite-vue和Vue最舒服的莫过于通过@click绑定事件,而且在移除元素时框架会帮我们自动解除绑定.省去了过去通过jQuery的累赘.而事件绑定在petite-vue中就是一个指令(d ...

  10. yum源出现 AppStream‘ 缓存失败,忽略这个 repo。同步仓库 ‘base‘ 缓存失败,忽略这个 repo 的问题解决办法

    今天安装Wget时出现如下错误 到 /etc/yum.repos.d/目录下编辑CentOS-Base.repo ,更改为如下内容. vim CentOS-Base.repo # CentOS-Bas ...