LWN: epoll_pwait2(), close_range(), and encoded I/O

CLCD土地覆盖数据在ArcGIS中的实战应用:从导入到空间分析的完整指南 本文详细介绍了CLCD土地覆盖数据在ArcGIS中的实战应用,从数据导入到空间分析的完整流程。涵盖坐标系转换、数据质量检查、土地利用变化检测等核心技术,并分享城市扩张模拟和跨数据集融合等高级应用技巧,帮助研究者高效利用这一权威数据集进行环境监测和城市规划。 阅读详情

关注了就能看到更多这么棒的文章哦~

epoll_pwait2(), close_range(), and encoded I/O

By Jonathan Corbet
November 20, 2020
DeepL assisted translation
https://lwn.net/Articles/837816/

多年来,内核针对文件和文件系统的访问而提供的各种系统调用和 API 已经越来越全面。但这并不意味着没有改进的空间了。开发社区正在考虑对内核的文件系统相关 API 增加一些小改动,请继续阅读我们这些工作的调查和总结。

Higher-resolution epoll_wait() timeouts

内核的 "epoll "子系统,给进程提供了一种同时等待大量已被 open 的文件描述符上的 event 的方法。使用的时候会先用 epoll_create()创建一个 epoll 文件描述符,用 epoll_ctl()添加感兴趣的文件描述符进来,最后用 epoll_wait()或 epoll_pwait() 来等待事件。在等待时,调用者可以指定超时时间,是毫秒的整数倍。

epoll 机制是在 2.5 系列 kernel 开发周期中加入的,并在 2003 年底的 2.6 版本中开始正式发布使用。近 20 年前,当这项工作正在进行时,毫秒级别的超时时间已经足够解决问题了。无论如何,内核无法可靠地使用更短的超时时间。但在 2020 年,一毫秒可能是一个非常长的时间了。有一些用户会希望能用到更短的超时时间。因此,现在似乎是时候对 epoll API 进行另一次更新了。

Willem de Bruijn 适时地出现了,提出一组 patch set,为 epoll_wait()添加了纳秒级别的超时支持,但它走了一条有点迂回的路。由于 epoll_wait()没有 "flags" 参数,所以没有办法直接增加个 flag 来请求更高分辨率的超时时间。所以 patch set 反而给 epoll_create()添加了一个新的标志 (EPOLL_NSTIMEO) (其实是 epoll_create1(),这是在 2.6.27 中添加的,因为 epoll_create()也缺少 "flags" 参数)。如果一个 epoll 文件描述符是在设置了这个标志的情况下 create 出来的,那么 epoll_wait()的超时值将以纳秒为单位,而不是毫秒。

然而,Andrew Morton 对这个 API 很有抱怨。在他看来,让一个系统调用设置 flag 来改变对另一个系统调用的参数的解析方式,这种做法是 "不太好" 的;他建议增加一个新的系统调用。经过一番反复讨论,最后还是增加了新的系统调用。最新版本的 patch set 中增加了 epoll_pwait2()。

int epoll_pwait2(int fd, struct epoll_event *events, int maxevents,
                 const struct timespec *timeout, const sigset_t *sigset);

在这个版本中,超时值是以一个 timespec 结构传递进来的,其中包括纳秒字段。

关于这个系统调用的实现已经有一些讨论,但关于 API 的评论并不多,所以也许这项工作会以当前这种做法得到合入。不过,编者忍不住还是想说一句,这个系统调用里,也缺少 "flags" 参数,所以最终可能还会再出现一个 epoll_pwait3() 吗?

close_range() –eventually

close_range()系统调用是在 5.9 版本中加入的,它可以高效地关闭一系列的文件描述符。

int close_range(int first, int last, unsigned int flags);

调用时将关闭所有介于 first 和 last 之间(包括这两者)的文件描述符。flag 的取值目前只定义了一个有效值 CLOSE_RANGE_UNSHARE,用来让指定范围内的文件描述符不再共享给其他任何进程(但是并不会关闭它们)。

