首页 > 其他分享 >epoll、poll、select

epoll、poll、select

时间:2024-05-15 19:21:29浏览次数:29  
标签:文件 epoll 描述符 Linux poll select

`epoll`、`select` 和 `poll` 都是在 Linux 系统中用于实现 I/O 多路复用的机制,它们都能够实现在多个文件描述符上进行非阻塞的 I/O 操作,并在有 I/O 事件发生时通知应用程序。以下是它们的一些比较:

1. **`select`**:
- `select` 是 Unix 系统最早的一种多路复用机制之一。
- 它采用轮询的方式监视一组文件描述符,当其中任何一个文件描述符上有 I/O 事件发生时,就通知应用程序。
- 在 Windows 平台上也有相应的实现,名为 `WSASelect`。

2. **`poll`**:
- `poll` 是 `select` 的改进版本,解决了 `select` 的一些限制。
- 它同样采用轮询的方式监视一组文件描述符,但是不受文件描述符数量的限制,因为内核使用链表来存储监视的文件描述符。
- `poll` 使用 `pollfd` 结构来表示文件描述符及其关注的事件。

3. **`epoll`**:
- `epoll` 是 Linux 特有的一种 I/O 多路复用机制,是 `poll` 的进一步改进。
- 它采用事件驱动的方式,内核会在文件描述符上发生事件时通知应用程序,避免了轮询的开销。
- `epoll` 支持边沿触发(Edge Triggered)和水平触发(Level Triggered)两种模式,可以更精确地控制事件通知。
- `epoll` 使用三个系统调用 `epoll_create`、`epoll_ctl` 和 `epoll_wait` 来实现对事件的操作和等待。

在实际应用中,`epoll` 的性能通常优于 `select` 和 `poll`,尤其在处理大量连接时。因此,在 Linux 下开发网络服务器时,通常会优先选择 `epoll`。

 

select解决的poll问题:

`select` 解决了 `poll` 的两个主要限制:

1. **文件描述符数量的限制**:
- 在一些早期的 Unix 系统中,`poll` 函数的参数是一个数组,它的大小是固定的,通常是 `FD_SETSIZE`,即能够监视的文件描述符数量是有限的。
- 而 `select` 使用了一种位图的方式,它将所有要监视的文件描述符构成一个位图,可以监视的文件描述符数量理论上是没有限制的(实际上,也会受到系统资源的限制,但比 `poll` 更大)。

2. **效率问题**:
- `poll` 每次调用都要传递一个大的数组,即使只有少数的文件描述符发生了事件,内核也会检查数组中的每一个文件描述符,因此当文件描述符数量很大时,效率可能会比较低下。
- `select` 使用了位图的方式,内核只需要检查被置位的文件描述符,因此在文件描述符数量较大时,效率更高。

总的来说,`select` 解决了 `poll` 中的文件描述符数量限制和效率问题,因此在一些早期的 Unix 系统中,`select` 比 `poll` 更常用。但是在现代的 Linux 系统中,通常会优先选择 `epoll`,因为它更加高效和灵活。

epoll解决的select问题:

在选择使用 `epoll` 而不是 `select` 的原因主要有以下几点:

1. **性能优势**:
- `epoll` 使用了事件驱动的方式,当文件描述符上有事件发生时,内核会立即通知应用程序,而不需要像 `select` 那样需要轮询所有的文件描述符。因此,在处理大量连接时,`epoll` 的性能通常优于 `select`。

2. **支持大量文件描述符**:
- `epoll` 没有像 `select` 那样受到文件描述符数量限制,可以处理更多的文件描述符,因此在高并发环境下更为适用。

3. **支持边沿触发模式**:
- `epoll` 支持边沿触发(Edge Triggered)模式,可以更精确地控制事件的通知,只有当状态变化时才会通知应用程序,而 `select` 和 `poll` 只支持水平触发(Level Triggered)模式。

4. **更少的系统调用**:
- 使用 `epoll` 只需要三个系统调用 `epoll_create`、`epoll_ctl` 和 `epoll_wait`,而 `select` 需要调用 `select` 函数,同时需要维护 `fd_set` 集合,因此 `epoll` 的系统调用次数更少,效率更高。

