select epool

2023-10-26

一、问题引出 联系区别

问题的引出,当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种:

1.使用多进程或者多线程,但是这种方法会造成程序的复杂,而且对与进程与线程的创建维护也需要很多的开销。(Apache服务器是用的子进程的方式,优点可以隔离用户)

2.用一个进程,但是使用非阻塞的I/O读取数据,当一个I/O不可读的时候立刻返回,检查下一个是否可读,这种形式的循环为轮询(polling),这种方法比较浪费CPU时间,因为大多数时间是不可读,但是仍花费时间不断反复执行read系统调用。

3.异步I/O(asynchronous I/O),当一个描述符准备好的时候用一个信号告诉进程,但是由于信号个数有限,多个描述符时不适用。

4.一种较好的方式为I/O多路转接(I/O multiplexing)(貌似也翻译多路复用),先构造一张有关描述符的列表(epoll中为队列),然后调用一个函数,直到这些描述符中的一个准备好时才返回,返回时告诉进程哪些I/O就绪。select和epoll这两个机制都是多路I/O机制的解决方案,select为POSIX标准中的,而epoll为Linux所特有的。

区别(epoll相对select优点)主要有三:

1.select的句柄数目受限,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE    1024  表示select最多同时监听1024个fd。而epoll没有,它的限制是最大的打开文件句柄数目。

2.epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,而epoll是维护一个队列,直接看队列是不是空就可以了。epoll只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数(把这个句柄加入队列),其他idle状态句柄则不会,在这点上,epoll实现了一个"伪"AIO。但是如果绝大部分的I/O都是“活跃的”,每个I/O端口使用率很高的话,epoll效率不一定比select高(可能是要维护队列复杂)。

3.使用mmap加速内核与用户空间的消息传递。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。

二、接口

1)select

1. int select(int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict tvptr);

struct timeval{

  long tv_sec;

  long tv_usec;

}

有三种情况:tvptr == NULL 永远等待;tvptr->tv_sec == 0 && tvptr->tv_usec == 0 完全不等待;不等于0的时候为等待的时间。select的三个指针都可以为空,这时候select提供了一种比sleep更精确的定时器。注意select的第一个参数maxfdp1并不是描述符的个数,而是最大的描述符加1,一是起限制作用,防止出错,二来可以给内核轮询的时候提供一个上届,提高效率。select返回-1表示出错,0表示超时,返回正值是所有的已经准备好的描述符个数(同一个描述符如果读和写都准备好,对结果影响是+2)。

2.int FD_ISSET(int fd, fd_set *fdset);  fd在描述符集合中非0,否则返回0

3.int FD_CLR(int fd, fd_set *fd_set); int FD_SET(int fd, fd_set *fdset) ;int FD_ZERO(fd_set *fdset);

用一段linux 中man里的话“FD_ZERO()  clears  a set.FD_SET() and  FD_CLR() respectively add and remove a given file descriptor from a set.  FD_ISSET() tests to see if a file descriptor is part of the set; this is useful after select() returns.”这几个函数与描述符的0和1没关系,只是添加删除检测描述符是否在set中。

2)epoll

1.int epoll_create(int size);
创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。

2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:
struct epoll_event {
  __uint32_t events;  /* Epoll events */
  epoll_data_t data;  /* User data variable */
};

events可以是以下几个宏的集合:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

关于epoll工作模式ET,LT

LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.
ET (edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了,但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once)

3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
等待事件的产生,类似于select()调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。

三、参考:

APUE(I/O多路转接)

linux man epoll select

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