Giuseppe Scrivano 新提了一组 patch set,增加了另一个 flag:CLOSE_RANGE_CLOEXEC。它会在这些文件描述符上都设置 "close on exec()" flag。同样,close_range()在这种情况下并不会真正关闭文件,它只是做个标记,这样今后调用者进程执行 exec() 时会关闭这些文件描述符。理论上说,这比执行一个循环来用 fcntl()对每个文件描述符分别设置标志要快。

这个功能看起来很有用,而且也没有人真正对这个 API 提出反对意见(这组 patch set 的早期版本实现上是有一些问题)。不过,鉴于 close_range()承担了太多不涉及真正关闭文件的功能,说明这个系统调用似乎很明显地起错名字了。它从 10 月 11 日的 5.9 版本开始才出现,所以目前还没有相应的 C-library wrapper 发布出去。所以,如果愿意的话,大家其实有时间为这个系统调用想一个更好的名字。

Encoded I/O

有一些文件系统可以在写入文件之前进行压缩或加密。通常情况下,当从这些文件中读取数据时,这些数据会被恢复到原来的形式,所以用户可能完全不知道这种转换发生过。然而,如果有人希望能够绕过文件系统代码中的处理流程,而直接处理这些 "encoded" 数据呢?Omar Sandoval 提出了一组 patch set。

这项工作的主要动机似乎是用于备份场景,具体来说,是用 Btrfs send and receive operation 来对文件系统镜像进行完整备份或者增量备份。这种机制的使用方法,就是在另一个设备上创建一个相同的 Btrfs subvolume 副本。如果 subvolume 使用了压缩,那么发送前会对数据进行解压,然后必须在接收端对数据进行重新压缩,然后写入。如果涉及的数据很多,这样的操作就有些浪费,完全可以只传输压缩后的数据,效率会更高。

打上这组 patch set 后,就可以直接读取压缩或加密(或者两者都有)过的数据,并直接写入,不需要中间的处理。第一步是用新的 O_ALLOW_ENCODED flag 打开 subvolume。在这种模式下打开 subvolume 需要 CAP_SYS_ADMIN 这个 capability,试想一下,如果攻击者将损坏过的压缩数据写入文件,会发生什么情况。Dave Chinner 很早就认为,损坏的(corrupted)数据应该只是被当作坏(bad)数据,这样这个操作就可以不需要任何特权,但这种观点并没有胜出。

然后,可以使用 preadv()和 pwritev()系统调用来读取或写入编码过数据。必须使用新的 RWF_ENCODED flag 来表示正在传输编码数据。这些系统调用在被正常调用时,需要一个指向要传输的缓冲区的 iovec 结构的指针数组,但当正在进行编码过的数据的 I/O 时,第一个指针会指向一个新的 encoded_iov 结构。

struct encoded_iov {
  __aligned_u64 len;
  __aligned_u64 unencoded_len;
  __aligned_u64 unencoded_offset;
  __u32 compression;
  __u32 encryption;
};

len 字段必须用来指定这个结构的长度,它的存在是为了防止将来增加新的字段。unencoded_len 和 unencoded_offset 字段指明了此操作会影响文件的哪一部分,compression 和 encryption 字段包含了每种文件系统相关的值,描述了应该使哪种压缩和加密方式。iovec 数组中的所有其他指针都指向要传输数据的实际 iovec 结构。

这个 patch set 包含了对从 Btrfs 文件系统读写压缩数据的支持。还有一个后续的 patch set,在发送和接收操作中利用这个功能。提供的性能测试可以看出,传输数据所需的带宽显著减少了,CPU 使用时间减少,在某些情况下,还减少了真实消耗的时间。

