首页 > 其他分享 >服务器IO多路复用的select和poll的区别以及监听套接字select函数的四个宏操作

服务器IO多路复用的select和poll的区别以及监听套接字select函数的四个宏操作

时间:2024-06-10 23:33:23浏览次数:13  
标签:文件 描述符 fd IO 集合 接字 poll select

目录

知识补给站

对文件描述符集合操作的四个宏操作

对文件描述符集合操作的四个宏操作在select函数中起着关键的作用,它们用于初始化、添加、删除和检查文件描述符集合中的元素。这四个宏为: FD_ZERO、FD_SET、FD_CLR、FD_ISSET:

FD_ZERO(fd_set *fdset)

  • 功能:清空文件描述符集合。

  • 参数:一个指向fd_set类型变量的指针。

  • 作用:将fdset指向的文件描述符集合中的所有位都设置为0,确保集合中没有包含任何文件描述符。

FD_SET(int fd, fd_set *fdset)

  • 功能:将一个文件描述符添加到文件描述符集合中。
  • 参数:一个整数fd,代表要添加的文件描述符;一个指向fd_set类型变量的指针。
  • 作用:将fdset指向的文件描述符集合中对应于fd的位设置为1,表示该集合包含文件描述符fd

FD_CLR(int fd, fd_set *fdset)

  • 功能:从文件描述符集合中删除一个文件描述符。
  • 参数:一个整数fd,代表要删除的文件描述符;一个指向fd_set类型变量的指针。
  • 作用:将fdset指向的文件描述符集合中对应于fd的位设置为0,表示该集合不再包含文件描述符fd

FD_ISSET(int fd, fd_set *fdset)

  • 功能:检查文件描述符集合中是否包含某个文件描述符。
  • 参数:一个整数fd,代表要检查的文件描述符;一个指向fd_set类型变量的指针。
  • 返回值:如果fdset指向的文件描述符集合中包含fd,则返回非零值(通常为1);否则返回0。
  • 作用:用于在select函数返回后,检查哪些文件描述符已经就绪(可读、可写或存在异常条件)。

服务器IO多路复用中的select和poll的区别

  1. 数据结构差异:
    (1)select:使用位图(bitmap)数据结构来存储被监听的文件描述符集合。这种数据结构在文件描述符数量较少时效率较高,但受限于位图的大小,通常能监听的文件描述符数量有限(通常在1024个左右,取决于系统和库的实现)。
    (2)poll:使用结构体数组(如pollfd)来存储被监听的文件描述符及其相关事件。这种数据结构允许监听更多的文件描述符,因为它不受位图大小的限制。
  2. 事件绑定:
    (1)select:没有将文件描述符和事件进行绑定。每次调用select时,都需要通过三个独立的文件描述符集合来指定要监听的可读、可写和异常事件。
    (2)poll:将文件描述符和事件直接绑定在pollfd结构体中,这使得编程接口更为简洁。在调用poll时,只需传递一个包含所有监听信息的pollfd数组即可。
  3. 数据拷贝:
    (1)select:在每次调用时,都需要将文件描述符集合从用户空间拷贝到内核空间,并在返回时将结果从内核空间拷贝回用户空间。这种频繁的数据拷贝在文件描述符数量较多时会导致性能下降。
    (2)poll:同样存在数据拷贝的问题,但由于poll使用结构体数组而不是位图,因此在某些情况下可能具有更高的效率。
  4. 时间复杂度:
    (1)select:在内核中无差别地遍历每个文件描述符,时间复杂度为O(n)。当文件描述符数量较大时,性能会受到显著影响。
    (2)poll:与select类似,也需要在内核中遍历每个文件描述符。但由于poll允许监听更多的文件描述符,因此在某些情况下可能具有更好的性能。
  5. 可重用性:
    (1)select:每次调用select时,都需要重新创建和设置文件描述符集合。这可能导致额外的编程开销。
    (2)poll:由于poll将文件描述符和事件绑定在结构体中,因此可以在多次调用之间重用相同的pollfd数组,从而减少了编程开销。

