select、poll和epoll的区别(2)
导读:select、poll和epoll的区别,epoll_wait() 轮询所有的回调集合,并完成对应的 IO 操作。相应分三步: 阻塞线程 内核查找红黑树中准备好的 socket,放入就绪链表 rdlist 就绪列表中的内容
select、poll和epoll的区别
- 阻塞线程
- 内核查找红黑树中准备好的 socket,放入就绪链表 rdlist
- 就绪列表中的内容复制到 events(从内核态复制到用户态),准备循环处理这些已就绪的 socket 节点
示例:
int fds[] = ...;
int efd = epoll_create(...); //内核态创建epoll实例(包含红黑树rbTree和就绪链表readyList)
for (int i=0; i<fds.count; i++) {
epoll_ctl(efd, ..., fds[i], ...); //对红黑树操作,添加所有的socket节点
}
struct epoll_event events[MAX_EVENTS];
while(true) {
/*
1.阻塞线程
2.内核查找红黑树中准备好的socket,放入就绪链表rdlist
3.就绪列表中的内容复制到events
*/
int n=epoll_wait(efd, &events, ...);
if (n>0) {
for (i=0; i<n; i++) {
events[i].data.fd; // 这里有所有需处理的socket,不需要像select和poll那样全部遍历
}
}
}
优点:
- 没有 fd 限制,所支持的 fd 上限时操作系统的最大文件句柄数,1G 内存大概支持 10 万个句柄;
- 效率高,采用回调通知而不是轮询的方式,即使 fd 数目增加,时间复杂度仍为 O(1);
- 用户与内核空间基于一种内存映射文件的方法,使它们可以共享内存空间,减少文件从用户态移动到内核态带来的性能消耗。

LT 和 ET:
- LT,level triggered,水平触发,又叫条件触发。当被监控的 fd 上有可读写的事件时,epoll_wait() 会通知处理程序去读写。如果这次没有把数据一次性全部读写完,那么下次调用 epoll_wait() 时,它还会通知你上次没有读写完的 fd,可继续读写。而且我们不需要读写的 fd,它也会一直通知你。
- ET,edge triggered,边缘触发。当被监控的 fd 上有可读写事件时,epoll_wait() 会通知处理程序去读写。如果这次没有把数据全部读完,下次将不再通知。
- 学过计算机组成原理的应该知道脉冲信号,其实 ET 和 LT 的原理和电信号的变化差不多。LT 就是只有高电平(1)或低电平(0)时才触发通知,只要在指定的状态上,就会得到通知;ET 是只有电平发生变化时(从高电平到低电平,或者从低到高),才触发通知。
三者实践对比:
例如,100w 个连接,里面有 1w 个活跃连接。
select:不修改宏定义时,默认把 1024 个 fd 放到同一个进程。则需要 100w/1024 = 977 个进程才可以支持,会使得 CPU 性能特别差;
poll:没有最大文件描述符限制,100w 个连接则需要 100w 个 fd,遍历特别慢不说,还有空间拷贝还会消耗大量的资源;
epoll:请求进来时就创建 fd 并绑定一个回调地址,当活跃连接发起请求 IO 操作时,epoll_wait() 函数只需要遍历这 1w 个活跃连接,进行相应的额操作即可,既高效又不用做内存拷贝。
本文分享的select、poll和epoll的区别的相关内容,供网友参考,希望能解决您的问题。
相关阅读
-
电脑管家和360哪个好 关于电脑管理软件排行榜
一篇关于电脑管家和360哪个好和关于电脑管理软件排行榜的电脑方面的小经验,接下来IT袋带大家一起了解。 360是做安全起家的,说起安全杀毒、系统防护,个人认为360比较专业,防护比较全
-
荣耀x10和红米k40哪个好 手机性能参数对比
全面为您解析荣耀x10和红米k40哪个好和手机性能参数对比的相关知识,具体介绍如下: 手机确实不错,使用了一天,我是买了荣耀X10用了三天,感觉反应慢,再买了real meGT试了一下,当时就退
-
台式游戏电脑配置怎么选 玩游戏台式电脑最佳配置
全面为您解析台式游戏电脑配置怎么选和玩游戏台式电脑最佳配置的介绍,具体内容如下: 经过2022年的游戏混战以及各种跳票之后,2023年的游戏界也将涌现出一批让众多游戏玩家期待值拉满
-
一键安装win10系统哪个好用 电脑系统坏了修复小妙招
如果想知道一键安装win10系统哪个好用和电脑系统坏了修复小妙招的话题,一起来了解了解吧。 电脑作为现在人们日常办公的一项重要工具,经常会涉及到一个问题:重装系统。之所以要重装


