Linux2.6内核中提供了网络I/O性能的更加高效的epoll方法,利用该方法可以方便的实现对大量并发请求的处理,完成服务器和客户端的交互。
1.epoll如何实现高效并发处理
1) 支持一个进程打开大数目的socketfd(socket描述符)
epoll支持的fd上限是最大可以打开文件的数目,这个数字一般远大于select默认最大值2048。因此可以满足连接数目较大服务器。
2) 效率不会随socketfd数目增加而线性下降
select/poll每次调用都会线性扫描全部的集合,当socket fd集合增大时,效率会呈现线性下降。而epoll只会对"活跃"的socket进行操作,所以能够保证效率。
3) 优化内核与用户空间的消息传递效率
epoll通过mmap来实现内核到用户空间的消息传递,避免内核到用户空间的内存拷贝。
2. 开发框架
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, nfds, epollfd;
epollfd = epoll_create(10); //创建文件描述,设定将可管理的最大socket描述符数目
ev.events = EPOLLIN;
ev.data.fd = listen_sock;
epoll_ctl(epollfd, EPOLL_CTL_ADD,listen_sock, &ev); //函数注册监听函数
for (;;) {
nfds =epoll_wait(epollfd, events, MAX_EVENTS, -1); //等待epoll事件发生
for (n = 0; n < nfds; ++n) {
if (events[i].data.fd == listener_fd) {
HandleAccept(events[i].data.fd);
continue;
}
if (events[i].events & EPOLLIN) {
HandleRead(events[i].data.fd);
}
if (events[i].events &EPOLLOUT) {
HandleWrite(events[i].data.fd);
}
}
}