截至本文撰写时,这组 patch set 已经经历了六次修订。第一个版本发布于 2019 年 9 月。各种实现细节问题已经得到解决,大家似乎正在达成一致,应该很快就可以合并了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

【AI Agent教程】各种Agent开发框架都是如何实现ReAct思想的?深入源码学习一下 驱动大模型有很多种方式,例如纯Prompt方式、思维链方式、ReAct方式等。ReAct 方式是 AI Agent 最常用的实现思路之一,它强调在执行任务时结合推理(Reasoning)和行动(Acting)两个方面,使得Agent能够在复杂和动态的环境中更有效地工作。 阅读详情

相关推荐

自举电容的工作原理-3句话总结

1、一道面试题 照例,先抛出来一道面试题:“Buck电路的SW引脚通常会放置一颗小电容,这颗电容有什么用?”。这个问题问得比较细,非常考验被面试者的硬件基本功。 2、似懂非懂的答案 有小伙伴可能不太清楚这颗电容的作用,回答不上来。也有小伙伴脱口而出:自举电容,用来做升压的。但后面好像说不出来具体逻辑。 没具体了解过,答不上来,也没啥可惜的。但是了解过一点,但又似懂非懂的这种,给出的答案只是轻轻点水或者千篇一律,那无疑是错过了一个加分项。 3、异步Buck的自举环路组成 既然是针对Buck电路讲自举电容,前面

ltqdxl的博客 3万+

epoll学习笔记1

简介 epoll是同poll相似的,用于同时监听多个fd上的相关I/O事件。epoll相较于poll而言有边缘触发和水平触发两种事件触发模式,poll只有水平触发一种事件触发模式。 事件触发模式介绍 水平触发 水平触发(Level-Triggered)是当被监控的fd上有可读写事件发生时,epoll_wait会通知程序去读写。如果程序在这次操作没有将数据全部读写完(可能由于缓冲区不够),那么下次调用epoll_wait时仍然会通知程序去读写,直到数据被读写完为止。 优点: 开发时每次读写操作只需要读写想要的

zxc3590235的博客 1057

手把手教你编写I2C读写EEPROM代码(驱动层实现)

从底层寄存器配置到时序控制,详解如何编写可移植的I2C读写EEPROM代码,覆盖起始信号、地址帧、数据收发及ACK应答等关键环节,确保在STM32、ESP32等主流平台稳定运行,真正落地i2c读写eeprom代码需求。

weixin_35756130的博客 506

epoll()涉及到的两种wait队列分析

主要是等待队列的回调函数用处不同,1的回调是为了唤起处于等待事件而处于休眠的进程,2的回调是为了将epitem中的rdllink结构加入到ready list中。

ordeder的专栏 7452

TC3xx系列LMU与SPR实战:将关键算法从Flash搬移至PSPR提升5倍执行效率

在实际电机控制项目中,通过将FOC算法全部迁移到PSPR,我们不仅将执行时间从56μs降至11μs,还将最坏情况下的时间偏差控制在±0.3μs以内。实测数据:在TC397上执行Flash中的32位浮点矩阵乘法,平均每条指令需要8.7个周期,而同样的代码在PSPR中仅需1.2个周期。传统开发中,工程师往往将所有代码放在Flash中运行,这相当于让F1赛车在乡村公路上行驶。迁移后不仅平均执行时间缩短,更重要的是时间抖动从±15%降低到±2%以内,这对闭环控制系统至关重要。不是所有代码都适合迁移到PSPR。

weixin_31421613的博客 296

Silvaco TCAD仿真4——DeckBuild实战:从示例库到自定义设计

本文详细介绍了Silvaco TCAD仿真工具DeckBuild的实战应用,从示例库的使用到自定义设计的全过程。通过具体案例和参数修改技巧,帮助用户快速掌握TCAD仿真技术,提升半导体器件设计的效率和精度。特别适合需要从基础入门到进阶操作的工程师和研究人员。

weixin_29284657的博客 434

