【计算机网络】多路转接之epoll

epoll也是一种linux中的多路转接方案(epoll也是只负责IO过程中的"等")

一、epoll相关接口的使用

1.epoll_create

int epoll_create(int size**);**

功能:创建一个epoll模型


int size:没意义了 >0就行

返回值:返回一个文件描述符

2.epoll_ctl

int epoll_ctl(int epfd**,** int op**,** int fd**,** struct epoll_event * event**);**

功能:用户告诉内核,哪些sock的哪些事件OS要关心


int epfd:epoll_create()函数的返回值;

int op:增、改、删(EPOLL_CTL_ADD、EPOLL_CTL_MOD、EPOLL_CTL_DEL

int fd:OS要关心的fd

struct epoll_event *****event:事件

返回值:成功返回0;失败返回-1

3.epoll_wait

int epoll_wait(int epfd**,** struct epoll_event * events**, int** maxevents**,** int timeout**);**

功能:内核告诉用户,哪些sock的事件就绪了


int epfd:epoll_create()函数的返回值

struct epoll_event * events:struct epoll_event类型的数组(输出型参数)

int maxevents:数组的长度(输出型参数)

int timeout:同poll (>0在timeout以内阻塞, 否则非阻塞返回一次; =0非阻塞等待; <0阻塞等待)

返回值:和select/poll一模一样

4.struct epoll_event结构体

二、epoll的原理

三、epoll工作方式

epoll有两种工作模式:水平触发LT (Level Triggered )和边缘触发ET (Edge Triggered)


事件就绪:底层的IO条件满足,可以进行某种IO行为了,就叫做事件就绪

例如:缓冲区有数据 -> 读就绪;缓冲区有空间 -> 写就绪

select/poll/epoll都负责"等",事件就绪以后会给用户通知;通知机制,有没有策略呢?

有策略:LT、ET -> IO就绪事件的通知机制

1.LT模式

(1)LT工作模式 :只要底层有数据没读完,epoll就会一直通知用户要读取数据​​​​​​​

(2)LT支持:阻塞读写和非阻塞读写(LT用的fd可以是阻塞式也可以是非阻塞式的)

2.ET模式

(1)ET工作模式:不管底层数据是否读完,epoll都不在第二次通知用户,除非数据变化的时候(数据增多),才会在通知你一次

(2)LT支持:只支持非阻塞读写(ET用的fd必须是非阻塞式的)

(3)ET模式的高效

① 体现在通知机制上(就通知一次)

② 倒逼上层尽快把数据取走,提高底层的数据发送效率

相关推荐
郝学胜_神的一滴2 分钟前
C++11 工程级应用 06:自己造一个类似Python的Range迭代器
c++·后端
张炯炯2 分钟前
个人RAG上线翻车实录-记一次 API 延迟排查
后端
一只QAQ11 分钟前
c++项目
java·c++·算法
新时代牛马11 分钟前
epoll 源码路径:从epoll_ctl 到ep_poll 的就绪唤醒
网络·数据库·网络协议
简单Janeee12 分钟前
[Vue 3 从零到上线]-第九篇:更美更强——引入 UI 库与网络请求 (Axios)
网络·vue.js·ui
学习星球15 分钟前
空天地一体化网络(NTN)深度解析:从Starlink D2C到3GPP NTN,卫星直连手机是如何实现的?
网络·人工智能·算法·智能手机·php
小蒜学长18 分钟前
基于SpringBoot + Vue的智能健身房管理系统的设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端
DolitD19 分钟前
云流技术深度剖析:单服务器下如何实现3D应用的多实例并发?
java·服务器·前端·3d·云原生·云计算
jun_bai23 分钟前
Ecplise中发布项目到配置的tomcat中
java·服务器
芦柑46426 分钟前
画布和3D导演台工具:短剧分镜从素材整理到空间预演的完整链路
服务器·前端·数据库