select poll epoll总结区别

最下边是别人的文章,写的非常好。其中有几点摘出来再细说下:

select  poll归为一类说:

1.select和poll区别是文件描述符数量多少差别,select 用数组记录套接字,poll用的链表。本质没啥区别的。找几个代码例子就能看出来。

2.select和poll相同点,都是轮循,比如有1000个需要监控的TCP连结,同一时间活跃的有10个,那么他们会把1000个套接字标志传到内核,内核遍历1000遍,发现有10个活跃的,修改这10个套接字中状态为可读。然后再传到用户进程遍历1000遍,看看哪个套接字对的状态为可读的。

可以看出,效率低的2点: (1)每次循环3000次,(2)每次拷贝2000个

3.关于这一点:s触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO操作,那么之后每次调用还是会将这些文件描述符通知进程。

做游戏服务器的一般不存在这点。

epoll 归为一类,是如何解决select和poll 效率低的问题呢?

1.epoll监控tcp连接用的红黑树,添加到内核后,不需要再次添加重复连接。如果继续用上边的数据例子,那么(1)一共循环1000 Log1000 ,加上 每次活跃的 10个  (2)每次拷贝10个

2.每帧检测活跃的套接字会放到双列表里,送到用户进程也就10个

深度理解select、poll和epoll_傻眼哥的博客-CSDN博客

如果这篇文章说不清epoll的本质,那就过来掐死我吧! (1) - 知乎 (zhihu.com)

当你看完这两篇文章时回答这几个问题:

1.当网络数据到达时,网卡发送中断信号给CPU,然后进行数据分类拷贝到对应的套接字,然后唤醒进程A。问题:怎么知道这个套接字属于哪个进程呢?或者说CPU怎么知道应该唤醒进程A,而不是B呢?

原文地址:https://www.cnblogs.com/workharder/p/14864369.html