首页 > 其他分享 >IO多路复用:Select, Poll与Epoll

IO多路复用:Select, Poll与Epoll

时间:2024-05-19 15:43:09浏览次数:21  
标签:socket 队列 IO 进程 Poll 监听 Select

IO多路复用:Select, Poll与Epoll

参考:EPOLL原理详解(图文并茂)

一、网络数据是如何被接收的

  1. 网卡接收到网络数据
  2. 将网络数据暂存到内存当中(DMA传输技术)
  3. 网卡向CPU发起硬件中断
  4. CPU执行中断处理函数,将内存中的数据存储到socket文件描述符中,并唤醒相关进程

Q1: 如何知道要将网络数据存储到哪个socket文件中?
A1: 每个socket都由(IP地址:端口号)唯一标识

Q2: Socket文件由哪几个部分组成?
A2: 输入缓冲区、输出缓冲区和等待队列(存放等待该文件的进程引用)

二、IO多路复用

思想:用一个进程/线程同时监听多个IO操作(如socket),直到它们中的一个或多个准备就绪
优点:

  • 允许单个进程处理大量连接,减少了内存和CPU资源的消耗
  • 减少系统调用的次数,因为一次系统调用可以检查多个IO操作
  • 减少了线程\进程的数量,因此可以减少上下文切换的次数

三、Select和Poll

Select的工作流程:

  1. 在用户态维护一个监听队列(数组),用于存放需要监听的socket
  2. Select系统调用,将当前进程插入所有socket的等待队列后阻塞
  3. 触发中断程序后,将原进程从所有socket的等待队列移除并唤醒
  4. 用户态进程遍历数组找到触发IO的socket并执行相应的操作

缺点:

  • 每次Select系统调用都需要遍历两次队列(将进程插入和删除等待队列)
  • 每次Select系统调用都需要将整个socket数组传递给内核

Poll与Select的主要区别在于使用链表存储需要监听的socket

四、Epoll

Epoll的工作流程:

  1. 在内核中维护eventpoll对象,包含一个监听队列(红黑树)和一个就绪队列(双向链表)
  2. 使用epoll_ctl系统调用向监听队列中添加或删除所要监听的socket
  3. 当socket触发IO事件时,中断程序将socket引用加入就绪队列中,并不直接唤醒进程
  4. 使用epoll_wait系统调用将当前进程插入到eventpoll的等待队列中等待就绪队列的返回
  5. 用户态对准备就绪的socket进行操作

标签:socket,队列,IO,进程,Poll,监听,Select
From: https://www.cnblogs.com/yujunjiang/p/18200202

相关文章

  • Narrative writing revision
    In221BCE,I-QinshihuangbecametheFirstEmperorofChina.AstorytellertoldmeaninterestingtaleaboutNuwa,theGreatMotherGoddess.Thenanideaappearedinmymind.Iwasdeterminedtofindtheloststone.Soitwouldhelpmebuildastrongempi......
  • APIO2024 游记
    5.15爽逃石门,下午两点到杭州,被教练通知自己打车到酒店,还和教练换到了同一家。四点钟去西湖玩,景色非常怡人,惠风和畅,令人心旷神怡。后来打车到印象城吃饭,大战抽象的BrickBro,遗憾告负。之后走回酒店,路上经过看到闪闪发光的学军高楼,这真的不是商场配置吗?在房间报复性抽机许久,伯牙绝......
  • revision
    TheLittleMatchGirlItwasthelastdayofthisyear.Theweatherwaschillwithsnowflakesdancingintheair.Iwaspushedtosellmatchesbymymother.Iknewthatshedidn’tlikeme.WhenIlefthome,Iworeapairofoversizeslippers,whichbelonged......
  • 【转载】Verilog对数据进行四舍五入(round)与饱和(saturation)截位
    jgliu</div><!--end:blogTitle博客的标题和副标题--><divid="navigator">博客园首页新随笔联系订阅管理 <divclass="blogStats"> <spanid="stats_post_count">随笔-19&nbsp;</span>文......
  • Revision writing
    Onceuponatime,achildlesscouplelongedforababy.Buttheirwishnevercometrue.Andthereisagardenbehindtheirhouse.Oneday,thewifefoundaninvitinglettuceinthegarden.However,frightenedandtimid,thewifecouldn’tgetthislettucei......
  • 百度 Apollo 自定义安装第三方库(以 libtorch 为例)_apollo 使用自定义库
    CSDN搬家失败,手动导出markdown后再导入博客园百度Apollo是一个非常优秀的自动驾驶框架,但我们平时在开发中也会遇到各种原repo没有处理的问题。笔者近期想用pytorch的C++前端推理模型,但是遇到了libtorch版本与pytorch版本不匹配的问题,因此想自己安装一个新版本的li......
  • 百度 Apollo 自定义模块发布——使用 Python 语言(bazel 编译 Python 模块)_bazel-bin b
    CSDN搬家失败,手动导出markdown后再导入博客园BinaryvsComponent首先说明下,Apollo的核心概念是组件,通过组件可以实现资源的自动管理和调度。CyberRT中只能使用C++语言实现Component,Python版的API只能用来写传统的二进制可执行文件,参考官方文档中这两种方式的区别:B......
  • 百度 Apollo 使用 bazel 编译 C++ Boost 依赖出现 undefined reference to `boost::pyth
    CSDN搬家失败,手动导出markdown后再导入博客园因为一些原因,楼主想在Apollo自动驾驶框架里使用Boost.python工具来用C++调用Python,从网上找了个例子想编译下试试。C++代码如下(boost.python/EmbeddingPython-PythonWiki):#include<boost/python.hpp>usingnamesp......
  • Visual Studio 2015 编写 CUDA 关键字高亮并自动补全_cuda vs 波浪线
    CSDN搬家失败,手动导出markdown后再导入博客园第一步,是在vs2015里面设置vc++文件支持.cu;cuh;文件。方法:工具->选项->文本编辑器->文件扩展名。得到如图所示的界面:注意,在右侧可以添加vc++类型的文件扩展名,这是我的设置效果,操作就不用细说了。![[output/attachme......
  • Narrative writing revision
    ThestoryIchoose:TheLittleMatch-GirlThepointofviewofthestory:ThirdpersonpointofviewNewpointofview:FirstpersonpointofviewScript:ThatwasaChristmasEvewithheavysnow.Iwanderedonthestreet,tryingtosellmymatches.“Matc......