☰
select/poll/epoll多路转接
2026/10/18 5:49:06 网站建设 项目流程

1.poll

1.1 是什么&为什么

1.2 怎么做



比如我们关心文件描述符0,3,4的读事件,fd_set就是11001,高位省略,如果3和4都检测到了读事件就绪,返回的时候因为0没就绪,就把文件描述符对应比特置0,返回的readfds就是11000,也就是把设置为1的比特,没有就绪的置0,readfds作为输入输入型参数会相互影响

1.我们一般不会同时关注读写事件,一般是先读后写,或者先写后读
2.对读事件来讲,一般默认是不就绪,写事件默认就绪,对于写事件,一般不会常设,按需设置
3.后续代码,暂时只关注读事件

实验
echoserver
1.一个tcp服务器,最开始有一个fd,监听socket,随着连接增多,fd增多
2.listen sockfd直接调用accept(等+获取连接),本质当做IO来看,listensock等待工作交给select来检测读事件是否就绪

1.3 原理



select优点
聚合IO,提高效率(多路转接的优点)

select 基于多路转接的就绪事件通知机制 事件派发 基于事件进行编程的模式

内核实现简化版

使用select实现简单server代码
https://gitee.com/sunanfeng/linux-code-replication/blob/master/test_10_12/Select/SelectServer.hpp

2.poll

select主要问题,可等待的文件描述符个数有限
循环遍历
参数耦合

poll解决了可等待的文件描述符个数有限和参数耦合

poll只负责等,等num个fd,就绪事件通知机制,作用等同于select

有意思的是,poll的代码把数组设为4096个元素大小,超过了进程能打开的文件描述符个数
这就引出一个问题,select在我的云服务器上完全够用了,进程打开的文件描述符个数也是有限的,要把问题分开来看,进程可打开文件描述符个数有限不是select参数设置导致可等待的文件描述符个数有限的理由,这是接口的问题,因为进程可打开的文件描述符个数和平台有关,如果是企业级的,一般是65535,API要有能力处理文件描述符数量巨大的情况

epoll能解决,但是epoll要做更多事情,就比较重,一般select和poll适用于轻量级,文件描述符个数有限;如果文件描述符个数多就用epoll,不过是各司其职,各找其位罢了

按照man手册的说法,epoll是为处理大批量句柄做了改进的poll,在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),几乎具备一切优点,公认Linux2.6及以后版本性能最好的多路I/O就绪通知方法

函数签名

3.epoll

3.1 原理


epoll_ctl会把激活函数设置到fd的传输层回调






硬件上从网络里收到了数据,网卡通过硬件中断告诉OS有数据,OS把数据从外设搬到内存,形成sk_buff,自底向上交付,到传输层,把sk_buff链入到recvive_queue,OS会自动判断回调指针是否为空,非空就调用,把红黑树节点->就绪节点

epoll_create的size参数,为了向后兼容,新的程序能够在老的机器上跑,size刚开始是用户告诉内核大概需要多少文件描述符,1内核好开辟空间,可以动态扩展,现在不需要,内核直接动态开辟,但是为了兼容还要传,size>0

epoll_ctl和wait一定会涉及到内核和用户空间的拷贝event

epoll的红黑树类似select/poll的数组

vscode代码8000行之上代码可能会卡

remote ssh
remote wsl 虚拟机/OS


等待的fd约定,epoll效率越高,由于聚合fd越多,单位时间内等的比重降低,检测O(1),处理就绪事件O(N)
没有mmap映射

3.2 工作模式


LT和ET最早来源于数字电路与计算机硬件中断,LT是高电平为1,也就是信号的值,ET是上升沿为1,也就是信号的变化,为有效信号,计数器++,后来计算机设计时感觉epoll的通知机制和ET和LT很像,沿用,包括示波器也是

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询