1. Epoll 最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,因此在实际的网络环境中, Epoll 的效率就会远远高于 select和 poll 。
当有 I/O 事件到来时select会返回通知,应用程序需要轮询所有FD集合查找可读/写事件
int res = select(maxfd+1, &readfds, NULL, NULL, 100);
if (res > 0)
{
for (int i = 0; i < MAX_CONNECTION; i++)
{
if (FD_ISSET(allConnection[i], &readfds))
{
handleEvent(allConnection[i]);
}
}
}
if (res > 0)
{
for (int i = 0; i < MAX_CONNECTION; i++)
{
if (FD_ISSET(allConnection[i], &readfds))
{
handleEvent(allConnection[i]);
}
}
}
当有 I/O 事件到来时epoll会通知,并且返回所有I/O事件,应用程序无需遍历所有FD集合,在一个大规模并发的服务器中,轮询IO是最耗时间的操作之一.
int res = epoll_wait(epfd,events,20,100);
for(int i=0; i<res; i++)
{
handleEvent(events[n]);
}
但是,如果没有大量的idle -connection或者dead-connection,epoll的效率并不会比select/poll高很多,只有当我们遇到大量的idle- connection(例如WAN环境中存在大量的慢速连接),才会发现epoll的效率大大高于select/poll。
从上面的分析可以看出,epoll相对select实际上是一个用空间换时间思想的具体应用.
2.Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大 ,具体数目可以 cat /proc/sys/fs/file-max 察看。
3.内存拷贝, Epoll 在这点上使用了“共享内存 ”,这个内存拷贝也省略了。