epoll与select区别

2023-10-26

select和epoll的区别(面试常考)

  • 首先select是posix支持的,而epoll是linux特定的系统调用,因此,epoll的可移植性就没有select好,但是考虑到epoll和select一般用作服务器的比较多,而服务器中大多又是linux,所以这个可移植性的影响应该不会很大。
  • 其次,select可以监听的文件描述符有限,最大值为1024,而epoll可以监听的文件描述符则是系统对整个进程限制的最大文件描述符
  • 接下来就要谈epoll和select的性能比较了,这个一般情况下应该是epoll表现好一些,否则linux也不会去特定实现epoll函数了,那么epoll为什么比select更高效呢?原因如下:
    • 第一点,epoll通过每次有就绪事件时都将其插入到一个就绪队列中,使得epoll_wait的返回结果中只存储了已经就绪的事件,而select则返回了所有被监听的事件事件是否就绪需要应用程序去检测,那么如果已被监听但未就绪的事件较多的话,对性能的影响就比较大了。
    • 第二点,每一次调用select 获得就绪事件时都要将需要监听的事件重复传递给操作系统内核,而epoll获得就绪事件和设置监听事件是分开,这样获得就绪事件的调用epoll_wait就不需要重新传递需要监听的事件列表,这种重复的传递需要监听的事件也是性能低下的原因之一。
    • 除此之外,epoll在内核维护一个事件表,并提供了一个独立的系统调用epoll_ctl来控制添加、删除、修改事件,这样,epoll_wait每次都是直接从该内核事件表中获取用户注册的事件,无需反复从用户空间读入这些事件。
  • 然后就是epoll提供了两种工作模式,一种是水平触发模式,这种模式和select的触发方式是一样的,要只要文件描述符的缓冲区中有数据,就永远通知用户这个描述符是可读的,这种模式对block和noblock的描述符都支持,编程的难度也比较小;而另一种更高效且只有epoll提供的模式是边缘触发模式,只支持nonblock的文件描述符,他只有在文件描述符有新的监听事件发生的时候(例如有新的数据包到达)才会通知应用程序,在没有新的监听事件发生时,即使缓冲区有数据(即上一次没有读完,或者甚至没有读),epoll也不会继续通知应用程序,使用这种模式一般要求应用程序收到文件描述符读就绪通知时,要一直循环读数据直到收到EWOULDBLOCK/EAGAIN错误(循环读,所以需要非阻塞,否则会死等),使用边缘触发就必须要将缓冲区中的内容读完,否则有可能引起死等。另外,如果对listen_fd使用ET模式监听到达连接的时候,这时如果有多个连接同时到达,如果每次只是调用accept一次,就会导致多个连接在内核缓冲区中滞留,处理的办法是用while循环抱住accept,直到其出现EAGAIN。这种模式虽然容易编程出错,但是性能要比前面的模式更高效,因为只需要监听是否有事件发生,发生了就直接将描述符加入就绪队列即可。

epoll的使用场景

  • epoll的高性能, 是有一定的特定场景的. 如果场景选择的不适宜, epoll的性能可能适得其反。
  • 对于多连接, 且多连接中只有一部分连接比较活跃时, 比较适合使用epoll。

例如, 典型的一个需要处理上万个客户端的服务器, 例如各种互联网APP的入口服务器, 这样的服务器就很适合epoll.如果只是系统内部, 服务器和服务器之间进行通信, 只有少数的几个连接, 这种情况下用epoll就并不合适. 具体要根据需求和场景特点来决定使用哪种IO模型。

总结

select和epoll区别:

  1. 可扩展性不同:select更好
  2. select可以监听的文件描述符有限,大概是1024,而epoll可以支持系统给整个进程的限制的最大文件描述符数量
  3. 性能不同:有三个点
    • epoll_wait只会返回已经准备就绪的事件,而select会返回所有的事件,需要用户自己查找哪些事件准备就绪,如果已监听,而未就绪的事件过多,会影响性能
    • select获取返回事件时都需要把需要监听的文件描述符重复传给内核,而epoll监听和获取事件是分开的
    • epoll在内核维护了一个事件表,linux还专门提供了一个系统调用支持epoll_ctl来完成对事件的增删改,因此epoll_wait每次都是直接从内核事件表中获取用户注册事件。

水平触发与边缘触发:

  • 水平触发:和select一样的模式,编程难度低,一旦文件描述符缓冲区有数据,就会通知进程,支持阻塞和非阻塞的文件描述符
  • 边缘触发:只有文件描述符缓冲区有新的数据到达时,才会通知。如果当前在读文件描述符的缓冲区的数据没有读完,在下一次循环不会再通知。所以需要使用while循环来读,直到缓冲区数据读完,所以仅支持非阻塞的文件描述符,不然会导致死等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

epoll与select区别 的相关文章

