趣谈IO多路复用的本质

《轻松搞懂5种IO模型》中,我发起了一个投票。

答案是【同步IO多路复用】。目前,60%的朋友答对了。原因这里解释一下。

同步和异步的概念区别

同步:线程自己获取结果。(一条线索)

[En]

Synchronization: the thread gets the results on its own. (one thread)

Async:线程本身不获取结果,但其他线程发送结果。(至少两个线程)

[En]

Async: the thread does not get the result itself, but other threads send the result. (at least two threads)

异步执行如下图所示,除非您不需要知道结果,否则通常会有一个回调方法。

[En]

Execute asynchronously as shown in the following figure, and unless you don’t need to know the result, there is usually a callback method.

趣谈IO多路复用的本质

IO多路复用的本质

为了彻底理解IO多路复用是同步还是异步,咱们探究一下IO多路复用的本质。

I/O多路复用,复用的IO监听等待这条路。实际上就是用select/poll/epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。

select/poll/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

对于每一个socket,一般都设置成为non-blocking,但是,整个用户的process其实是一直被阻塞的。只不过process是被select这个函数阻塞,而不是被socket IO给阻塞。

趣谈IO多路复用的本质

I/O多路复用的流程如上图所示:

(1)当用户进程调用了select,那么整个进程会被阻塞;

(2)而同时,内核会”监视”所有select负责的socket;

(3)当任何一个socket中的数据准备好了,select就会返回;

(4)这个时候用户进程再调用read/accept/write操作,做一些数据从内核拷贝到用户进程这样的事情。

所以,I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回。

事实上,I/O 多路复用有时候性能比同步阻塞IO还更差一些。因为这里需要使用两个系统调用(select 和 recvfrom),而同步阻塞IO只调用了一个系统调用(recvfrom)。但是,用select的优势在于它可以同时处理多个连接。所以,如果处理的连接数不是很高的话,可能延迟还更大。

总结

打个比方:行军打仗讲究粮草先行。诸葛亮比较牛,他打仗只带少量粮草,其他靠敌军送。这天他又派了暗探去查看敌军粮草的守卫情况。如果敌人守备松懈,则趁机偷粮。如果这个暗探只偷一袋粮食,那效率最高的是不是他看到敌军守备松懈就直接进去偷粮(同步阻塞IO)?但是他要偷的是十万大军的粮食,那他就要先回去汇报一声:”守备松懈啦”。然后百人小分队一起去把粮草偷出来(I/O 多路复用)。当然啦,以诸葛亮的一贯作风而言,最后他还得放一把火。

在同步阻挡模式下,间谍也是刺探敌人的人,也是他偷粮的人。在诸葛亮的团队中,监视敌人时,最后的间谍是第一个得到结果的人。偷粮时,间谍也是第一个知道结果的人。(同步)

[En]

In synchronous blocking mode, the spy is also the one to spy on the enemy, and it is also him to steal grain. In Zhuge Liang’s team, when spying on the enemy, the final spy is the first to get the result. The spy is also the first to know the result when stealing grain. (synchronization)

暗探在I/O 多路复用模式下,打探敌情也是他,偷粮是百人小分队。在诸葛亮团队中,暗探在打探敌情时最终执行者暗探是第一个获取到结果的。百人小分队在偷粮时也是百人小分队自己先知道结果的。(同步)

综上,IO多路复用是同步的。

Original: https://www.cnblogs.com/xiexj/p/15912650.html
Author: 编程一生
Title: 趣谈IO多路复用的本质

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524084/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Xvfb相关命令

    第一种启动方法:Xvfb :99-ac2>/dev/nullexport DISPLAY=:99xhost + & 第二种启动方法Xvfb-ac${DISPLAY:-…

    Linux 2023年6月13日
    0110
  • Linux安装管理

    Linux系列 包管理工具 单个软件包 管理工具 RedHat系列 Redhat Centos Fedora yum rpm .rpm Debian系列 Ubuntu apt-ge…

    Linux 2023年6月8日
    0104
  • Python中class内置方法__init__与__new__作用与区别探究

    最近尝试了解Django中ORM实现的原理,发现其用到了metaclass(元类)这一技术,进一步又涉及到Python class中有两个特殊内置方法__init__与__new_…

    Linux 2023年6月6日
    096
  • Linux下 lsof 命令详解

    lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息,我们都知道,在Linux中,一切皆文件,lsof命令可以查看所有已经打开了的文件,比如: …

    Linux 2023年6月13日
    0114
  • 如何在EMACS 设置格式

    如何设置Emacs的各种模式, 这个教程要观摩一下的 http://www.emacswiki.org/emacs/IndentingC#toc1 Original: https:…

    Linux 2023年6月14日
    0111
  • MySQL注入点与SQL语句的关系

    注入位置分类 这个分类方式是我自己想的,可能会有一些不准确。如图所示注入方式有3种,内联、终止、堆叠。每种注入方式又根据服务器的响应分为4类,时间延迟、报错、布尔、将执行结果直接输…

    Linux 2023年6月6日
    0141
  • 正则表达式

    1.正则表达式分类 正则表达式:REGEXP,REGular EXPression。正则表达式分为两类: Basic REGEXP(基本正则表达式) Extended REGEXP…

    Linux 2023年6月6日
    0104
  • 高等代数:5 矩阵的相抵与相似

    5 矩阵的相抵与相似 1、设S,M是两个集合,则集合 ({(a,b)|a \in S,b \in W}) 称为S与M的 笛卡儿积,记作:(S \times M)。 2、定义1:设S…

    Linux 2023年6月8日
    0136
  • 数据结构-树

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0119
  • LeetCode-459. 重复的子字符串

    题目来源 题目详情 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s = “abab”输出: true解释:…

    Linux 2023年6月7日
    0128
  • Linux专项之Apache

    1.虚拟机上网 1.安装软件(httpd) yum search ht…

    Linux 2023年6月14日
    096
  • 兼容各种浏览器的自动左右滚动兼左右点击滚动代码

    直接切入正题 红色表示要统一(所有的id) 本框架为phpcms,大家可根据自己的框架更改循环。 {pc:content action=”lists” ca…

    Linux 2023年6月13日
    096
  • linux 安装docker

    https://www.cnblogs.com/kingsonfu/p/11576797.html posted @2022-04-29 17:52 银河星光 阅读(10 ) 评论…

    Linux 2023年6月13日
    0104
  • mysql二进制安装脚本部署

    mysql二进制安装脚本部署 mysql二进制安装脚本部署 单实例 使用函数的单实例 使用函数的单实例或者多实例 单实例 [root@localhost ~]# mkdir mys…

    Linux 2023年6月6日
    0122
  • 出现 Expected 0 arguments but found 1 的bug原因

    问题:在给FileInputStream传入参数时报错 原以为是导错了包,结果试了几次都不行,最后才发现是项目名和这个方法名重复了,修改项目名就可以了! 红线处只是异常,抛出即可解…

    Linux 2023年6月7日
    0115
  • shell之磁盘容量检查,配合crontab可以定时清理磁盘

    我的做法: !/bin/bashAvailable=df -k | sed -n 2p | awk ‘{print $4}’if [ $Available -eq 0 ];then…

    Linux 2023年5月28日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球