EPOLL&POLL*SELECT对比区别

来源:互联网 发布:淘宝上开网店步骤 编辑:程序博客网 时间:2024/06/06 00:32

select

1. 函数 int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,int timeout);
函数通过结构体fd_set结构体监控可读可写或者异常事件,我们通过FD_SET(int fd,fd_set* fd_set) 对监控事件进行设置并利用int FD_ISSET(int fd,fd_set* fd_set) 并到来的事件进行判断。
2. select函数可以通过结构体中fd_set存储限制了select监视fd数量的最大数。我们一般在32位机中是32*32=1024。
3. select对socket进行扫描是线性扫描,select返回的只是有多少个就绪事件,但是没有告诉具体哪个事件活跃。因此我们需要对监听的时间进行逐个扫描,确定活跃连接。
4. 内核空间和用户空间之间传递数据结构复制开销大。

poll

1. 通过函数 int poll(struct pollfd* fds,nfds_t nfds,int timeout)进行设置,struct pollfd* fds时输入输出参数,struct pollfd{int fd,short events,short revents},我们通过对events设置我们感兴趣的事件,通过对revents判断活跃连接的到来。
2. poll在内核中是通过链表对连接进行存储,所以最大连接数取决于系统资源。
3. 但是我们知道poll还是通过线性扫描来确定活跃的链接。
4. 效率方面同样有用户空间和内核空间复制问题带来的效率问题。

epoll

1. int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);struct poll_event* events是传出参数,我们可以通过这个得知具体的活跃连接,而不需要通过select或poll的线性遍历进行。在多连接少活跃事件具有很高的效率。
2. 没有最大连接数的限制,epoll中1G内存机器上可以打开10万个连接左右。
3. 通过int epoll_create(int size);将返回内核事件表,这里就在内核中开辟了共享内存,提高了我们数据复制的效率。
4. 支持LT和ET二种工作模式。

原创粉丝点击