现在的位置: 首页 > 综合 > 正文

epoll高效原因分析及其开发框架

2013年12月09日 ⁄ 综合 ⁄ 共 1023字 ⁄ 字号 评论关闭

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);

        }

   }

}

抱歉!评论已关闭.