I/O复用:select、poll、pselect和epoll

select函数详解 select函数详解背景说明定义介绍、参数说明原理返回值pselect总结案例案例1案例2 说明:本文整合网络资源和man帮助文档,请酌情参考。 背景 select函数是实现IO多路复用的一种方式。 什么是IO多路复用? 举一个简单地网络服务器的例子,如果你的服务器需要和多个客户端保持连接,处理客户端的请求,属于多进程的并发问题,如果创建很多个进程来处理这些IO流,会导致CPU占有率很高。所以人... 阅读详情

一 I/O模型:

(1)阻塞式I/O:最常用的I/O模型。默认情况下,所有套接字都是阻塞的。

(2)非阻塞式I/O:不把进程投入睡眠,而是返回一个错误。

(3)I/O复用:调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上。

(4)信号驱动I/O:让内核在描述符就绪时发信号通知进程。优势:等待数据到达期间进程不被阻塞。

(5)异步I/O:告诉内核执行某个操作,并让内核在整个操作完成后通知我们。与信号驱动I/O区别:信号驱动I/O告诉我们何时启动一个I/O操作;异步I/O则是由内核通知我们I/O操作何时完成。


二 I/O复用在网络上的应用场合(可以用于其他方面):

(1)当客户处理多个描述符,必须使用I/O复用。

(2)如果一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般要使用I/O复用。

(3)如果一个服务器要处理多个服务或者协议(例如inetd守护进程),一般要使用I/O复用。

(4)等等...


三 select和pselect:

1)概述

*select:允许进程指定内核等待多个事件中任何一个发生,并且在只有一个或多个事件发生或经历一段指定的时间后才唤醒它。

*pselect是POSIX发明的。相对于select有两个变化:pselect使用timespec结构;pselect增加了第六个参数:一个指向信号掩码的指针。


2)格式:


3)参数:

*nfds:指定待测试的描述符的个数,它的值是待测试的最大描述符加1。头文件<sys/select.h>中定义的FD_SETSIZE常值是数据类型fd_set中的描述符总数,其值通常是1024。

(1)readfds:指定要让内核测试读的描述符。

*一个套接字准备好读的四个条件:

~该套接字接收缓存区中的数据字节大于等于套接字接收缓存区低水位标记的当前大小(可用套接字选项SO_RCVLOWAT设置)。

~该连接的读半部关闭(即受到了FIN的TCP连接),对这样的套接字读不阻塞返回0(即EOF)。

~该套接字是一个监听套接字而且已完成连接数不为0。

~其上由一个套接字错误待处理。


(2)writefds:指定要让内核测试读的描述符。

*一个套接字准备好写的四个条件:

~该套接字发送缓存区中的数据字节大于等于套接字发送缓存区低水位标记的当前大小(可用套接字选项SO_SNDLOWAT设定),并且或者该套接字已连接,或者不需要连接(UDP)。

~该连接读半部关闭,对这样套接字写操作将产生SIGPIPE信号。

~使用非阻塞connect的套接字已建立链接,或者connect已经以失败告终。

~其上由一个套接字错误待处理。


(3)exceptfds:指定要让内核测试异常的描述符。

*目前支持的异常条件:

~某个套接字的带外数据到达;

~某个已设置为分组模式的伪终端存在可从其主端读取的控制状态信息。


(4)timeout:告知内核等待所指定描述符中的任何一个就绪的时间。

*三种可能:

~永远等下去:仅在一个描述符准备好I/O才返回,把参数设置为空指针。

~等待一段固定时间:在有一个描述符准备好I/O返回,但不超过由参数timeout指定的固定时间。

~根本不等待:轮询,检查完描述符后立即返回。参数timeout结构中的定时器值为0。


(5)返回值:若有就绪描述符则为其数目;若超时则为0;若出错则为1。


*注意:当对某一条件不敢兴趣就可以设置为空指针。


4)使用:

*描述符集的初始化很重要(FD_ZERO)。

*select返回后,结果将指示哪些描述符就绪,使用FD_ISSET()来测试fd_set数据类型中的描述符。

*描述符集内任何与未就绪描述符对应的位返回时将清成0,因此,每次重新调用select函数时,要重新设置所关心的描述符集。

*当描述符超过1024个时,可以用poll代替select。



四 poll:

(1)格式:

#include<poll.h>

int poll( struct polled *fdarray,unsigned long nfds,int timeout )


(2)参数:

