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模式的高效
① 体现在通知机制上(就通知一次)
② 倒逼上层尽快把数据取走,提高底层的数据发送效率