epool基本概念
是什么?
改进的pool,一种I/O多路复用技术,可管理大批量文件描述符。
工作原理?
内核中,一切皆文件,epoll向内核注册一个文件系统,用于存储要管理的文件描述符号。调用epoll_create时,会在虚拟文件系统中创建一个file节点服务epool同时也会创建就绪事件list链表。
操作系统启动后,会开辟出自己的高速cache,socket问价描述符会以红黑树存入cache,方便查找、插入、删除。
epool_ctl,把socket放到epool文件系统里file对应的红黑树,也会注册一个回调函数,文件描述符有信号后,会调用该组册函数,内核把网卡数据copy到内核中把socket插入就绪列表中。
epoll_wait调用时候,看一眼就绪列表,所以效率很高。监控百万描述符,但是准备就绪fd却很少。
适用场景?
非常适用大量并发连接中只有少量活跃连接情况,且在该情况下CPU适用率很低。
可能缺点?
所有socket基本都是活跃的,比如在一个高速的LAN环境,使用epool可能会比select/pool效率低
分为LT和ET
LT和ET作用在epool_wait过程中,LT模式下,只要一个文件描述符没有处理完,后续再次调用epool_wait时也会返回。实现过程为,内核会把socket事件插入就绪链表,epool_wait调用会被把就绪的文件描述符拷入用户态,清空就绪链表,如果是ET则额外检测如果存在没有处理文件描述符,则将再次放入就绪列表中。
epool例子
epoll_create函数
用途:创建一个epool事件管理并返回描述符号1
2
int epoll_create(int size);
参数:size 最大fd数
返回值:epool使用的文件描述符
- -1 失败
- >= 0 成功
epoll_ctl函数
用途:控制epoll事件,添加修改删除事件1
2
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数:
epfd:epoll_create的返回值
op:要进行的操作例如注册事件,可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修 改、EPOLL_CTL_DEL 删除
fd:要在epool事件管理上加入删除或者修改的文件描述符
event:event.data.fd 要处理的文件描述符
event:event.events = EPOLLIN|EPOLLET;
EPOLLIN :表示对应的文件描述符可以读;
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET:边缘触发;
返回值:成功返回0,失败返回-1
When successful, epoll_ctl() returns zero. When an error occurs, epoll_ctl() returns -1 and errno is set appropriately
epool_wait函数
用途:返回IO事件就绪的fd1
2int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
参数:
epfd:epoll_create的返回值
events:取出内核结果的事件数组
maxevents:要处理的事件数
timeout:等待IO发生超时值
-1 阻塞直到有事件
0 非阻塞
>0: 阻塞时间,单位毫秒
epoool函数实例
1 |
|