epoll_pwait系统调用及示例

epoll_pwait是Linux系统调用epoll_wait的扩展版本,支持在等待事件期间设置临时信号掩码。该函数原型包含epoll实例描述符、事件数组、最大事件数、超时时间和信号掩码参数,能够原子性地完成信号掩码设置和事件等待操作,避免传统方式可能出现的竞态条件。相比epoll_wait,epoll_pwait特别适用于需要精确控制信号处理的多线程场景,如服务器主线程需要屏蔽特定信号的情况。示例代码演示了基本使用、信号掩码设置、原子性优势及错误处理等典型应用场景。

悟空看八戒烤熟了没的专栏c)4Upqt4SeVk 434

在windows10/11中使用ipatool提取苹果app安装包ipa文件

本文介绍了在Windows10/11系统中使用ipatool工具下载苹果App安装包(.ipa)的详细步骤。首先需准备Windows电脑、AppleID账号并下载ipatool工具;具体操作包括:登录AppleID、搜索应用、获取购买授权、查看历史版本及下载指定版本。关键步骤强调获取授权的重要性,并提供了常用命令速查表,帮助用户完成从登录到下载的全过程。该教程适用于需要获取旧版本App或进行应用测试的场景。

zhengshaolin128的博客 2576

epoll_pwait

http://man7.org/linux/man-pages/man2/epoll_wait.2.html #include <sys/epoll.h> int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); ...

a6d0m5i5n1tw的专栏 2782

单目和多目视觉统一标定

单目和多目视觉统一标定 一.单目视觉标定 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在

吴建明wujianming_110117 2911

【C语言】程序员筑基功法——《函数栈帧的创建与销毁》

汇编角度带你走进函数栈帧

StackFrame 3657

epoll_wait

epoll_wait 由 系统机器 于 星期六, 2010/09/18 - 17:43 发表  Linux  man  manual EPOLL_WAIT 章节:Linux 程序员手册 (2) 更新:2010-12-03 到 易美翻译 翻译 本页 名字 epoll_wait, epoll_pwait - 在一个 epoll 文件描述符上等

jfkidear的专栏 8943

华为OD机试 - 统计文本数量(Java 2025 A卷 100分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1438

epoll详解

在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术,在大数据、高并发、集群等一些名词唱得火热之年代,select和poll的用武之地越来越有限,风头已经被epoll占尽。 那究竟什么是epoll呢?epoll 是 Linux 内核的可扩展 I/O 事件通知机制,其最大的特点就是性能优异。...

Ineffable__的博客 4445

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

c++网络编程(1)

EPoll网路编程的优点

鱼的天空的博客 602

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

epoll(eventpoll)是干嘛的?IO多路转接技术(相较select、poll的优点)用epoll实现socket服务端(代码)(未完成)

首先我们要知道epoll是用来干什么的(定义):epoll是一种IO多路转接技术,在LINUX网络编程中,经常用来做事件触发,即当有特定事件到来时,能够检测到,而不必阻塞进行监听,基于事件驱动的IO多路复用技术(通俗来说,就是来监听系统有没有什么事件发生,这个事件可以是socket,也可以是数据的读取等) 既然我们要说epoll了,那么我们就要知道select poll,我们通过这两中技术与epoll进行比较讲解,首先我们就已scoket说下select。 select: 假设我们有一个服务器,..

Dontla的博客 1183

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

epoll_wait详解

epoll_pwait,等待epoll文件描述符上的I / O事件。 #include <sys / epoll.h> int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout); epoll_wait()系统调用等待文件描述符epfd引用的epoll实例上的事件。事件所指向的存储区域将包含可供调用者使用的事件。 epoll_wait()最多返回最大事件。 maxevents...

zhoumuyu_yu的博客 6万+

epoll实现并发服务器

它采用了一种基于事件的工作方式,当文件描述符上有事件发生时,内核会通知应用程序,并将发生的事件放入一个事件列表中,应用程序可以通过读取该列表来获取已就绪的事件。的具体使用方式还取决于应用程序的需求和设计,上述示例代码只是一种基本的演示,实际应用中可能需要根据具体情况进行更详细和复杂的处理。的优势在于它能够高效处理大量的并发连接,并且对于大规模的并发应用程序来说,比传统的事件通知机制具有更好的性能。:等待就绪事件的发生,阻塞直到有事件发生,然后将就绪的事件填充到指定的事件列表中,返回就绪事件的数量。

1992

Linux epoll详解

Linux epoll详解 日期: 2013年10月 8日 一、什么是epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linuxkernel 2.5.44),它几乎具备了之前所说的一切优点,被公

