epoll实现原理

2023-11-01

epoll的使用

epoll只有以下的三个系统函数调用: epoll_create,epoll_ctl和epoll_wait:
int epoll_create(int size);其中参数:
(1)size指明了生成描述符的最大范围;
该函数返回一个epoll专用的描述符(fd)

int epoll_ctl(int epfd,int op, int fd, struct epoll_event *event);其中参数:
(1)epfd:由 epoll_create 生成的epoll专用的文件描述符;
(2)op:要进行的操作,可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修改、EPOLL_CTL_DEL 删除;
(3)fd:关联的文件描述符;
(4)event:指向epoll_event的指针;
如果调用成功则返回0,不成功则返回-1。
结构体epoll_event 被用于注册所感兴趣的事件和回传所发生待处理的事件。epoll_event 结构体的events字段是表示感兴趣的事件和被触发的事件,可能的取值为:
EPOLLIN: 表示对应的文件描述符可以读;
EPOLLOUT: 表示对应的文件描述符可以写;
EPOLLPRI: 表示对应的文件描述符有紧急的数据可读;
EPOLLERR: 表示对应的文件描述符发生错误;
EPOLLHUP: 表示对应的文件描述符被挂断;
EPOLLET: 表示对应的文件描述符有事件发生;
参考代码如下:

 struct epoll_event ev;
 ev.data.fd = socketXxx;          //设置与要处理的事件相关的文件描述符
 ev.events = EPOLLIN | EPOLLET;  //设置要处理的事件类型
 epoll_ctl(epfd, EPOLL_CTL_ADD, socketXxx, &ev);    //注册epoll事件

int epoll_wait(int epfd, structepoll_event * events, int maxevents, int timeout);其中参数:
(1)epfd:由epoll_create 生成的epoll专用的文件描述符;
(2)epoll_event:用于回传代处理事件的数组;
(3)maxevents:每次能处理的事件数;
(4)timeout:等待I/O事件发生的超时值;
该函数返回发生事件fd的个数。

epoll的实现原理介绍

epoll的内部处理过程主要可以分四个步骤:
1,调用epoll_create()函数,创建epoll句柄eventpoll。该eventpoll内部包含了:一个红黑树rbtree,一个就绪链表rdlist;
2,调用epoll_ctl(EPOLL_CTL_ADD…)将所关心fd的关心事件注册到epoll的rbtree上,(当然也有可能是修改或删除),并注册关心事件的回调函数(如add函数,将就绪fd添加到rdlist)
3,一旦设备(如网卡)有关心事件发生,对应的注册回调函数被触发,就绪fd被添加到rdlist;
4,用户程序调用epoll_wait(),返回rdlist,并对其中的fd做相应处理。
具体过程如下图所示:
在这里插入图片描述

epoll的并发量限制

epoll所能处理的最大并发限制比较多:
(1)Linux中单个进程所能打开的文件描述符fd有最大限制,比如默认的1024,这其中还包含如标准输入,标准输出等必须打开的fd。这个限制可以通过修改Linux配置加以宽松
(2)Linux系统所能打开描述符的最大数量有限制,比如12158。这个一般也可以修改。
(3)socket的端口范围有限制,如32768或65535,其中还需要将通用端口排除在外(根本没有这个限制,服务端accept返回的socket不会占用端口!)
(4)IP_TABLE防火墙在内核中对每个TCP连接进行跟踪,因此其最大跟踪个数也是一个限制。配置可修改。
(5)内存限制。每个socket在内核中都会有发送和接收缓存区,最小为4K,用户接收这些数据也要相同的内存。
因此4*4K=16K,每个socket最最少需要耗费16k内存,因此如果机器是一台4G的PC,其极限并发数目为:4G/16k=26.2W。具体可以参考这篇博文:https://www.jb51.net/LINUXjishu/346080.html

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