标签:文件,描述符,fd,IO,集合,接字,poll,select
From: https://www.cnblogs.com/LvYaoNan/p/18241235

相关文章

  • DoNet Core的启动过程-WebApplicationBuilder
     1.前言 在NET6开始做ASP.NETCore的开发,我们首先要看的是启动过程,而WebApplication和WebApplicationBuilder类是启动过程好不开的类,WebApplicationBuilder来引导启动,这和前面Core的版本引导启动分为Program和Startup是不同的,.NET6及以上版本直接使用Program中引导启动,而We......
  • 监听套接字状态的四个宏
    监听套接字状态的四个宏1.FD_ISSET(intfd,fd_set*set):作用:检查文件描述符fd是否在fd_set类型的集合set中被设置。返回值:如果fd在集合中,则返回非零值(通常是1);如果不在集合中,则返回0。2.FD_SET(intfd,fd_set*set):作用:将文件描述符fd添加到fd_set类型的集合......
  • CASIO fx-991CN X 使用
    复数转换\(a+b\,{\mathrmi}\leftrightarrowr\angle\theta\)进入复数运算模式菜单2输入待转换数OPTN⬇️,选择目标格式。=可通过SHIFT设置⬇️2选择默认输出格式角度弧度转换例:将弧度转换为角度在角度模式D下输入待转换的弧度值。(若要转换模式,SHIFT菜单......
  • 【YOLOv8改进】HAT(Hybrid Attention Transformer,)混合注意力机制 (论文笔记+引入代
    YOLO目标检测创新改进与实战案例专栏专栏目录:YOLO有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLO基础解析+创新改进+实战案例摘要基于Transformer的方法在低级视觉任务中表现出色,例如图像超分辨率。......
  • 【YOLOv8改进】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力
    YOLO目标检测创新改进与实战案例专栏专栏目录:YOLO有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLO基础解析+创新改进+实战案例摘要通道或空间注意力机制在许多计算机视觉任务中表现出显著的效果,可以......
  • 【YOLOv8改进】ACmix(Mixed Self-Attention and Convolution) (论文笔记+引入代码)
    YOLO目标检测创新改进与实战案例专栏专栏目录:YOLO有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLO基础解析+创新改进+实战案例摘要卷积和自注意力是两个强大的表示学习技术,通常被认为是彼此独立的两......
  • Mathematica Partial Fraction Decomposition
    遇到的问题Mathematica中有一个自带的部分分式分解函数Apart。In:=Apart[(-3+x)/((-1+x)(1+x))]Out:=-(1/(-1+x))+2/(1+x)但是Apart遇到分解结果中带无理数的就会摆烂:In:=Apart[x/(1-x-x^2)]Out:=-(x/(-1+x+x^2))解决方案1我们有一个......
  • 【工作必备知识】Linux磁盘I/O故障排查分析定位 iostat 介绍
    【工作必备知识】Linux磁盘I/O故障排查分析定位iostat介绍大家好,我是秋意零。前言:今天,介绍Linux磁盘I/O故障排查时,必备命令iostat。该命令是监视系统I/O设备使用负载,它可以实时监视IO设备,从而帮助我们进行分析定位问题。iostat命令介绍iostat命令:监视系统I/O设备使......
  • vuInhub靶场实战系列--Kioptrix Level #3
    免责声明本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。目录免责声明前言一、环境配置1.1靶场信息1.2靶场配置二、信息收集2.1主机发现2.1.1netdiscover2.1.2arp-scan主机扫描2.2端口扫描2.3指纹识别2.......
  • IO进程线程(十一)进程间通信 消息队列
    文章目录一、IPC(Inter-ProcessCommunication)进程间通信相关命令:(一)ipcs---查看IPC对象(二)获取IPC键值(三)删除IPC对象的命令(四)获取IPC键值的函数1.函数定义2.使用示例二、消息队列(一)特点(二)相关API1.创建或获取一个消息队列2.向消息队列中写消息3.在消息队列中......