🍛 餐厅吃饭版理解 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 ...
随机推荐
- Python基础—名称空间(Day10)
一.名称空间和作用域 1.全局名称空间(名称空间.命名空间): py文件运行时代码从上之下依次执行,看到一个变量就会将这个变量与对应值的内存地址的关系存到名称空间里,代码要运行时(print时)从名称 ...
- Dubbo基础一之实战初体验
本以为写这个小作文没什么难度的,可是好像并不是.前段时间重心放在驾考科目二,就想着小作文科二考过了再写也不是事,因为都实战过了.今天想着写却发现脑袋里啥都想不起来了,得翻项目和笔记回忆一下.所以还是那 ...
- SopringBoot2.x整合Redis
1.导入相关依赖 <!-- redis 依赖 --> <dependency> <groupId>org.springframework.boot</grou ...
- const 和指针之间的姻缘
const和指针到底有何姻缘呢? char const *p = NULL; //char const 和 const char 是一样的,p 是一个指向常整型的指针变量 ,指针变量的值不能改变 ch ...
- navicat:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and ...
mysql5.7,xshell下执行sql不会报下面的错,但是navicat会报错,可能是navicat版本问题,换其他客户端不会出现问题. [Err] 1055 - Expression #1 of ...
- 图表制作软件哪家强?当属火爆商业智能圈的Smartbi
图表制作软件选择多吗? 相对来说,统计图表制作软件还是很多的.比如常见的百度图说还有wps和excel都是可以制作好看的统计图的.关键就是看是在怎样的业务场景下使用.一般情况下,如果你对Excel足够 ...
- 发送POST请求(HTTP),K-V形式
/** * 发送POST请求(HTTP),K-V形式 * @param url * @param params * @author Charlie.chen ...
- Java -- next()和nextLine()的区别
next()读取有效字符串,遇到Tab.空格.回车结束,所以不能接收带空格的字符串 nextLine()读取一行,只是以回车结束,所以可以接收带空格的字符串 https://blog.csdn.net ...
- buu EZ三剑客-EzWeb
查看源码 发现有提示 get 传secret , 尝试随便串值 http://......./?serect=1 发现这是linux命令, net-tools工具中的ifconfig ,但这个工具逐渐 ...
- python3中zip()的用法
zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象. 这个可迭代对象可以使用循环的方式列出其元素 若多个可迭代对象的长度不一致,则所返回的 ...