epoll实现原理 的相关文章

  • Linux服务器开发——epoll模式web服务器代码

    Linux服务器开发 epoll模式web服务器代码 1 main c 2 epoll server c 2 1 初始化epoll树 初始化监听的描述符 2 2 接受新的连接请求并上树 2 3 已经在树上的进行读数据 2 4 http请求解
  • 深入理解Flutter的GestureDetector组件

    引言 上一篇文章 深入理解Flutter的Listener组件 介绍了触控事件的监听原理 让我们对Flutter中触摸事件的传递过程有了进一步的认识 今天我们学习一下手势识别组件GestureDetector的原理 GestureDetec
  • 从零编写c++之http服务器(3)-http服务

    http全称超文本传输协议 可调试性高 扩展性也强 上两个篇章我们已经拥有了epoll事件驱动框架和线程池处理网络事件 接下来我们要先写一个基础网络套接字 然后在此基础上扩展出http的套接字 献上类图如下 完整源码见
  • python 图像处理(5):图像的批量处理

    有些时候 我们不仅要对一张图片进行处理 可能还会对一批图片处理 这时候 我们可以通过循环来执行处理 也可以调用程序自带的图片集合来处理 图片集合函数为 skimage io ImageCollection load pattern load
  • 三、Linux网络编程:Socket编程-网络模型

    3 Socket编程 网络模型 3 1 OSI七层模型 图解 每层的功能 模型 功能 物理层 比特流传输 数据链路层 网络控制 链路纠错 网络层 寻址 路由 传输层 建立主机端到端的连接 会话层 建立 维护和管理会话 表示层 格式转化 加密
  • Linux中select poll和epoll的区别

    原文地址 http www cnblogs com bigwangdi p 3182958 html 在Linux Socket服务器短编程时 为了处理大量客户的连接请求 需要使用非阻塞I O和复用 select poll和epoll是Li
  • 日志 - 客户端及服务端写法

    一 客户端 先来看一个日志类的实现方法 这个日志类也是代表着大多数客户端日志的主流写法 log h 1 ifndef LOG H 2 define LOG H 3 4 include
  • TCP客户端非阻塞connect,EPOLL异步响应

    废话不多说 直接上代码 下面展示一些 内联代码片 include
  • 网络字节序与地址变换

    文章目录 1 主机字节序与网络字节序 2 字节序转换 Endian Conversions 1 主机字节序与网络字节序 CPU 向内存保存数据的方式有 2 2 2 种 这意味着 CPU 解析数据的方式也分为 2 2 2 种
  • 网络编程——epoll

    参考 TCP IP网络编程 尹圣雨 epoll epoll也是Linux下实现I O复用的一种方法 其性能优于select 基于select的I O复用服务器的设计缺陷 调用select函数后 针对所有文件描述符的循环语句 调用select
  • TCP的keep-alive机制分析

    TCP中的keep alive机制 问题和解决思路 详细内容 缺陷分析 问题和解决思路 建立tcp连接后 双方互相发送信息 但是可能存在的情况是双方在处理数据 暂时并不会互相发送数据 那么这个时候如何判断双方连接是否依然正常 而没有意外断开
  • epoll移植到windows的可行性研究

    1 各有千秋 linux作为高效稳定的操作系统 部署在大量的服务器上 epoll在linux下 一个高性能的网络IO模型 在服务端领域发挥着重要的作用 但在开发效率上 windows以及visual studio系列因其良好的用户体验而更受
  • EPOLLET 的用例是什么? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 epoll在边缘触发模式下是一个奇怪的野兽 它要求进程跟踪每个受监控 FD 的最后响应是什么 它要求进程必须处理所报告的每个事件 否则我们可能会认为 FD 没有报告任何内容 而实际上它已被
  • unixaccept()函数两次返回相同的文件描述符

    我的多线程网络服务器程序有问题 我有一个正在侦听新客户端连接的主线程 我使用 Linux epoll 来获取 I O 事件通知 对于每个传入事件 我创建一个线程来接受新连接并为其分配一个 fd 在重负载下 可能会发生同一个 fd 被分配两次
  • 为什么在 epoll 中推荐使用非阻塞套接字

    我正在尝试学习如何将 epoll 用于 tcp 服务器应用程序 因为我期望有很多连接 我尝试检查示例和教程 他们总是建议使用 设置在 epoll 中添加的套接字为非阻塞套接字 为什么 对于级别触发的 epoll 非阻塞套接字可以帮助最大限度
  • epoll_wait 由于 EINTR 失败,如何解决?

    我的 epoll wait 由于 EINTR 失败 我的 gdb 跟踪显示了这一点 enter code here 221 in nptl sysdeps pthread createthread c gdb 224 in nptl sys
  • poll() 超时为 0 时会做什么?

    我正在看poll man page http man7 org linux man pages man2 poll 2 html 它告诉我的行为poll 当超时参数传入正值和负值时 它没有告诉我如果超时会发生什么0 有任何想法吗 看着epo
  • 从内核空间到用户空间的事件通知

    当内核空间发生事件时如何通知用户空间应用程序 当数据到达某个 GPIO 时 硬件会生成中断 该数据被复制到内核缓冲区 此时 我希望驱动程序通知应用程序它可以调用read函数将数据从内核缓冲区复制到用户空间缓冲区 我想用epoll方法 但是e
  • Linux 上的 Boost Asio 不使用 Epoll

    我的印象是 boost asio 默认情况下会使用 epoll 设置而不是 select 实现 但在运行一些测试后 看起来我的设置正在使用 select 操作系统 RHEL 4内核 2 6海湾合作委员会 3 4 6 我编写了一个小测试程序来
  • 一次性*level*触发的epoll():EPOLLONESHOT是否意味着EPOLLET?

    是否可以使用epoll一击level 触发模式 我在搜索时没有找到任何相关信息 看来每个人都使用边缘触发模式 当 的时候EPOLLONESHOT标记被选中并且您已经为套接字提取了一个事件 那么该套接字不会像许多人想象的那样从 epoll 中

