多路复用select、poll、epoll总结

2023-11-08

多路复用select、poll、epoll总结

一、 多路复用

IO多路复用是指使用单个线程同时处理多个IO请求。在IO多路复用模型中一个线程可以监视多个文件描述符(fd),一旦某个fd就绪(读/写就绪)或者超时,就能够通知应用程序进行相应的读写操作。IO多路复用使线程不会阻塞在某一个特定的IO请求上,而是不断地去对内核通知的请求进行处理,其具体实现方式有select、poll和epoll三种
在这里插入图片描述

二、三种IO模型优缺点

2.1、Select

Select可以是非阻塞模型,非阻塞并不一定是异步模型,但异步模型一定是非阻塞的。利用 select 函数来判断某Socket上是否有数据可读,或者能否向一个套接字写入数据,防止程序在Socket处于阻塞模式中时,在一次 I/O 调用(如send或recv、accept等)过程中,被迫进入“锁定”状态;
在这里插入图片描述

优点:
select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。
缺点:
select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024(32位1024,64位2048),可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。
第二个缺点,对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低。
第三个缺点,select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理,因此需要维护一个用来存放大量fd的数据结构(fd_set)。fd_set简单地理解为一个长度是1024的比特位,每个比特位表示一个需要处理的FD,如果是1,那么表示这个FD有需要处理的I/O事件,否则没有,其是连续存储的。每次select查询都要遍历整个事件列表。这样会使得用户空间和内核空间在传递该结构时复制开销大。

2.2、poll

poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。
优点:
在使用该结构的时候,不用进行比特位的操作,而是对事件本身进行操作就行。同时还可以自定义事件的类型。这样的好处是在内存中存放就不需要连续的内存地址,很像是list队列结构,读或者写事件数量(文件描述符数量)理论上是无限的,取决于内存的大小。它没有最大连接数的限制,原因是它是基于链表来存储的。
缺点:
内核需要将消息传递到用户空间,都需要内核拷贝动作。需要维护一个用来存放大量fd的数据结构,使得用户空间和内核空间在传递该结构时复制开销大。大量的fd被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

2.3、epoll

在这里插入图片描述

epoll给出了一个新的模式,直接申请一个epollfd的文件,对这些进行统一的管理,初步具有了面向对象的思维模式。可理解为event poll,epoll会把哪个流发生哪种I/O事件通知我们。所以epoll是事件驱动(每个事件关联fd)的,此时我们对这些流的操作都是有意义的。复杂度也降低到了O(1)。
epoll通过在Linux内核中申请一个简易的文件系统。把原先的select/poll调用分成了3个部分:
调用epoll_create()建立一个epoll对象(在epoll文件系统中为这个句柄对象分配资源);
调用epoll_ctl向epoll对象中添加这些连接的套接字;
调用epoll_wait收集发生的事件的连接.
如此一来只需要在进程启动时建立一个epoll对象,然后在需要的时候向这个epoll对象中添加或者删除连接。同时,epoll_wait的效率也非常高,因为调用epoll_wait时,并没有一股脑的向操作系统复制这些连接的句柄数据,内核也不需要去遍历全部的连接。

三、select、poll、epoll 区别总结:

3.1、支持一个进程所能打开的最大连接数

select:单个进程所能打开的最大连接数有FD_SETSIZE宏定义,其大小是32个整数的大小(在32位的机器上,大小就是3232,同理64位机器上FD_SETSIZE为3264),当然我们可以对进行修改,然后重新编译内核,但是性能可能会受到影响,这需要进一步的测试。
poll:poll本质上和select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的。
epoll:虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右的连接,2G内存的机器可以打开20万左右的连接。

3.2、fd剧增后带来的IO效率问题

select:因为每次调用时都会对连接进行线性遍历,所以随着FD的增加会造成遍历速度慢的“线性下降性能问题”。
poll:同上
epoll:因为epoll内核中实现是根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,所以在活跃socket较少的情况下,使用epoll没有前面两者的线性下降的性能问题,但是所有socket都很活跃的情况下,可能会有性能问题。

3.3、消息传递方

select:内核需要将消息传递到用户空间,都需要内核拷贝动作
poll:同上
epoll:epoll通过内核和用户空间共享一块内存来实现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多路复用select、poll、epoll总结 的相关文章