select epool 的相关文章

  • SIM900A GPRS无线通信

    文章目录 一 模块介绍1 基本概况2 GPRS通信开发说明 二 TCP连接实现及其源码1 TCP连接实现方法2 程序源码 xff08 基于MSP430F149单片机 xff09 1 main c2 Config h及Config c3 SI
  • 485无线通信/数传模块_zigbee模块_RS485转ZigBee_顺舟智能

    一 概述 顺舟智能 SZ02系列 ZigBee无线串口通信设备 xff08 485无线通信 数传设备 xff09 xff0c 采用了加强型的ZigBee无线技术 xff0c 集成了符合 ZIGBEE协议的射频收发器和微处理器 xff0c 符
  • 5G DTU 数据上传 无线通信

    5G数据采集上传DTU xff0c 和各种使用串口通信的用户设备进行连接 xff0c 通过无线网络进行数据云端上传实现远程实时在线监测 采用心跳包保持永久在线 xff0c 支持断线自动重连 自动重拨号等特点 5G DTU组网迅速灵活 xff
  • epoll 相对于select的优势

    epoll 相对于select的优势 分类 LinuxKnowHow 819 0 举报 收藏 这个问题至今才去查 是因为我需要用的地方真的不是很多 学习了那么多年 不知道自己究竟学了什么 觉得自己的优势就是针对特定知识点都熟悉点 一整套的软
  • LoRa学习总结(三)

    之前总结是LoRa的基本知识 接下来是都是代码的结构或者细节方面的总结 1 协议介绍 协议将分成三层 射频层 MRFI 网络层 NWK 应用层 APP 2 射频层 这里没有通常所说的物理层和数据链路层 因为这是有Radio芯片将传输过来的数
  • 全面了解环保HJ212协议和使用

    1 环保HJ212协议介绍 环保HJ212协议是在环保行业中使用的数据传输协议 数据终端 采集终端 环保仪等终端设备把采集好的数据发送到环保平台使用这个协议 这个协议是环保行业的标准协议 所以实现了各种终端和平台之间的完美对接 只要符合协议
  • 星星之火-43:无线通信中复用技术的物理原理---空间复用、时分多址TDM、频分复用FDM、正交频分复用OFDM、空分复用MIMO、码分复用CDM

    目录 1 无线通信的基本原理 2 空间复用 小区制 3 时分复用 TDM 4 频分复用 FDM 区分有保护间隔的不同频点的频谱 5 正交频分复用 OFDM 区分部分重叠的不同频点的子载波的信号 6 空分复用 多天线MIMO 7 码分复用 C
  • select、poll、epoll之间的区别总结[整理]

    http www cnblogs com Anker p 3265058 html 随笔 141 文章 2 评论 298 select poll epoll之间的区别总结 整理 select poll epoll都是IO多路复用的机制 I
  • 图解通信原理与案例分析-14:“大哥大”与1G模拟蜂窝移动通信案例--频率调制与频分多址FDMA

    前言 在前面的案例中 拆解的是在单个无线信道上 通过模拟幅度调制或模拟频率调制 实现一对一 点对点语音通信 本文将进一步拆解 通过模拟频率调制与频分多址技术 把一定带宽频谱资源切分成多个无线通道上 实现多用户同时语音通信 从单用户通信单元过
  • 稀疏重构算法详解

    引入 在室内环境中 多径信号具有天然的空间稀疏性 根据压缩感知理论可知 如果信号是可压缩的或者在某个变换域是稀疏的 可以采用一个随机测量矩阵将高维信号映射到一个低维空间上 通过求解优化问题 以很高的概率重构出原始信号 因此 在该理论框架下
  • 为什么要对基带信号进行脉冲成型【转载】

    数字信号在传输过程中受到叠加干扰与噪声 从而出现波形失真 瑞典科学家哈利 奈奎斯特在1928 年为解决电报传输问题提出了数字波形在无噪声线性信道上传输时的无失真条件 称为奈奎斯特准则 其中奈奎斯特第一准则是抽样点无失真准则 或无码间串扰 I
  • 基于LEACH和HEED的WSN路由协议研究与改进(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 无线传感器网络 Wireless Sens
  • 查IEEE期刊名的缩写

    网址 https woodward library ubc ca research help journal abbreviations
  • [无线通信基础-14]:图解移动通信技术与应用发展-2-第一代移动模拟通信大哥大

    前言 第一代移动通信主要采用的是模拟通信技术和频分多址 FDMA 技术 模拟通信 analog communication 是利用正弦波的幅度 频率或相位的变化 或者利用脉冲的幅度 宽度或位置变化来模拟原始信号 以达到通信的目的 故称为模拟
  • 802.11协议数据帧详解(一)——802.11帧结构与分类

    今天继续给大家介绍WLAN 本文主要内容是802 11帧格式 一 802 11数据帧整体结构 IEEE802 11系列标准定义了WLAN无线网络数据帧的帧结构 和基本的物理层 MAC层通信标准 与802 3定义的以太网数据帧格式及通信方式不
  • 基于单片机的无线数据传输系统设计

    基于单片机的无线数据传输系统设计 类别 电子综合 1 引 言 随着计算机 通信和无线技术的逐步融合 在传统的有线通信的基础上 无线通信技术应运而生 他具有快捷 方便 可移动和安全等优势 所以广泛应用到遥控玩具 汽车电子 环境监测和电气自动化
  • 通信子网在计算机网络中的地位和作用

    一 通信子网是计算机网络的核心组成部分 通信子网是计算机网络的核心组成部分 它负责为计算机网络中的各种设备提供通信支持 无论是主机之间的数据传输 还是主机与终端之间的数据通信 都需要通过通信子网来实现 通信子网是连接各个设备的关键基础设施
  • 计算机网络中的通信子网主要有哪些功能?

    计算机网络中的通信子网主要具有以下功能 负责全网的数据通信 通信子网通过使用各种通信协议和传输控制功能 能够确保数据从一台主机安全 准确地传输到另一台主机 这包括数据的封装 解封装 传输控制 差错控制等过程 完成各种网络数据的处理 转换和交
  • 计算机网络中的通信子网:架构、协议与技术简介

    在计算机网络中 通信子网是负责实现主机之间以及主机与终端之间数据传输的核心部分 它由一系列硬件设备和通信协议组成 为上层应用提供可靠 高效和透明的数据传输服务 本文将详细介绍通信子网的架构 协议与技术 一 通信子网的架构 星型拓扑 星型拓扑
  • EMC RI/CI测试方案助您对抗电磁设备干扰!

    方案背景 电磁或射频干扰的敏感性 会给工程师带来重大的风险和安全隐患 尤其是在工业 船用和医疗设备环境 这些环境系统中的控制 导航 监控 通信和警报等关键零部件必须具备电磁抗扰水平 以确保系统始终正常运行 抗扰系统测试方案一般分为传导抗扰与

随机推荐

  • Android学习之Activity源码的理解(一)

    一 Activity为Android系统中四大组件之一 是Android程序的呈现层 并通过界面与用户进行交互 因此理解Activity源码是有必要的 二 之前我写过一篇文章 http blog csdn net u012561176 ar
  • scrapy的工作流程

    scrapy的工作流程如下图所示 整个工作流程 爬虫中起始的url构造成request对象 并传递给调度器 引擎从调度器中获取到request对象 然后交给下载器 由下载器来获取到页面源代码 并封装成response对象 并回馈给引擎 引擎
  • 测试开发-面试题目整理

    1 java的三大特性 封装 继承 多态 2 python的三大特性 封装 继承 多态 3 多态是怎么实现的 4 重载和重写的区别是什么 5 java的八大数据类型 6 花旗金融算法 java的冒泡法怎么实现的 几层for循环 7 得物面试
  • java网络编程——NIO架构

    目录 1 什么是NIO 2 NIO结构 3 基于NIO下的聊天系统实现 4 Netty 1 什么是NIO NIO java non blocking IO 同步非阻塞IO BIO是阻塞IO 即每一个事件都需要分配一个进程给他 如果客户端没有
  • Debian9 设置静态IP

    1 查看虚拟机上本机ip cmd ipconfig 2 配置网卡 2 1 备份原有配置文件配置文件 cp etc network interfaces etc network interfacesbak 备份原有配置文件 2 2 编辑int
  • elm分类器功能_一文带你读懂线性分类器

    本文为 AI 研习社编译的技术博客 原标题 Linear Classifier 作者 Thomas Pernet 翻译 邓普斯 杰弗 涂世文 Disillusion 校对 邓普斯 杰弗 审核 酱番梨 整理 菠萝妹 原文链接 https me
  • 前端h5 播放器vue-video-player

    1 安装依赖 npm install vue video player 2 在main js全局引入 import VideoPlayer from vue video player import video js dist video j
  • 计蒜客 - 44280 UnDetected(并查集).md

    题目大意 题目链接 给你n个圆 ans 为 最少 前多少个 圆 能把x轴 0 200 完全覆盖 完全覆盖是相交的圆 的最左端 lt 0 最右端 gt 200 输出ans 1 分析 并查集维护边界和输入的圆是否相交 代码 1 2 3 4 5
  • 【大数据】Doris:基于 MPP 架构的高性能实时分析型数据库

    Doris 基于 MPP 架构的高性能实时分析型数据库 1 Doris 介绍 Apache Doris 是一个基于 MPP Massively Parallel Processing 大规模并行处理 架构的高性能 实时的分析型数据库 以极速
  • java上传实现 spring boot +element ui

    先从element ui el upload组件开始介绍
  • linux虚拟机ifconfig command not found

    在linux虚拟机中输入ifconfig命令 出现ifconfig command not found 以下是排查过程 1 cd sbin然后ls 没找到ifconfig命令 2 想通过yum install net tools安装 发现出
  • linux基础——linux线程间通信及同步机制总结

    线程间的通信有两种情况 1 一个进程中的线程与另外一个进程中的线程通信 由于两个线程只能访问自己所属进程的地址空间和资源 故等同于进程间的通信 2 同一个进程中的两个线程进行通信 本文说的就是第二种情况 关于进程间通信 IPC 可以看我的另
  • 测试理论----软件测试四大测试过程

    原文链接 1 测试分析 1 要点 1 软件需求分析 2 测试需求项的提取 3 用户使用场景分析 4 测试工具的调研和选取 5 测试缺陷分析 2 分工 1 测试人员 提取测试点 输出需求跟踪矩阵 2 测试负责人 输出测试计划 2 测试设计 1
  • i.mx287学习笔记6-声卡驱动

    上面是我的微信和QQ群 欢迎新朋友的加入 1 查看声卡设备 aplay l 可以看到存在一个声卡设备 2 制作一个音频文件 我是先下载一个音频 然后使用audition裁剪一下 转化为wav再进行播放的 转换出来之后 3 测试
  • 输入若干个整数,以-1标记输入结束,输出其中的最大数

    题目描述 输入若干个整数 以 1标记输入结束 输出其中的最大数 输入 若干个整数 以 1标记输入结束 输出 其中的最大数 样例输入 1 2 5 7 8 6 1 6 1 样例输出 8 1 使用数组 这种方法可以进行求解 但是如果输入的是 1的
  • 712. 两个字符串的最小ASCII删除和 -- 动规

    712 两个字符串的最小ASCII删除和 class MinimumDeleteSum 712 两个字符串的最小ASCII删除和 https leetcode cn problems minimum ascii delete sum for
  • Spring中的AOP和事务管理,以及SpringBoot中使用事务

    一 什么是事务 狭义上的事务特指数据库事务 一方面 当多个程序并发访问数据库时 事务可以在这些应用程序之间提供一个隔离方法 以防止彼此的操作互相干扰 另一方面 事务为数据库操作提供了一个从失败中恢复到正常状态的方法 同时提供了数据库即使在异
  • 全国等级保护测评机构推荐目录

    转自 http www djbh net webdev web LevelTestOrgAction do p nlbdLv3 id 402885cb35d11a540135d168e41e000c 国家信息安全等级保护工作协调小组办公室推
  • 机器学习实战:AdaBoost预测病马率

    import numpy as np 函数说明 加载数据集 Parameters filename 文件名 Returns dataMat 数据集 labelMat 标签 def loadDataSet filename numFeat l
  • select epool

    一 问题引出 联系区别 问题的引出 当需要读两个以上的I O的时候 如果使用阻塞式的I O 那么可能长时间的阻塞在一个描述符上面 另外的描述符虽然有数据但是不能读出来 这样实时性不能满足要求 大概的解决方案有以下几种 1 使用多进程或者多线