🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步
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 复用 / 信号驱动 / 异步的更多相关文章
- Python之阻塞IO模型与非阻塞IO模型
Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...
- IO模型之非阻塞IO
1. IO模型非阻塞 IO Linux下,可以通过设置socket使其变为 non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用 ...
- IO模型,非阻塞IO模型,select实现多路复用
1. IO阻塞模型 IO问题: 输入输出 我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等 将当前进程阻塞住,切换 ...
- 深入了解几种IO模型(阻塞非阻塞,同步异步)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zk3326312/article/details/79400805一般来说,Linux下系统IO主要 ...
- Java IO 学习(一)同步/异步/阻塞/非阻塞
关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...
- Linux IO 同步/异步 阻塞/非阻塞
同步IO:导致请求进程阻塞,直到IO操作完成: 是内核通知我们何时进行启动IO操作,而实际的IO操作需要当前进程本身阻塞完成: 包括:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型 ...
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
- 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO
以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...
- (转)同步异步,阻塞非阻塞 和nginx的IO模型
同步异步,阻塞非阻塞 和nginx的IO模型 原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...
随机推荐
- 多图|一文详解Nacos参数!
Nacos 中的参数有很多,如:命名空间.分组名.服务名.保护阈值.服务路由类型.临时实例等,那这些参数都是什么意思?又该如何设置?接下来我们一起来盘它. 1.命名空间 在 Nacos 中通过命名空间 ...
- 关于设备控制器和 I/O 通道的理解
设备控制器 设备控制器是CPU 与 I/O 设备之间的接口,它接收 CPU 发来的命令,去控制 I/O 设备工作,使 CPU 从繁杂的设备控制事务中解放出来. 当 CPU 要操作 I/O 设备时,首先 ...
- Window常用快捷键
Window常用快捷键 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+A:全选 Ctrl+X:剪切 Ctrl+D:删除 Ctrl+Z:撤销 Ctrl+Y:反撤销 Ctrl+Shift+Esc:调出 ...
- mac上Navicat新建数据库3680错误解决办法
mac上Navicat新建数据库3680错误解决办法 1.在设置里关闭mysql,若不能关闭,在终端输入: sudo /usr/local/mysql/support-files/mysql.serv ...
- 【C#单元测试】 开篇
官方:https://docs.microsoft.com/zh-cn/visualstudio/test/install-third-party-unit-test-frameworks?view= ...
- Java 类方法和类变量
目录 一.类变量 1.如果定义类变量 2.如何访问类变量 3.类变量的使用注意事项和细节 二.类方法 1.类方法的形式 2.类方法的调用 3.类方法经典使用场景 4.类变量和类方法 三.main方法 ...
- SoapUI软件-测试Web Service接口
一.新建项目 New SOAP Project Project Name填入项目名称:Initial WSDL中填入接口地址,或后缀为.wsdl的文件:OK: 添加后可在左侧看到接口详情: 二.测试接 ...
- 基于NopCommerce框架开发的微信小程序UrShop
Urshop小程序商城 介绍 UrShop小程序商城 2.0发布啦,发布地址https://gitee.com/urselect/urshop UrShop 根据NopCommerce框架开发的,基于 ...
- Java使用Geotools读取shape矢量数据
作为GIS开发者而言,矢量数据是我们经常要用到的,而shape数据是矢量数据中最常用的格式,因此解析shape数据也是作为GIS软件开发人员必备的基础技能,而GeoTools无疑是Java最好用来处理 ...
- ubuntu 学习中的坑-2021-11-22
安装ssh-server服务 查看是否安装ssh服务 #dpkg -l | grep ssh 安装ssh-server服务 #sudo apt-get install openssh-server 然 ...