随机推荐

  • Chisel基础之Scala

    前言 Scala is yet another programming language which supports common programming paradigms We chose to use it for several
  • 格式装换到OFD

    https www yozodcs com page example html
  • 【6月第一周学习记录】Utrecht University Game&Media Technology-Computer vision计算机视觉(0):一点Linear Algebra基础

    1 Matrix rotation and translation 矩阵四则运算和平移旋转 2 homogeneous coordinates geomatric operations 齐次坐标系中的一些几何变换操作方法 平移和缩放 剪切变
  • laravel8框架-语言包的安装和配置

    1 查找 laravel框架语言包地址 根目录 resources lang 默认有个 en 语言包 2 下载 和 安装 下载地址 https packagist org 搜索 laravel lang 参考网址 https packagi
  • Spring MVC教程第一篇

    转自 Spring MVC教程第一篇 Spring MVC是Java平台下的一个框架 Spring MVC是一个开源框架 它用于开发Java Web应用程序 Spring框架由Rod Johnson编写 在2003年6月采用Apache 2
  • 西米支付:微信支付接口(申请与介绍)

    据统计 2022年微信全球用户数超12 8亿 其中微信支付使用人数达到6亿 而且微信支付在中国移动支付的市场份额超过40 无论是在线上购物 还是线下收款 都能看到微信支付的身影 微信支付已经融入到我们的日常生活中 所以 商家在接入支付接口的
  • 【Linux】linux系统很卡排除

    1 背景 今天操作linux感觉有点卡 然后就去排查 1 1 查看内存使用情况 root localhost dataMocker free g total used free shared buff cache available Mem
  • vscode html文件自动补充html骨架失效

    vscode html文件自动补充html骨架失效 输入 Tab键补全html骨架失效 解决办法 1 让html文件处于编辑状态 按下快捷键ctrl shift p 2 在跳转的对话框里面输入change language mode 在下拉
  • 什么是动态库?什么又是静态库?(如何生成/如何使用 ! ! !)

    动态库 静态库 目录 一 gcc g 的链接方式 1 动态链接 2 静态链接 二 库的优缺点 1 动态库的优点 2 静态库的优点 三 库的生成 四 库的使用 目录 一 gcc g 的链接方式 对于我们编译一段程序经常会需要调用一个函数库 就
  • 浅谈对于servlet的见解

    众所周知 我们创建一个javaweb项目后 在客户端想要访问服务器 得发起http请求 服务器对请求会进行响应 看似简单的请求和响应有很大的门道 虽然我们都会用servlet但是不乏有人不懂其中的原理 接下来我就浅谈一下servlet的一些
  • 获取当前IP地址,跳转到对应城市网站。

    博客迁移 时空蚂蚁http cui cuihongbo com 1 代码 index php
  • COCO-stuff用法

    COCO stuff API 1 是 COCO API 2 的扩展 安装见 3 这里研究一下 COCO stuff 的用法 Files 下载链见 4 image 训练集图片 train2017 zip 验证集图片 val2017 zip 分
  • Vue+ElementUI实现将数据库中的数字展示成对应汉字

    需求 数据库中存的是数字类型 需要展示成对应的汉字 其中 1 gt 部级 2 gt 省级 3 gt 市级 4 gt 其他 dvIdxIndexList里面是从后台查到的结果集 我们首直接用map遍历后台返回的结果集 利用里面的回调对数据进行
  • 在windows10的系统下安装MySQL

    简单介绍一下 Mysql workbench的安装教程 官方网址 https www mysql com downloads 下拉到最下面 点击进去 下载这两个软件 分别是 mysql的具体网址 https dev mysql com do
  • 记一次在forEach循环中使用异步代码无效

    背景 代码如下 const res1 await getOrderPackage XM LX 95 入院检查套餐 const res2 await getOrderPackage XM LX 98 入院检验套餐 const res res1
  • 将windows10 的编码修改为UTF-8

    临时修改 只作用于当前窗口 先进入cmd命令窗口 快捷键win键 R 直接输入 chcp 65001 然后回车键 Enter键 执行 这时候本次打开的窗口编码就已经是UTF 8了 永久修改 win键 R 然后在输入框输入regedit 确定
  • mediapipe教程5:在安卓上运行mediapipe的handTracking

    一 前言和准备见mediapipe教程4 这篇博客开门见山 直接来步骤 二 在安卓上运行mediapipe的handTracking 参考网址 步骤 https google github io mediapipe getting star
  • 手游服务器微信互通,9月14日部分服务器数据互通公告

    尊敬的轩辕勇士们 轩辕传奇手游 开放测试以来人气沸腾 各种战斗的激烈程度也随之升级 为了让勇士们尽享更刺激 更热血的战斗 我们计划于9月14日6 00 9 00期间进行数据互通操作 数据互通期间 相关服务器将暂时无法进入 造成您的不便 恳请
  • 卷积神经网络的深入理解-归一化篇(Batch Normalization具体实例)

    卷积神经网络的深入理解 归一化篇 标准化 归一化 神经网络中主要用在激活之前 卷积之后 持续补充 归一化在网络中的作用 1 线性归一化 进行线性拉伸 可以增加对比度 2 零均值归一化 像素值 均值 方差 3 Batch Normalizat
  • 多路复用select、poll、epoll总结

    多路复用select poll epoll总结 一 多路复用 IO多路复用是指使用单个线程同时处理多个IO请求 在IO多路复用模型中一个线程可以监视多个文件描述符 fd 一旦某个fd就绪 读 写就绪 或者超时 就能够通知应用程序进行相应的读