随机推荐

  • 微信小程序-配置请求域名合法的问题以及豆瓣api问题

    一 配置请求域名合法的问题 在哪里找到配置request合法域名 1 进入在微信公众平台官网首页 mp weixin qq com 微信公众平台 小程序 首页 2 右下角设置 3 开发设置 里面有AppID和服务器域名 二 豆瓣api问题
  • Windows系统缺失ieframe.dll文件如何解决?

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个ieframe
  • BOOST升压电路参数计算

    BOOST电路的参数计算主要包括占空比D 电感值L 电容值C 假设1 电感的电流工作在连续的状态并忽略电感的阻值 假设2 电路工作在稳定的状态 1 计算占空比D 电路稳定时 电感满足 伏秒值相等的原则 占空比D 导通状态 截止状态 考虑二极
  • Django by Example·第二章

    Django by Example 第二章 Enhancing Your Blog with Advanced Features 为博客系统添加高级功能 笔记 这本书的结构确实很不错 如果能够坚持看下去 那么Django框架的各种用法也就掌
  • Linux的Web服务器配置

    准备工作 1 准备两台虚拟机 CentOS 一台作为服务器 一台作为客户机 选择仅主机模式进行连接 2 检查是否安装好了httpd rpm q httpd 3 如果没有安装好 安装步骤 cd run media root CentOS 7
  • 【大数据】基于 Flink CDC 高效构建入湖通道

    基于 Flink CDC 高效构建入湖通道 1 Flink CDC 核心技术解析 2 CDC 数据入湖入仓的挑战 2 1 CDC 数据入湖架构 2 2 CDC 数据 ETL 架构 3 基于 Flink CDC 的入湖入仓方案 3 1 Fli
  • bigquery使用教程_如何使用Python和Google BigQuery构建机器人以自动执行您的笨拙任务...

    bigquery使用教程 Do you have repetitive tasks Something that you do regularly every week or even every day Reporting might b
  • 简谈高防CDN

    高防CDN即内容分流网络流量防御 原理就是构建在网络之上的内容分发网络 依靠部署在各地的边缘服务器 通过中心平台的负载均衡 内容分发 调度等功能模块 使用户就近获取所需内容 而不用直接访问网站源服务器 其原理简单的说就是架设多个高防CDN节
  • 2023年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

    C C 编程 1 8级 全部真题 点这里 第1题 字符长方形 给定一个字符 用它构造一个长为4个字符 宽为3个字符的长方形 可以参考样例输出 时间限制 1000 内存限制 65536 输入 输入只有一行 包含一个字符 输出 该字符构成的长方
  • 轻松记住大端小端的含义(附对大端和小端的解释)

    或许你曾经仔细了解过什么是大端小端 也动手编写了测试手头上的机器上是大端还是小端的程序 甚至还编写了大端小端转换程序 但过了一段时间之后 当你再看到大端和小端这两个字眼 你的脑中很快浮起了自己曾经做过的工作 却总是想不起究竟哪种是大端 哪种
  • Navicat连接不上sqlserver问题解决(2008R2)

    Navicat连接不上sqlserver问题解决 一 连接SQL Server时出错 未发现数据源名称并且未指定默认驱动程序 1 安装支持文件 因为没有安装连接支持文件 本身navicat其实是支持SQL server的连接的 只不过是因为
  • 目标分割、目标识别、目标检测和目标跟踪的区别

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 https www cbedai net linuxcore 1 目标分割 任务是把目标对应的部分分割出来 2 目标检测 检测到图片当中的目标的具体位置 3 目标识别 即是在所有的
  • 选择排序(Selection Sort)-- 初级排序算法

    1 选择排序 Selection Sort 选择排序 Selection sort 是一种简单直观的排序算法 它的工作原理 首先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 然
  • i春秋CTF-WEB题解(一)

    简述 这次转到了i春秋平台上面练习 和之前一样也是每3道题目就写一篇题解来作为记录 一 爆破 1 百度杯CTF比赛 2017 二月场 题目给的提示是 flag就在某六位变量中 打开题目的链接 能得到一段PHP代码 大致代码解析如下 引入包含
  • C#中Thread.Time的使用

    Thread Time的使用 线程同步处理之一 这个类主要是开启一个线程 然后实现按照指定的周期 定期的调用指定的某个函数 实现了定期调用一个函数或程序的办法 比如想让一个后台程序 定期检查是否收到邮件 或者让一个后台线程定期输出当前时间等
  • 一文讲解单片机、 ARM、 MCU、 DSP、 FPGA、 嵌入式错综复杂的关系

    概述 一文讲解单片机 ARM MCU DSP FPGA 嵌入式错综复杂的关系 首先 嵌入式 这是个概念 准确的定义没有 各个书上都有各自的定义 但是主要思想是一样的 就是相比较PC机这种通用系统来说 嵌入式系统是个专用系统 结构精简 在硬件
  • ESP8266_12 ESP8266客户端模式下的TCP通信

    ESP8266 01搭建开发环境 ESP8266 02程序的编译与下载 ESP8266 03SDK与Makefile的基本用法 ESP8266 04管脚控制与软件定时器 ESP8266 05 ESP8266有几个串口 ESP8266 06硬
  • java 回调函数解读

    模块间调用 在一个应用系统中 无论使用何种语言开发 必然存在模块之间的调用 调用的方式分为几种 1 同步调用 同步调用是最基本并且最简单的一种调用方式 类A的方法a 调用类B的方法b 一直等待b 方法执行完毕 a 方法继续往下走 这种调用方
  • LaTex学习笔记(文档基本结构、编译与特殊符号)

    1 文章开始 文章第一句通常为 documentclass article book report letter等 documentclass x 作为文章排版的依据 x代表排版方式 基本的排版方式有 article 用于文章排版 book
  • epoll与select区别

    select和epoll的区别 面试常考 首先select是posix支持的 而epoll是linux特定的系统调用 因此 epoll的可移植性就没有select好 但是考虑到epoll和select一般用作服务器的比较多 而服务器中大多又