*fdarray:指向一个polled结构数组第一个元素的指针。每个元素都是一个polled结构,用于指定测试某个给定描述符fd的条件。

struct polled

{

int fd;/*descriptor to check*/

short events;/*events of  interest on fd:指定要测试的条件*/

short revents;/*events that occurred on fd*/

}


*nfds:指定polled结构数组中元素的个数。

*timeout:指定poll函数返回前等待多长时间。


(3)返回值:

*若有就绪描述符则为其数目;若超时则为0;若失败则为-1。


(4)poll与select比较:

*poll没有描述符个数限制,可以设置更多的描述符(select的fd_set类型限制为1024)。因为分配polled数组并把元素的数目通知内核是调用者的责任。



五 epoll

(1)概述:

*epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

*epoll通过epoll_create创建一个用于epoll轮询的描述符,通过epoll_ctl添加/修改/删除事件,通过epoll_wait检查事件,epoll_wait的第二个参数用于存放结果。


(2)三个相关函数(注意细节):

*epoll_create:创建一个epoll句柄,它会占用一个fd的值,可通过/proc/进程id/fd/查看,所以使用完epoll后必须调用close关闭,否则导致fd被耗尽。

*epoll_ctl:epoll的事件注册函数。

*epoll_wait:等待事件发生。


(3)epoll的两种工作模式(需好好研究):(默认是LT,可通过epoll_ctl设置)

1.LT(level triggered)水平触发:默认模式。

2.ET(edge triggered)边界触发:只支持非阻塞socket。

3.区别:

*LT:水平触发,效率会低于ET触发,尤其在大并发,大流量的情况下。但是LT对代码编写要求比较低,不容易出现问题。LT模式服务编写上的表现是:只要有数据没有被获取,内核就不断通知你,因此不用担心事件丢失的情况。
*ET:边缘触发,效率非常高,在并发,大流量的情况下,会比LT少很多epoll的系统调用,因此效率高。但是对编程要求高,需要细致的处理每个请求,否则容易发生丢失事件的情况。


六 相互比较:

(1)epoll与select:

1.传统select/poll一个致命缺点:获取事件的时候需遍历整个监听的文件描述符集合,当拥有一个很大的集合而只有部分是“活跃”的时候,效率很低;而epoll它只对“活跃”的文件描述符集合进行操作。

2.select受一个进程所能打开的FD限制,由FD_SETSIZE设置,默认是1024,对于支持大量并发的服务器来说不够;epoll没有这个限制,它所支持的FD上限是最大可以打开的文件的数目。

3.epoll可以复用文件描述符集来传递结果,而不用每次等待事件之前都必须重新准备要监听的文件描述符集合;select则每次都要把关心的文件描述符集合重新设置。




















linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符)。描述符就是一个数字,指向内核中一个结构体(文件路径,数据区, 阅读详情

相关推荐

Mem0 vs LangMem vs Letta:三大AI记忆框架实战对比(附代码示例)

本文深入对比了Mem0、LangMem和Letta三大AI记忆框架的核心特性与适用场景。Mem0提供开箱即用的记忆管理服务,适合快速集成;LangMem深度融入LangGraph生态,适合复杂工作流;Letta则采用虚拟内存系统,旨在突破上下文窗口限制。文章通过实战代码示例,为开发者选择适合其业务需求的AI记忆解决方案提供了清晰指南。

g9h0i1的博客 679

AI供应链安全实战:从HF事件看模型安全防御与工程实践

软件供应链安全是保障现代软件系统可靠性的基础概念,其核心原理在于确保从开发到部署的每一个环节中使用的组件都来源可信、未被篡改。在AI领域,这一概念延伸为AI供应链安全,其技术价值在于保护模型、数据和代码的完整性,防止恶意代码通过依赖链渗透。随着预训练模型的广泛使用,攻击者开始针对模型分发平台和开源社区进行供应链攻击,通过污染模型依赖、植入恶意代码等手段危害开发者环境。应用场景涵盖从个人开发者到企业级AI系统部署的全流程。本文以近期备受关注的HF事件为切入点,深入剖析了AI供应链攻击中依赖投毒和模型劫持的具体

weixin_34342207的博客 415

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 733

IO多路复用-select poll pselect epoll分析

1.I/O模型 Linux平台下有5中I/O模型,分别为阻塞式I/O、非阻塞式I/O、I/O复用、信号驱动式I/O及异步I/O。本节内容参考自《UNIX网络编程》。 (1)阻塞式I/O模型 最流行的I/O模型是阻塞式I/O模型。一般情况下,默认的IO都是阻塞的。以UDP套接字为例,当进程调用recvfrom系统调用,直到数据被复制到应用进程的缓冲区或者发生错误才返回,常见的系统调用是被系统中断。若内核中的数据还未准备好,则调用recvfrom的进程被阻塞。 (2)非阻塞式I/O模型 非阻塞式I/O需要显示

非专业业余程序员 595

iOS反编译-hook微信之艾特所有人

all。

2501_90243249的博客 759

Android功耗系列专题理论之十三:MTK平台待机功耗问题分析方法

摘要:本文详细分析了MTK平台待机功耗问题的调试方法,重点介绍了SPM电源管理机制、26M时钟控制逻辑以及系统深睡眠状态的判断标准。文章提供了完整的Debug流程,包括日志抓取、唤醒源分析、SCP睡眠状态检查以及时钟/LDO状态排查等实用技巧,并给出硬件漏电点和软件配置异常的排查方案。针对不同模块(Modem/Conn/SSPM等)提供了具体的电源管理绕过命令,适用于功耗问题调试和低功耗模式验证场景。

559

select、poll、epoll的区别

select、poll、epoll的区别 目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,pselect,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 与多

Quan的博客 382

【SpringBoot 4.x 第70节】夯爆了,企业级 API 设计规范落地:状态码、错误码、接口文档与兼容性(超详解)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 130

详解WSAEventSelect网络模型

详细讲解了事件选择模型的流程与相关的API,解决了相关疑难问题,并附有实现的代码

走在成长的路上 5876

DDR5 JEDEC标准简析:一次读懂DDR5的核心规范!

JEDEC,全称是,中文名称是「电子元件工程联合委员会」,它是全球权威的存储接口标准制定机构。我们常见的 DDR2、DDR3、DDR4、DDR5 都是它搞出来的。📌 JEDEC 就像存储接口界的“裁判+编剧”——规定谁该怎么跑,怎么演,怎么配合。

weixin_43199439的博客 2570

PyMuPDF为PDF文件添加注释

我将介绍如何使用PyMuPDF库来为PDF文件添加注释,包括文本注释、高亮注释、下划线注释等15种注释的使用方法。

布啦啦 2242

Winsock异步模型之二(WSAEventSelect)

目录: 一、WinSock I/O模型分析 1.WSAAsuncSelect模型 2.WSAEventSelect模型 3.重叠(Overlapped)I/O模型 二、聊天软件的设计与分析 1.程序功能 2.程序设计 3.实现是的关键点 三、体会 四、源代码一、WinSock I/O模型分析Winsock提供了五种套接字I/O模型来解决这些问题.他们分别是select(选择),WSAAsy

天蓝的专栏 4670

使用ggplot2包中的双Y轴功能在R语言中可视化时间序列数据,并在时序数据末尾添加数值标签是一种有效的数据展示方式

使用ggplot2包中的双Y轴功能在R语言中可视化时间序列数据,并在时序数据末尾添加数值标签是一种有效的数据展示方式。通过这种方式,我们可以同时展示两个变量的趋势,并在时序数据末尾添加数值标签,使得数据更加直观和易于理解。假设我们有一个包含两个变量的时间序列数据集,一个是时间变量,另一个是对应的数值变量。现在,我们可以使用ggplot2包来创建一个基本的时间序列图,其中包含两个数值变量。接下来,我们将添加一个双Y轴,并在时序数据末尾添加数值标签。函数在数值1的每个数据点上添加数值标签。

Orion_O的博客 269

UNIX编程专题-I/O复用:select、pselect、poll和epoll解析

1.什么是I/O复用 进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(输入已准备好被读取,或者描述符已能承接更多的输出),就会通知进程。这个能力称为I/O复用。 2.I/O复用的应用场合 当客户同时处理多个描述符(通常是交互式输入和网络套接字)时,必须使用I/O复用一个客户同时处理多个套接字是可能的如果一个TCP服务器既要处理监听套接字,又要处理已连接

tiankong_的博客 2305

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

I/O多路复用详解

要想完全理解I/O多路复用,需先要了解I/O模型: 一、五种I/O模型 1、阻塞I/O模型 最流行的I/O模型是阻塞I/O模型,缺省情形下,所有套接口都是阻塞的。我们以数据报套接口为例来讲解此模型(我们使用UDP而不是TCP作为例子的原因在于就UDP而言,数据准备好读取的概念比较简单:要么整个数据报已经收到,要么还没有。然而对于TCP来说,诸如套接口低潮标记等额外变量开始活...

weixin_30477293的博客 107

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IO多路复用之select、poll、epoll详解

转载自:https://blog.youkuaiyun.com/zhousenshan/article/details/78660017      目前支持I/O多路复用的系统调用有 select,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。   但select,poll,epoll本质上都是同...

ZERO 2946

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

浅析I/O多路复用:select、poll、epoll

要想实现并发编程,最简单的模式就是1个进程/线程处理1个连接的全部生命周期,当我们使用默认的套接字时,它会将一个新的连接与一个进程或线程绑定,这样等待处理消息的进程或线程就会阻塞而等待消息准备好,在高并发下这会导致进程/线程频繁的睡眠、唤醒,从而影响了CPU的效率。而多路复用则是解决这一问题的“利器”,它可以同时监控所有的连接,它虽然也会进入睡眠等待阶段,但是这一个进程/线程是为所有连接而等待,只

Renie的专栏 1214

Linux系统编程——I/O多路复用select、poll、epoll

参考:https://segmentfault.com/a/1190000003063859 Linux下的I/O复用与epoll详解:https://www.cnblogs.com/lojunren/p/3856290.html 彻底学会 epoll 系列:http://blog.chinaunix.net/uid/28541347/sid-193117-list-1.htm Linux下I/O...

雪雪 700

I/O复用 select poll epoll

一 定义 I/O复用:当一个进程需要处理多个I/O接口的处理,这样的进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪,它就通知进程。这个能力称为I/O复用,是由select和poll这两个函数支持的。 I/O复用典型使用在以下网络应用场合: 1.当客户处理多个描述符(通常是交互式输入和网络套接字)时,必须使用I/O复用。 2.如果一个TCP服务器既要处

xu_ya_fei的专栏 428

select、pselect、poll和epoll的区别

select、pselect、poll和epoll函数是unix中具有I/O复用的函数。什么是I/O复用?为什么要有I/O复用?以及在什么场合下使用I/O复用?既然都具有I/O复用的功能,那这几个函数又有什么样的区别与联系呢?在下面我会一一解释。 请看下面一段客户端代码: #include    “unp.h” int main(int argc, char **argv) {

linsulinying的专栏 643

【JVM】IO多路复用的三种机制Select,Poll,Epoll以及BIO、NIO、AIO

关于IO面试经常会涉及到阻塞、非阻塞、同步、异步、多路复用、IO多路复用的三种机制Select,Poll,Epol以及BIO、NIO、AIO等几个知识点。 前言 在介绍内容之前,首先了解一下Linux操作系统中基础的概念: 用户空间 / 内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保

时光、疏离了记忆づ童话的博客 1152

Linux---I/O复用系统调用select、poll和epoll

select系统调用 用途:在一段指定时间内,监听用户感兴趣的文件描述符上的看可读、可写、异常等事件。 select系统调用的原型: #include<sys/select.h> int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* t...

cyy_0802的博客 238

Linux中pselect实例,linux select pselect poll epoll用法

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?#include #include #include #include void FD_CLR(int fd, fd_set *set);int FD_ISSET(int fd, fd_set *set);void FD_SET(int fd, fd_set *set);void FD_ZERO(fd_set *set...

weixin_33518565的博客 309

Linux操作系统中的SOCKET相关 -6- I/O多路复用、信号驱动I/O、epoll

大部分程序使用的 I/O 模型都是单个进程每次只在一个文件描述符上执行 I/O 操作,每次 I/O 系统调用都会阻塞直到完成数据传输。比如,当从一个管道中读取数据时,如果管道中恰好没有数据,那么通常 read()会阻塞。而如果管道中没有足够的空间保存待写入的数据时,write()也会阻塞。当在其他类型的文件如 FIFO 和套接字上执行 I/O 操作时,也会出现相似的行为。对于许多应用来说,传统的阻塞式 I/O 模型已经足够了,但这不代表所有的应用都能得到满足。特别的,有些应用需要处理以下某项任务,或者两者都

Android系统工程师--小馬佩德罗 276
上一篇: Effective C++(一)让自己习惯C++
下一篇: linux下终端快捷键
first_wolf
博客等级 码龄14年 43粉丝 472原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值