首页 > 其他 > 详细

关于epoll,select,poll的理解

时间:2019-05-29 19:33:09      阅读:106      评论:0      收藏:0      [点我收藏+]

select: 轮询+fd_set

1.采用fd_set存储fd(fd_set通过数组位图实现)

2.每次调用select,都需要把fd集合从用户态拷贝到内核态,fd越多开销越大

3.每次调用select,都需要在内核遍历传递进来的fd,开销大(轮询)

4.select支持的fd数量太少,1024

5.调用select,返回的是含有整个句柄的数组,需要遍历整个数组才知道哪些句柄发生了事件(轮询)

6.select的触发是LT模式,效率不高


poll:轮询+链表

1.采用链表存储fd,没有了fd数量限制,但是上述其他缺点依然存在


epoll:红黑树+双链表+回调机制

1.红黑树挂载事件,事件发生时通过回调机制将事件添加到双链表中

2.检查是否有事件发生时,不需要轮询,只需要检查双链表即可

3.保证每个fd只会被拷贝一次(事件被加入到epoll中时,fd就会被拷贝进入内核,而不是在epoll_wait时拷贝)

4.fd数量上限为最大可以打开的文件数目

该双链表我们一般叫做就绪事件链表


//先码着,后面准备自己实现一下这三种机制



关于epoll,select,poll的理解

原文:https://www.cnblogs.com/yinbiao/p/10945624.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!