epoll简介
epoll 是Linux内核中的一种可扩展IO事情处理机制,最早在 Linux 2.5.44内核中引进,可被用于替代POSIX select 和 poll 体系调用,并且在具有许多应用程序恳求时能够取得较好的功能( 此刻被监督的文件描述符数目十分大,与旧的 select 和 poll 体系调用完结操作所需 O(n) 不同, epoll能在O(1)时刻内完结操作,所以功能适当高),epoll 与 FreeBSD的kqueue相似,都向用户空间供给了自己的文件描述符来进行操作。
[cpp] view plaincopy
int epoll_create(int size);
创立一个epoll的句柄,size用来告知内核需求监听的数目一共有多大。当创立好epoll句柄后,它便是会占用一个fd值,在linux下假如检查/proc/进程id/fd/,是能够看到这个fd的,所以在运用完epoll后,有必要调用close() 封闭,不然或许导致fd被耗尽。
[cpp]view plaincopy
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll的事情注册函数,第一个参数是 epoll_create() 的回来值,第二个参数表明动作,运用如下三个宏来表明:
[cpp] view plaincopy
EPOLL_CTL_ADD //注册新的fd到epfd中;
EPOLL_CTL_MOD //修正现已注册的fd的监听事情;
EPOLL_CTL_DEL //从epfd中删去一个fd;
第三个参数是需求监听的fd,第四个参数是告知内核需求监听什么事,struct epoll_event 结构如下:
[cpp] view plaincopy
typedef union epoll_data
{
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
events 能够是以下几个宏的调集:
[cpp] view plaincopy
EPOLLIN //表明对应的文件描述符能够读(包含对端SOCKET正常封闭);
EPOLLOUT //表明对应的文件描述符能够写;
EPOLLPRI //表明对应的文件描述符有紧迫的数据可读(这儿应该表明有带外数据到来);
EPOLLERR //表明对应的文件描述符产生过错;
EPOLLHUP //表明对应的文件描述符被挂断;
EPOLLET //将EPOLL设为边际触发(Edge Triggered)形式,这是相关于水平触发(Level Triggered)来说的。
EPOLLONESHOT//只监听一次事情,当监听完这次事情之后,假如还需求继续监听这个socket的话,需求再次把这个socket加入到EPOLL行列里。
当对方封闭衔接(FIN), EPOLLERR,都能够认为是一种EPOLLIN事情,在read的时分别离有0,-1两个回来值。
[cpp] view plaincopy
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
参数events用来从内核得到事情的调集,maxevents 告之内核这个events有多大,这个 maxevents 的值不能大于创立 epoll_create() 时的size,参数 TImeout 是超时时刻(毫秒,0会当即回来,-1将不确认,也有说法说是永久堵塞)。该函数回来需求处理的事情数目,如回来0表明已超时。 咱们现在的网络模型大都是epoll的,由于epoll模型会比select模型功能高许多, 尤其在大衔接数的情况下,作为后台开发人员需求了解其间的原因。
select/epoll的特色: select的特色:select 挑选句柄的时分,是遍历一切句柄,也便是说句柄有事情呼应时,select需求遍历一切句柄才干获取到哪些句柄有事情告诉,因而功率是十分低。可是假如衔接很少的情况下, select和epoll的LT触发形式比较, 功能上不同不大。 这儿要多说一句,select支撑的句柄数是有约束的, 一起只支撑1024个,这个是句柄调集约束的,假如超越这个约束,很或许导致溢出,并且十分不容易发现问题, TAF就呈现过这个问题, 调试了n天,才发现:)当然能够经过修正linux的socket内核调整这个参数。
epoll的特色:epoll关于句柄事情的挑选不是遍历的,是事情呼应的,便是句柄上事情来就立刻挑选出来,不需求遍历整个句柄链表,因而功率十分高,内核将句柄用红黑树保存的。 关于epoll而言还有ET和LT的差异,LT表明水平触发,ET表明边际触发,两者在功能以及代码完成上不同也是十分大的。