最新要闻
- 山西王莽岭景区门票多少天有效?
- 殡仪馆年薪15万招遗体spa美容师引热议:含按摩 年薪15万
- 销量超过1000万份后 《暗黑4》后劲不足:70%玩家流失
- 2.5万元的Vision Pro有望降价 LGD打入供应链:索尼不再是独供
- 交通运输部:上半年我国营业性客运量43.2亿人次 同比增长56.3%
- 工信部:全面进行新能源汽车安全隐患排查 起火3次以上的车型重点关注
- 发改委:全面落实带薪休假制度 鼓励错峰休假、弹性作息
- 日本央行发布季度报告:日本核心消费者通胀可能在年底前逐步放缓
- 十年前的今天红米手机诞生!消灭山寨机 推动智能机在全球普及
- 还盯着比亚迪海豚?降价4万的大众ID.3也许更香
- 米哈游又赢了!《原神》亿元盗版周边制售案告破
- 效果超越宣传片!国产虚幻5大作《影之刃零》Demo明年推出
- 长江存储致态TiPro7000 SSD新固件升级体验:读写速度飙升 更稳了!
- 科陆电子:美的集团在管理、技术、供应链、品牌影响力、渠道建设等方面可以对公司赋能
- 强降雨后泉水“活力大增” 趵突泉两天“长高”26厘米
- 12999元 联想拯救者Y9000X 2023开售:i9-13900H+RTX 4060
手机

英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌

宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌
- 宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 离婚时共同债务应该怎么处理?
- 华为云盘古大模型3.0正式发布
- 支持自动长文生成,WPS AI发布:基于大语言模型的智能办公助手
- 《街头霸王6》全球总销量突破200万份 卡普空再次为其玩家送上礼物
家电
RT-DETR:可以满足实时性要求的DETR模型
本文分享自华为云社区《高性能网络设计秘笈:深入剖析Linux网络IO与epoll》,作者: Lion Long 。
一、epoll简介
epoll是Linux内核中一种可扩展的IO事件处理机制,可替代select和poll的系统调用。处理百万级并发访问性能更佳。
二、select的局限性
(1)文件描述符越多,性能越差。单个进程中能够监视的文件描述符存在最大的数量,默认是1024(在linux内核头文件中定义有 #define _FD_SETSIZE 1024),当然也可以修改,但是文件描述符数量越多,性能越差。
(资料图片)
(2)开销巨大,select需要复制大量的句柄数据结构,产生了巨大的开销(内核/用户空间内存拷贝问题)。
(3)select需要遍历整个句柄数组才能知道哪些句柄有事件。
(4)如果没有完成对一个已经就绪的文件描述符的IO操作,那么每次调用select还是会将这些文件描述符通知进程,即水平触发。
(5)poll使用链表保存监视的文件描述符,虽然没有了监视文件数量的限制,但是其他缺点依旧存在。
由于以上缺点,基于select模型的服务器程序,要达到十万以上的并发访问,是很难完成的。因此,epoll出场了。
三、epoll的优点
(1)不需要轮询所有的文件描述符
(2)每次取就绪集合,都在固定位置
(3)事件的就绪和IO触发可以异步解耦
四、epoll函数原型
4.1、epoll_create(int size)
#includeint epoll_create(int size);
功能:创建epoll的文件描述符。
参数说明:size表示内核需要监控的最大数量,但是这个参数内核已经不会用到,只要传入一个大于0的值即可。当size<=0时,会直接返回不可用,这是历史原因保留下来的,最早的epoll_create是需要定义一次性就绪的最大数量;后来使用了链表以便便维护和扩展,就不再需要使用传入的参数。
返回:返回该对象的描述符,注意要使用 close 关闭该描述符。
4.2、epoll_ctl
#includeint epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);// epoll_ctl对应系统调用sys_epoll_ctl
功能:操作epoll的文件描述符,主要是对epoll的红黑树节点进行操作,比如节点的增删改查。
参数说明:
4.2.1、event参数说明
struct epoll_event结构体原型
typedef union epoll_data{void* ptr;int fd;uint32_t u32;uint64_t u64};struct epoll_event{uint32_t events;epoll_data_t data;}
events成员代表要监听的epoll事件类型
events成员:
data成员:
data 成员时一个联合体类型,可以在调用 epoll_ctl 给 fd 添加/修改描述符监听的事件时携带一些数据,方便后面的epoll_wait可以取出信息使用。
4.2.2、扩展说明:SYSCALL_DEFINE数字 的宏定义
跟着的数字代表函数需要的参数数量,比如SYSCALL_DEFINE1代表函数需要一个参数、SYSCALL_DEFINE4代表函数需要4个参数。
4.2.3、注意
epoll_ctl是非阻塞的,不会被挂起。
4.3、epoll_wait
函数原型
#includeint epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
功能:阻塞一段时间,等待事件发生
返回:返回事件数量,事件集添加到events数组中。也就是遍历红黑树中的双向链表,把双向链表中的节点数据拷贝出来,拷贝完毕后把节点从双向链表中移除。
五、epoll使用步骤
step 1:创建epoll文件描述符
int epfd = epoll_create(1);
step 2:创建struct epoll_event结构体
struct epoll_event ev;ev.data.fd=listenfd;//保存监听的fd,以便epoll_wait的后续操作ev.events=EPOLLIN;//设置监听fd的可读事件
step 3:添加事件监听
epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);
step 4:等待事件
struct epoll_event events[EVENTS_LENGTH];char rbuffer[MAX_BUFF]={ 0 };char wbuffer[MAX_BUFF]={ 0 };while(1){int nready = epoll_wait(epfd,events,EVENTS_LENGTH,-1);//-1表示阻塞等待int i=0;for(i=0;i0){rbuffer[ret]="\0";//剔除干扰数据printf("recv: %s\n",rbuffer);memcpy(wbuffer,rbuffer,MAX_BUFF);//拷贝数据,做回传示例//step 2:创建struct epoll_event结构体struct epoll_event evt;evt.data.fd=clientfd;//保存监听的fd,以便epoll_wait的后续操作evt.events=EPOLLOUT;//设置监听fd的可写事件// step 3:修改事件监听epoll_ctl(epfd,EPOLL_CTL_MOD,clientfd,&evt);}}else if(events[i].events &EPOLLOUT){int ret = send(clientfd,wbuffer,MAX_BUFF,0);printf("send: %s\n",wbuffer);//step 2:创建struct epoll_event结构体struct epoll_event evt;evt.data.fd=clientfd;//保存监听的fd,以便epoll_wait的后续操作evt.events=EPOLLIN;//设置监听fd的可读事件// step 3:修改事件监听epoll_ctl(epfd,EPOLL_CTL_MOD,clientfd,&evt);}}}
六、完整示例代码
#include#include #include #include #include #include #include #include #include #define BUFFER_LENGTH 128#define EVENTS_LENGTH 128char rbuff[BUFFER_LENGTH] = { 0 };char wbuff[BUFFER_LENGTH] = { 0 };int main() {// blockint listenfd = socket(AF_INET, SOCK_STREAM, 0); //if (listenfd == -1) return -1;// listenfdstruct sockaddr_in servaddr;servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(9999);if (-1 == bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) {return -2;}#if 0 // nonblockint flag = fcntl(listenfd, F_GETFL, 0);flag |= O_NONBLOCK;fcntl(listenfd, F_SETFL, flag);#endiflisten(listenfd, 10);int epfd = epoll_create(1);struct epoll_event ev, events[EVENTS_LENGTH];ev.events = EPOLLIN;ev.data.fd = listenfd;epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev);printf("epfd : %d\n", epfd);while (1){int nready = epoll_wait(epfd, events, EVENTS_LENGTH, -1);printf("nready --> %d\n",nready);int i;for (i = 0; i < nready;i++){int clientfd = events[i].data.fd;if (listenfd == clientfd){// acceptstruct sockaddr_in client;int len = sizeof(client);int conffd = accept(clientfd, (struct sockaddr*)&client,&len);printf("conffd --> %d\n",conffd);ev.events = EPOLLIN;ev.data.fd = conffd;epoll_ctl(epfd, EPOLL_CTL_ADD, conffd, &ev);}else if(events[i].events & EPOLLIN)//client{int ret=recv(clientfd, rbuff, BUFFER_LENGTH, 0);if (ret > 0){rbuff[ret] = "\0";printf("recv buffer: %s\n", rbuff);/*int j;for (j = 0; j < BUFFER_LENGTH;j++){buff[j] = "a" + (j % 26);}send(clientfd, buff, BUFFER_LENGTH, 0);*/memcpy(wbuff, rbuff, BUFFER_LENGTH);ev.events = EPOLLOUT;ev.data.fd = clientfd;epoll_ctl(epfd, EPOLL_CTL_MOD, clientfd, &ev);}}else if (events[i].events & EPOLLOUT){send(clientfd, wbuff, BUFFER_LENGTH, 0);printf("send --> %s\n",wbuff);ev.events = EPOLLIN;ev.data.fd = clientfd;epoll_ctl(epfd, EPOLL_CTL_MOD, clientfd, &ev);}}}return 0;}
七、epoll的缺点
读写使用相同的缓冲区。比如上述的示例中,wbuffer和rbuffer是使用同一个缓冲区的,所以需要rbuff[ret] = ‘\0’;去除杂数据。
八、水平触发(LT)与边沿触发(ET)
8.1、两者差异
1、水平触发可以一次recv,边沿触发需要用循环来recv;
2、水平触发可以使用阻塞模式,边沿模式不能
3、两者性能差异非常小,一般小数据使用水平触发LT,大数据使用边沿触发ET
4、listen fd最好使用水平触发,尽量不要边沿触发
5、当当recv的buffer小于接受的数据时:
(1)水平触发是只要有数据就一直触发,直到数据读完;
(2)边沿触发是来一次连接触发一次,如果接受数据的buffer不够大,则数据会保留在缓冲区,下次触发继续从缓冲区读出来;
6、一般,水平触发只需要一个recv,边沿触发需要搭配while从缓冲区读完数据
8.2、设置触发模式
默认是水平触发模式,在事件中设置中 | EPOLLET 就可以设置边沿触发,不设置则默认是水平触发。
例如:
ev.events=EPOLL_IN | EPOLLET
九、常见疑惑问题
9.1、为什么提前先定义一个事件?
我们需要注册,内核才会有事件来的时候通知进程。比如生活中要退一个快递,那么我们需要注册一个快递公司的账户,然后发送一个退快递请求时快递公司才能找到你并取快递。
9.2、epoll events超出EVENTS_LENGTH?
epoll会循环拷贝红黑树结构体中的双向链表节点,读取节点数据,直到没有事件。
9.3、缓冲区有多大空间时才返回可读/可写?
只要缓冲区有空间就返回可读、可写,不管空间多少。比如缓冲区是1024,但是有1023有数据了,这种极端条件也会返回可读、可写。
9.4、recv和send放在一起时,有什么问题?
发送给客户端数据很大的时候(大于内核缓冲区),就可能出现send不全,客户端recv不全,最好用EPOLLOUT单独处理发送数据事件。
总结
本文介绍了网络IO模型,引入了epoll作为Linux系统中高性能网络编程的核心工具。通过分析epoll的特点与优势,并给出使用epoll的注意事项和实践技巧,该文章为读者提供了宝贵的指导。通过掌握这些知识,读者能够构建高效、可扩展和稳定的网络应用,提供出色的用户体验。
点击关注,第一时间了解华为云新鲜技术~
关键词:
-
-
-
-
RT-DETR:可以满足实时性要求的DETR模型
警惕致灾!北京河北多地极端降雨破纪录 降雨何时停?
山西王莽岭景区门票多少天有效?
殡仪馆年薪15万招遗体spa美容师引热议:含按摩 年薪15万
销量超过1000万份后 《暗黑4》后劲不足:70%玩家流失
2.5万元的Vision Pro有望降价 LGD打入供应链:索尼不再是独供
智能制造、智慧城市:数字孪生赋能智慧未来
交通运输部:上半年我国营业性客运量43.2亿人次 同比增长56.3%
工信部:全面进行新能源汽车安全隐患排查 起火3次以上的车型重点关注
发改委:全面落实带薪休假制度 鼓励错峰休假、弹性作息
日本央行发布季度报告:日本核心消费者通胀可能在年底前逐步放缓
十年前的今天红米手机诞生!消灭山寨机 推动智能机在全球普及
还盯着比亚迪海豚?降价4万的大众ID.3也许更香
米哈游又赢了!《原神》亿元盗版周边制售案告破
效果超越宣传片!国产虚幻5大作《影之刃零》Demo明年推出
长江存储致态TiPro7000 SSD新固件升级体验:读写速度飙升 更稳了!
科陆电子:美的集团在管理、技术、供应链、品牌影响力、渠道建设等方面可以对公司赋能
TOEFL | Reading · 题型总结
强降雨后泉水“活力大增” 趵突泉两天“长高”26厘米
12999元 联想拯救者Y9000X 2023开售:i9-13900H+RTX 4060
不愧是国产卷王!吉利缤瑞COOL冠军版官图曝光 或定价8万左右
《黑神话:悟空》要来了!即将举办千人线下试玩
长着一幅老路虎卫士的脸:哈弗全新SUV命名为猛龙!
《黑神话:悟空》线下试玩冲上热搜!美术总监暗示开发临到后期
山东海化:纯碱价格上涨会对公司业绩产生积极影响
直播平台源码开发,信息收发功能搭建
【机器学习】多变量线性回归
Power BI: PBIX与PBIT
交通运输部:上半年我国交通重大工程建设稳步推进
曝iPhone 15 Pro边框仅1.5mm 网友一句话神评:灵动岛毁所有
问界M5高速路撞上失控大货车:挡风玻璃都没裂
稳居第三大手机系统!华为鸿蒙OS 4即将发布:余承东出席或宣布最新装机量
巨大闪烁RGB:马斯克竖起大号“X”灯牌被指扰民
国内油价或将在8月9日实现四连涨 而且是大幅上调
“骨折价”仍难拉回销量—— 冷饮市场缘何旺季遇“冷”?
专访焰火总设计师:空中看大运会焰火是巨形金芙蓉花
北京最大降雨在房山,青年闻“汛”而动
大熊猫花花洗澡全国人民都知道了:白到发光
你怕失业吗?日本女学生害怕被AI取代而自杀:对比后感觉自己一无是处
中央气象台继续发布暴雨红色预警:台风“卡努”加强为台风级 路径调整
马斯克又放新预言:称2年内从缺硅变缺电
85%肉含量 一口爆汁!森马旗下烤肠大促29.9元3斤大促
垡头街道这三个小区终于用上了市政水
奔向辽阔|江南铸都的转型之路
山东3人团队打造史上最快拳击机器人:最低延迟仅12毫秒
印度问鼎人口第一大国背后:近一半人25岁以下 学历越高越找不到工作
明星刘维登不上母亲微信发文求助 聊天记录删除不能恢复:官方火速回应
苹果就是赚高端用户钱!iPhone 15系列完整爆料:Pro要涨价 边框窄到1.5mm
莫斯科遭无人机袭击第二天,多家俄媒称乌克兰全境发布防空警报
苹果良心?iPhone 15新细节大曝光:机身全新设计更好修 入门版不涨价反降
理想魔毯空气悬架车型破20万辆!魔毯空悬2.0来了
树下不能待!雷雨天这些“陷阱”要避开
想让英伟达对显卡降价不可能!消息称黄仁勋参与公司所有运营 对市场了如指掌
读发布!设计与部署稳定的分布式系统(第2版)笔记27_安全性下
“人生搜索引擎”登陆iPhone 黑镜成真了
OPPO K11明天首销:12+256仅1999元 4年不卡顿
点火开关已开启什么意思 点火开关是啥意思
代码随想录第四天|力扣24.两两交换链表节点、力扣19.删除链表的倒数第N个结点、力扣面试02.07链表相交、力扣142.环形链表
AI没抢走工作 可能先抢走你的“农夫山泉”
地球最早诞生的生命:光合作用都不存在 它们吃什么呢?
俄罗斯48核自主处理器大战华为/Intel:差太多了!
Intel自曝:3nm工艺良率、性能简直完美!
AMD中国特供显卡:RX 7900 GRE的核心偷偷变小了
造梦西游一怎么找龙王(造梦西游1龙王怎么进)
朱小杰家具设计(对于朱小杰家具设计简单介绍)
中国科学家主导!全球独一份的“脑地图”登上顶尖杂志
699元 华硕TUF小旋风Pro路由器明日开售:双2.5G口
武汉30米高桥跳江救人辅警韩靖,荣获二等荣誉奖章
欧拉函数
Spring Boot学习路线1
台风卡努直扑浙江:正好赶上天文大潮、近海将有10米狂浪
微软再现迷惑操作:强制用户使用Outlook网页版
九品装饰品牌介绍_九品装修公司
扶梯突然停运 乘客原地停留20分钟:别笑 这么做是对的!
mysql 简单进阶 ———— 重构查询[二]
中国三大红茶产地是哪里?有什么特点?
知名PS3模拟器RPCS3放弃Win7!将仅支持Win10/11系统
国产ACT大作!《失落之魂》新光追演示惊艳
从0开发属于自己的nestjs框架的mini 版 —— 终极篇
我要我们在一起 邓紫棋mp3 百度网盘_我要我们在一起 邓紫棋
【财经分析】大豆完全成本保险提振豆农积极性和种植信心
蔚来:好人就该被人拿枪指着?
4L油箱多跑80km、售价2000元 宝骏悦也增程器实体亮相
可怕!男子肠道长满200多个息肉:做了3个小时手术摘除
从0开发属于自己的nestjs框架的mini 版 —— Module篇
高质量发展调研行丨山东烟台:“老树新枝”打造发展新动能
Golang漏洞管理
泽璟制药:注射用ZG006获得药物临床试验批准通知书
韩国室温超导论文真假成谜 专家:极有可能只是假象
vivo首颗自研6nm芯片!V3影像芯片正式公布
这东西也敢偷?卖不掉,就扔进垃圾场……栽了!
深圳市住房和建设局:更好满足居民刚性和改善性住房需求 促进房地产市场平稳健康发展
《封神》票房跻身第四!国内7月总票房突破80亿元
华为暴涨58%!2023Q2中国手机市场销量数据出炉
被中消协点名后 妙鸭相机上架苹果应用商店:山寨App横行真假难分
骁龙870太坚挺!联想小新Pad Pro 12.7上架:2.9K高刷屏
曼联新赛季阵容基本完成升级,你认为这个阵容应该拿到什么成绩?
豆瓣7.7分 《封神第一部》票房破10亿:张颂文大赞世界级视听效果
一口下去嘎嘣脆!亲亲经典虾条大促:5件立减15元 17.9到手
“原来微信可以防拉黑”引热议 网友:就喜欢看不惯 又拉黑不了的样子