lingfengtengfei的专栏 3万+

epoll

epoll相关的系统调用有:epoll_create, epoll_ctl和epoll_wait。Linux-2.6.19又引入了可以屏蔽指定信号的epoll_wait: epoll_pwait。至此epoll家族已全。其中epoll_create用来创建一个epoll文件描述符,epoll_ctl用来添加/修改/删除需要侦听的文件描述符及其事件,epoll_wait/epoll_pwait接收发

小青年儿 1049

epoll简单使用

是 Linux 系统提供的一种高效的事件通知机制,用于处理大量的并发连接。它可以用于监视多个文件描述符(sockets、文件、管道等)上的事件,并在有事件发生时通知应用程序进行相应的处理。处理事件:根据返回的文件描述符和事件类型,应用程序可以执行相应的操作。例如,如果返回的事件类型是可读事件,可以使用。函数等待事件的发生。可以指定要监视的事件类型,如可读事件、可写事件等。实例中的文件描述符的监视状态。函数会返回触发事件的文件描述符和事件类型。更新事件:在处理完一个事件后,可以使用。实例中删除文件描述符。

m0_63440562的博客 1133

【网络】高级IO——epoll版本TCP服务器初阶

epoll是Linux内核为处理大批量而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

2301_80224556的博客 2117

epoll原理以及系统调用案例分析

一、epoll原理一、epoll原理二、epoll系统调用使用c库封装的3个epoll系统调用,具体源码如下:此系统调用对文件描述符epfd引用的epoll实例执行控制操作,它要求操作op对目标文件描述符fd执行。op参数有效值为:EPOLL_CTL_ADD/EPOLL_CTL_MOD/EPOLL_CTL_DEL.等待 epoll 文件描述符上的 I/O 事件。epfd 引用的 epoll 实例上的事件,事件所指向的存储区域将包含供调用者使用的事件。

m0_74186706的博客 1429

个人对epoll的理解

个人对epoll的理解

yjx的博客 397

Epoll在LT和ET模式下的读写方式和区别

LT模式:epoll就是一个快速版poll,可读可写就绪条件和传统poll一致 ET模式:为了避免Starvation,建议           1)文件描述符设置为非阻塞           2)只在read或write返回EAGAIN后,才能调用下一次epoll_wait           3)应用层维护一个就绪链表,进行轮询,可以防止大量IO时在一个描述符上长期read或write

Al_xin的专栏 3275

Linux --- epoll (I/O就绪事件通知机制)

epoll是Linux内核提供的高效I/O多路复用机制,通过“兴趣注册与事件获取分离”实现对海量文件描述符的低延迟监控。其核心为双集合模型:兴趣集合(红黑树存储)用于注册待监控的fd及事件,就绪集合(链表)仅返回已就绪事件,避免全量遍历。借助epoll_create1、epoll_ctl和epoll_wait三类系统调用,epoll在高并发场景下性能远超select/poll,成为Nginx、Redis等高性能服务的标准事件引擎。

MzKyle的博客 959
上一篇: LWN: 更加不对称的Arm系统上如何调度?
下一篇: LWN:如何保护虚拟机不受恶意来源的攻击?
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值