请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

select、poll、epoll 之间的区别与共同之处,你觉得你讲清楚了吗? 全篇说不到重点上

正在回答 回答被采纳积分+3

5回答

柴犬小丸子 2019-07-29 14:15:47

这个老师确实。。。一般般

2 回复 有任何疑惑可以回复我~
Jeson 2020-12-14 16:37:49

https://img1.sycdn.imooc.com//szimg/5fd7245908f36dcd14100554.jpg


如图上图:select和poll在内核中也对应fd_set数组,可以看到这是从用户态拷贝到内核中的,而epoll的fd_set数组是内核中的数据结构,这是我们已知的二者的大不同;正因为如此,select和poll的fd_set数组,就是普通的数据,没有任何的附加功能,因此IO多路复用,硬件事件发生后(也称就绪状态),会直接赋值到这个fd_set数组中;而select和poll在每一次阻塞-唤醒,这一过程中,至少有1到n次的select的轮询工作;===》select和poll需要遍历,epoll同样也得遍历,但是epoll的机制在于遍历的内容少的吓人,epoll中内核所谓的fd_set集合,并不是遍历的对象,他其中每一个fd都对应回调函数,当就绪事件发生后,将这个真正有事件的fd连同事件,一块放到一个epollfd就绪队列中。

可以看到,每一次epoll遍历仅仅是这个fd就绪队列,这个队列中的fd全部都是就绪的,甚至可以这么说,epoll就压根没有遍历,只需判断一下fd就绪队列是否为空,不为空就返回,因此效率惊人,同比100w个fd做监视,对于那种网卡类的稀疏网络事件的情况(也就是大部分时间,甚至99%以上的时间都没事干,没流量),select和poll一般至少要遍历100w次或者200w次,甚至设置超时时间的话,在等待超时时间这段cpu就爆满了;

==》但是epoll仅仅遍历1次?2次?最坏的等待超时也仅仅是n次,数量级差太多了,这也就是epoll的优势,总结一下,也就是epoll单独搞了一个fd就绪队列的模式,减少了遍历!


1 回复 有任何疑惑可以回复我~
  • 蕉狸 #1
    老师,有一点没听懂想问一下,这里select和poll都是对fd_set数组进行了遍历,这个数组是前面模块示意伪代码中已经select后的stream吗,那不就也是就绪的fd吗?如果不是,那select这步操作是在什么时候处理的呢?
    回复 有任何疑惑可以回复我~ 2021-10-27 15:41:48
Jaswen 2021-01-09 11:02:20

我也觉得这老师有点水,视频质量一般般,最基本的笔记都没有,学的真他妈蛋疼

0 回复 有任何疑惑可以回复我~
慕设计4118615 2020-12-11 21:49:39

讲的模模糊糊的

0 回复 有任何疑惑可以回复我~
Jeson 2019-01-05 17:42:57

他们共同之处都是处理IO复用的模型,区别在具体的实现逻辑


0 回复 有任何疑惑可以回复我~
  • 老师我也没有听懂,你好像只讲了select是在for循环之前就判断了是否有数据流
    回复 有任何疑惑可以回复我~ 2019-04-17 23:13:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信