poll,作为select和epoll的中间过渡件,(1)和select类似的是:同样存在用户态拷贝到内核态,从内核态拷贝到用户态,poll返回需要轮询才能直到那个事件发生了,相当于3次操作(拷贝+轮询)(2)和epoll类似的是提出了POLLIN、POLLOUT等概念。区别:(1)和select区别:最大的区别是少了while循环开始的临时拷贝,其次是1024监听数量的限制。这里是最有意思的,源于pollfd结构,有三个成员:fd、events关心的事件类型(输入,POLLIN等宏)、revents内核返回事件发生了(返回),我觉得最有意思的就是revents,这东西小于等于0内核直接忽略(pollfd的数组中大量是小于等于0的),poll返回的是revents大于0的那些事件,也就避免了while刚开始的临时拷贝(2)select/poll没有避免用户到内核、内核到用户、用户态的轮询问题。怎么解决,epoll出现了--用户到内核需要拷贝(select/poll/epoll三个都需要),内核到用户需要拷贝(注意:若100W的socket,此时只有1w事件发生了,select/poll需要拷贝100W个,而epoll需要拷贝1w个),轮询(select/poll需要轮询100W个,而epoll需要轮询1w个),epoll之所以高效,核心是因为它只关心此时已经发生的事件!!!这样想来,这个idea是平凡的,还能在优化了,不,因为epoll只处理发生的事件,已经最优了
1

相关推荐

不愿透露姓名的神秘牛友
05-01 13:13
ecece:这么明目张胆虚报就业率啊
点赞 评论 收藏
分享
牛客网
牛客企业服务