区别
-
select
通过在内核和用户空间传递固定长度的事件组实现I/O事件的可读可写通知,值拷贝的方式占用了更多的内存空间,遍历固定长度的事件组以确定某个发生的事件,其复杂度为O(n),当规模较大时开销较大。 -
poll
与select一样,区别仅在于将固定长度的事件组用链表实现,突破了最大长度限制,复杂度仍为O(n)。 -
epoll
最大的区别在于提前注册,返回的链表中每一个都是可读/写的,省去了遍历,所以复杂度为O(1)。
有问题的地方:
- epoll使用红黑树辨别插入过的事件复杂度为O(logn)
- select 用数组 如果fd按顺序排布一一对应就可以形成hash映射定位插入过的节点复杂度为O(1)
参考代码
- select
...
/*select声明的最大监控数组*/ std::vector<int> readfds_arry(1024,-1);//readfds_arry保存读事件的\文件描述符
...
W> for(int i=0;i<readfds_arry.size();i++){
if(FD_ISSET(readfds_arry[i],&readfds))
{
if(readfds_arry[i]==listen_sock){
//有新链接到来
struct sockaddr peer;
socklen_t len;
int newfd=accept(listen_sock,&peer,&len);
cout<<newfd<<endl;
//将新链接设置进readfds_arry数组中
AddfdsArry(readfds_arry,newfd);
}
else