综上所述,`epoll` 在处理高并发、大量连接的网络应用中表现更为优越,因此在现代的 Linux 系统中,通常会优先选择使用 `epoll`。

标签:文件,epoll,描述符,Linux,poll,select
From: https://www.cnblogs.com/whcjob/p/18194533

相关文章

  • Selenium4自动化测试7--控件获取数据--radio单选框、select下拉框选择、iframe
    7-radio单选框 importtimefromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy#定义一个driver的变量,用来接收实例化后的浏览器#指定浏览器的位置,解决浏览器驱动和浏览器版本不匹配的问题chrome_location=r'D:\pythonProject2023\Seleni......
  • k8s nodeName与nodeSelector的简单应用(转)
    原文:https://blog.csdn.net/xhredeem/article/details/127687465作者:xhredeem来源:CSDN默认情况下,k8smaster管理节点有污点标签,默认是NoSchedule,即不会被调度。新创建的pod会随机选择除了master管理节点的以外的node工作节点上创建。如果想要使某个新建pod在某个node节点创建......
  • 1250 - Table 'd' from one of the SELECTs cannot be used in field list
    1问题描述sql数据库查询接口union后orderby某字段,提示错误“1250-Table'd'fromoneoftheSELECTscannotbeusedinfieldlist“。移除orderby条件,就不会报错,但是不满足按照某个字段排序。 2方案解决修改排序条件为:orderbystatId即可。(union后的结果是字段......
  • mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nona
    官方解释:ONLY_FULL_GROUP_BY是MySQL数据库提供的一个sql_mode,通过这个sql_mode来保证,SQL语句“分组求最值”合法性的检查.这种模式采用了与Oracle、DB2等数据库的处理方式。即不允许selecttargetlist中出现语义不明确的列.对于用到GROUPBY的select语句,查出......
  • Selenium4自动化测试3--元素定位By.NAME,By.LINK_TEXT 和通过链接部分文本定位,By.PARTI
    4-通过名称定位,By.NAMEname属性为表单中客户端提交数据的标识,一个网页中name值可能不是唯一的。所以要根据实际情况进行判断 importtimefromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy#指定浏览器的位置,解决浏览器驱动和浏览器版本不匹配......
  • ohohoh--IO多路复用之最后一个epoll
    通知:epoll是仅限于在Linux上的函数->其正常流程可参考其他的,这里不多赘述,我主要想说的是非阻塞的套接字边缘模式多线程epoll(很绕,我懂)。。。先上源代码#include<iostream>#include<string.h>#include<arpa/inet.h>#include<sys/select.h>#include<sys/epoll.h>#include......
  • antd在form中一个select设置另一个select
    需求:所属网络(select)变化的时候,对应空投合约(select)也跟着变化。 constonChainChange=(chainId:any)=>{setCurrChainId(chainId)constcurrOptions=extraObj.airdropContractFormOptions.map((item:any)=>{if(item.network_id===chainId){......
  • 同事使用 insert into select 迁移数据,开开心心上线,上线后被公司开除!
    作者:xlecho链接:https://juejin.cn/post/6931890118538199048血一般的教训,请慎用insertintoselect。同事应用之后,导致公司损失了近10w元,最终被公司开除。事情的起因公司的交易量比较大,使用的数据库是mysql,每天的增量差不多在百万左右,公司并没有分库分表,所以想维持这个表......
  • IO多路复用之select
    (select是跨平台的,这里我们基于Linux)先了解基本的原理select:我们要明白在服务器端:有两种缓冲区:一是监听与服务器连接的读写缓冲区,一种是与服务器通信的读写缓冲区。。。(服务器)按照正常的套接字通信流程:socket(得到一个监听的文件符号)->bind->listen,到这里,我们循环调用select,至此......
  • WPF DataContext="{Binding SelectedItem,ElementName=_master}"
    <Windowx:Class="WpfApp80.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.......