随机推荐

  • MYSQL 转义字符

    1 是 MySQL 的转义符 避免和 mysql 的本身的关键字冲突 只要你不在列名 表名中使用 mysql 的保留字或中文 就不需要转义 所有的数据库都有类似的设置 不过mysql用的是 而已 通常用来说明其中的内容是数据库名 表名 字段
  • Unity3D 射线法获取被点击对象的名称

    void Update if Input GetMouseButton 0 Ray ray Camera main ScreenPointToRay Input mousePosition RaycastHit hitInfo if Phy
  • ICMP识别二层为广播帧则不发送ICMP目的端口不可达报文

    拓扑图 前提 二层交换机转发数据时不改变帧头中任何字段的数据 正常情况下 在主机0上构造一个普通的UDP用户数据报报文给主机1 报文中的UDP首部中的目的端口字段填写一个不可能使用的端口号 则主机1在收到此报文后发现本主机上没有进程监听这个
  • Flutter学习第三课-布局组件 Stack和Positioned

    层叠布局 子组件根据距父容器四个角的位置来确定自己位置 子元素按照代码中声明的顺序作为层级 最后一个声明的子元素会放置在最上层 Flutter中使用Stack和Positioned这两个组件来配合使用决定子元素的坐标位置 Stack Sta
  • 【Notepad】Notepad++ 安装XML/Json插件,格式化xml/json文件

    XML插件安装 1 打开Notepad 软件 2 菜单栏选择插件 选择 插件管理 3 搜索 XML 插件 找到该插件后 勾选该文件Npp Xml Treeview 点击 安装 4 安装成功后 重启Notepad 如果没有成功 多试几次 5
  • 一幅图弄清DFT与DTFT,DFS的关系

    http www cnblogs com BitArt archive 2012 11 24 2786390 html 很多同学学习了数字信号处理之后 被里面的几个名词搞的晕头转向 比如DFT DTFT DFS FFT FT FS等 FT和
  • 树莓派环境处理_一种基于树莓派的便携式的环境监测系统的制作方法

    本发明涉及通讯技术领域 尤其涉及一种基于树莓派的便携式的环境监测系统 背景技术 树莓派是尺寸仅有信用卡大小的一个小型电脑 可以将树莓派连接电视 显示器 键盘鼠标等设备使用 树莓派能替代日常桌面计算机的多种用途 包括文字处理 电子表格 媒体中
  • 论文阅读 视频生成

    T C Wang et al Video to Video Synthesis arXiv 1808 06601 cs Dec 2018 Accessed Nov 03 2020 Online Available http arxiv or
  • CTP监管评测API初始密码修改

    CTP监管评测API初始密码修改 最近在申请看穿式监管认证 我用的是开源的量化交易软件vnpy balabala找期货公司申请了认证账号 然而第一次登录必须修改密码 然而vnpy没有这个功能 网上找了几篇教程 压根不能用 但好在代码可以借鉴
  • 【vue】keep-alive清除缓存最简单暴力的方法

    项目场景 场景一 使用vue开发移动端 有ABC三个页面 点击A跳转到B 点B跳转到C 点C返回B 点B返回A 场景二 场景一实现之后 会出现这样一个问题 先从A跳转到B B页面会被缓存下来 当再从D跳转到B时 B页面并不会更新 解决方案
  • 我的硬盘出现I/O错误,

    用pctools去修复吧 在天空软件园里能下到 用Windows 9x启动盘启动 插入含有Pctools9 0的光盘 运行PCT90目录下的de exe 先进入 Options 菜单 选 Configuration 配置 命令 按下 空格
  • 【j2ee系列】springmvc中使用quartz,项目启动就执行某些任务

    quartz有几种执行任务的方式 至于几种我也不知道 至少有两种吧 一种是org springframework scheduling quartz CronTriggerBean方式 配置指定的时间执行一次任务 如
  • 项目经理如何分配任务

    http www 51testing com html 62 n 245962 html 记得自己第一次当PM 那是接手的项目 原来的PM 在项目需求分析做完之后 去接手另一个重要的项目去了 当时我和另外两个小组长 自然就成了接手PM的人选
  • DC-3靶机渗透实战

    0x00 信息收集 使用arp scan查看局域网内所有主机IP 定位到目标主机IP 使用nmap扫描端口服务 发现只有80端口开放 服务应该是Joomla 使用dirsearch进行路径爆破 发现administrator后台路径 访问h
  • myBatis大于1000的in查询解决办法

    之前公司一位同事写的方法
  • 笔记本安装centos之后,合上盖还正常运行设置

    修改如下配置 让其生效即可 具体操作 vim etc systemd logind conf 将上图所示 HandleLidSwitch suspend 修改为lock 并将起前面 号去掉 重启配置让其生效systemctl restart
  • IMX6学习记录(12)-通过系统接口点亮LED

    上面是我的微信和QQ群 欢迎新朋友的加入 1 硬件 硬件上 led连接的IO是GPIO5 PIN8 高电平熄灭 低电平点亮 2 export引脚 GPIO5 PIN8的在gpio上的位置是5 32 8 136 cd sys class gp
  • 大搜索时代!SEO如何挖掘关键词?方法都在这里!-搜嗖工具箱

    做SEO关键词挖掘是关键 好的关键词可以帮助您的网站在搜索引擎中获得更好的排名 要问都有哪些挖掘关键词的方法 那就太多了 下边就列举几个我常用的方式吧 方法一实用工具挖掘关键词 我们知道有很多关键词在线挖掘工具可以帮助我们快速实现关键词挖掘
  • 这款开源神器,让你能在 iPad 上随心所欲写代码!

    注意 这篇文章就是在劝你买iPad Pro 手动狗头 最近 苹果推出了新的iPad Pro 号称生产力工具 然而对程序员来说 不能写代码 就难以称得上生产力 虽然也有一些优秀的写代码App可供程序员使用 但本着能不花钱就不花钱的原则 还是可
  • epoll实现原理

    epoll的使用 epoll只有以下的三个系统函数调用 epoll create epoll ctl和epoll wait int epoll create int size 其中参数 1 size指明了生成描述符的最大范围 该函数返回一个