网络基础扫盲-多路转发

博客内容:多路转发的常见方式select,poll,epoll


文章目录

  • 一、五种IO模型
  • 二、多路转发的常见接口
    • 1.select
    • 2、poll
    • 3、epoll
  • 总结


前言
Linux下一切皆文件,是文件就会存在IO的情况,IO的方式决定了效率的高低。

一、五种IO模型

  • 阻塞IO
    内核将数据准备好之前,系统调用会一直等待。 比较常见的IO方式,在我们使用scanf、cin等函数需要从键盘等外设中获取数据,如果我们一直不输入数据,程序会运行到对应的地方卡住,进行阻塞等待。
  • 非阻塞IO
    非阻塞IO,如果内核数据没有准备好,系统调用任然会返回。系统中的父进程在对于子进程的回收时,参数可以设置非阻塞的。比较形象的说法就是排队时可以听着音乐,时不时的看看是否轮到自己。在阻塞的基础上多了一个对于文件描述符的轮询,对于cpu来说就是比较大的浪费。特定场合下才会被使用。
  • 信号驱动IO
    信号的IO方式,内核将数据准备好后,使用SIGIO信号通知引用程序进行IO操作。常见的就是生产消费模型。
  • 多路转发IO
    多路转接,也叫多路复用。表面看来就是阻塞IO,但是比较不同的是阻塞IO是一对一,而多路转接是多对一。就是广撒网的方式。
  • 异步IO
    在内核数据拷贝完成时,通知程序。值得注意的是信号IO是告知程序什么时候可以进行数据的拷贝。

可以说IO就是等待+读写。IO效率取决于等待的时间。

二、多路转发的常见接口

1.select

函数原型:

int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout)
  1. 参数一就是对于所需要监视的最大文件描述符+1。
  2. 第二、三、四个参数分别是对可读文件描述符集合,可写文件描述符集合,异常文件描述符的集合。参数的类型是位图,位图的位置代表的数文件描述符,对应的位置表示对应的文件描述符是否是被监视,不需要的直接置null。在这里插入图片描述
    为了使用方便可以这组fd_set的接口
void FD_CLR(int fd, fd_set *set); // 用来清除描述词组set中相关fd 的位
int FD_ISSET(int fd, fd_set *set); // 用来测试描述词组set中相关fd 的位是否为真
void FD_SET(int fd, fd_set *set); // 用来设置描述词组set中相关fd的位
void FD_ZERO(fd_set *set); // 用来清除描述词组set的全部位
  1. 参数五就是对于这些文件描述符的一种方式。参数直接取值为null表示是阻塞时读取。为0是非阻塞,{n,0} 表示在规定时间内没有事件发生 ,超时就会返回,少于规定时间返回剩余的时间。select是进行IO等待了。
    中间的位图参数是一个输入输出型的参数,如果select返回后会把以前加入但是无事件发生的fd清空,就需要使用一个数组进行数据的保存。
    在使用中每一次都需要手动设置fd集合。需要从用户态拷贝到内核态,在用户态、内核态都需要进行遍历所有的fd。开销比较大。最重要的是select使用的位图结构会存在文件描述符数量受限的情况。

最重要的一点,在使用select函数时,用户需要传递一个数组作为参数,用于存储可读、可写和错误事件的文件描述符集合。这是因为操作系统内核不知道用户需要监视哪些文件描述符,因此用户需要自己维护一个数组来告诉内核要监视哪些文件描述符。而且这个数组需要在每次调用select函数时重新初始化,告诉内核新的监视对象。因此,select需要用户自己维护数组。

2、poll

poll函数原型:

int poll(struct pollfd *fds, nfds_t nfds, int timeout);
// pollfd结构
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};

参数说明

  1. fds是一个poll函数监听的结构列表. 每一个元素中, 包含了三部分内容: 文件描述符, 监听的事件集合, 返 回的事件集合。
  2. nfds表示fds数组的长度. 。
  3. timeout表示poll函数的超时时间, 单位是毫秒(ms)
    返回值小于0表示失败,等于0表示poll等待超时。dyu0,表示监听的文件描述符就绪二返回。
    poll在使用上比select简单而且解决了select表示文件描述符表数量受限的问题。但是poll在返回后还是需要轮询pollfd来获取就绪的文件描述符。同时在每次的调用时都需把大量的pollfd结构从用户态拷贝到内核态。连接的大量客户端在同一时刻可能只有很少的处于一个就绪状态。随着监视的描述符数量的增长,效率也会出现线性的下降。

3、epoll

epoll是为了处理大批量的句柄而改进的poll。
使用epoll的三部曲

  1. 调用epoll_create创建一个epoll句柄;
  2. 调用epoll_ctl 将要监控的文件描述符进行注册;
  3. 调用epoll_wait 等待文件描述符就绪
int epoll_create(int size);

参数:自从linux2.6.8之后, size参数是被忽略的.用完之后, 必须调用close()关闭。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

参数:第一个就是epoll模型,epoll_create()的返回值。参数二是表示的动作,通常使用宏来表示

  • EPOLL_CTL_ADD :注册新的fd到epfd中;
  • EPOLL_CTL_MOD :修改已经注册的fd的监听事件;
  • EPOLL_CTL_DEL :从epfd中删除一个fd

参数三是需要监听的文件描述符,参数四是监听文件描述符的什么事件。

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
  • 参数events是分配好的epoll_event结构体数组
  • .epoll将会把发生的事件赋值到events数组中 (events不可以是空指针,内核只负责把数据复制到这个events数组中,不会去帮助我们在用户态中分配内存).
  • maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size.
  • 参数timeout是超时时间 (毫秒, 0会立即返回,-1是永久阻塞).如果函数调用成功,返回对应I/O上已准备好的文件描述符数目,如返回0表示已超时, 返回小于0表示函数失败。

为啥epoll好?
通过与select的缺点对应比较。

  • 接口方便:虽然拆分了三个函数,但是更加高效,使用select时需要每次都访问自己维护的数组。输入输出的参数进行了分离。
  • 数据拷贝更加的轻量化:在对于文件描述符的添加时不是一直都都需要调用EPOLL_CTL_ADD进行拷贝到内核中的,不会像select一样操作频繁。
  • 事件回调机制:避免使用了遍历,使用的是回调函数机制,就绪的文件描述符结构加入就绪队列中,epoll_wait返回直接访问就绪队列的就是知道哪些文件描述符已经就绪。事件复杂度是O(1)的。
  • 没有数量上的限制。

以上的优点何以见得,epoll的底层原理就是
每一个epoll对象都有一个独立的eventpoll的结构体,用来存放epoll_ctl方法向epoll对象中添加进来的事件。事件挂载到红黑树上,重复添加就是对于红黑树的节点的增,查,改操作。添加的事件都会与外界的设备程序建立回调关系,事件一旦发生就会触发对应的回调函数。回调的方法在内核中ep_poll_callback,它再将发生的事件添加到rdilist双向链表中,双向链表作为epoll_wait的消息队列。对于同一个事件节点是被红黑树和消息队列的俩个数据结构共用的。
在这里插入图片描述
三者之间的对比

特性selectpollepoll
可监视的fd数最大为FD_SETSIZE没有限制没有限制
事件触发方式轮询轮询事件通知
I/O效率一般
内存占用适中
时间复杂度O(n)O(n)O(1)
可移植性跨平台跨平台仅在Linux、BSD等少数平台支持
文件描述符生命周期控制子进程不继承fd子进程不继承fd子进程自动继承fd

总结

select适用于连接数较少的情况,可移植性好,但效率较低;poll效率高于select,但仍然存在遍历fd集合的缺点;epoll适用于连接数较多的场景,且能够避免无用的遍历,效率最高,但只能运行在Linux系统上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java+springboot+vue在线选课系统

项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用JAVA语言,结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、课程管理、专业管理、院系信息管理、学生…

Cube MX 开发高精度电流源跳坑过程/SPI连接ADS1255/1256系列问题总结/STM32 硬件SPI开发过程

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 1.使用STM32F系列开发一款高精度恒流电源,用到了24位高精度采样芯片ADS1255/ADS1256系列。 2.使用时发现很多的坑,详细介绍了每个坑的具体情况和实际的解决办法。 坑1:波特率设置…

如何使用Ruby 多线程爬取数据

现在比较主流的爬虫应该是用python,之前也写了很多关于python的文章。今天在这里我们主要说说ruby。我觉得ruby也是ok的,我试试看写了一个爬虫的小程序,并作出相应的解析。 Ruby中实现网页抓取,一般用的是mechanize,使…

Pytorch从零开始实战08

Pytorch从零开始实战——YOLOv5-C3模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-C3模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook,使用Python3.8&#xff0c…

webJS基础-----制作一个时间倒计时

1,可以使用以下两个方式制作 方式1:setTimeout ()定时器是在指定的时间后执行某些代码,代码执行一次就会自动停止; 方式2:setInterval ()定时器是按照指定的周期来重复执行某些代码,该定时器不会自动停止…

DL Homework 6

目录 一、概念 (1)卷积 (2)卷积核 (3)特征图 (4)特征选择 (5)步长 (6)填充 (7)感受野 二、探究不同卷…

JVM运行时数据区-堆

目录 一、堆的核心概述 (一)概述 (二)堆空间细分 (三)jvisualvm工具 二、设置堆内存的大小与OOM 三、年轻代与老年代 四、图解对象分配一般过程 五、对象分配特殊过程 六、常用调优工具 七、Mino…

leetCode 416.分割等和子集 + 01背包 + 动态规划 + 记忆化搜索 + 递推 + 空间优化

关于此题我的往期文章: LeetCode 416.分割等和子集(动态规划【0-1背包问题】采用一维数组dp:滚动数组)_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133212716看本期文章时&…

关于JADX和JEB的小问题

关于JADX和JEB的小问题 很久没水过技术文啦,最近也刚好遇到点小问题,特此记录 第一个问题 在处理app加密逻辑的时候一直拿不到正确的密文,反复看了反编译出来的代码(如下图) public static string n(String str, Stri…

基础课22——云服务(SaaS、Pass、laas、AIaas)

1.云服务概念和类型 云服务是一种基于互联网的计算模式,通过云计算技术将计算、存储、网络等资源以服务的形式提供给用户,用户可以通过网络按需使用这些资源,无需购买、安装和维护硬件设备。云服务具有灵活扩展、按需使用、随时随地访问等优…

linux 查看当前目录下每个文件夹大小

要在 Linux 中查看当前目录下每个文件夹的大小,可以使用 du 命令(磁盘使用情况)结合其他一些选项。下面是几个常用的命令示例: 显示当前目录下每个文件夹的大小——只显示一层文件夹: du -h --max-depth1该命令会以人…

2023年内衣行业分析:京东大数据平台-服饰内衣市场解析

如今,女性消费力的提升正在推动国内女性内衣市场份额逐年提升。而今年,内衣市场更是进入了存量之战,增长趋势明显减弱。 根据鲸参谋数据显示,今年1月至9月,京东平台内衣(文胸)累计销量约500万件…

【数智化案例展】某国际高端酒店品牌——呼叫中心培训数智化转型项目

‍ 维音案例 本项目案例由维音投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 培训是呼叫中心管理的重要环节,由于员工流动性强、培训需求多样、考核流程繁琐…

2003 - Can‘t connect to MysQL server on ‘39.108.169.0‘ (10060 “Unknown error“)

问题描述 某天和往常一样启动java项目,发现数据库出问题了,然后打开navicat,发现数据库的链接都连接不上, 一点击就会弹出报错框: 然后就各种上网搜索。 解决方案 上网查了一些解决方案,大部分都是说看…

hivesql,sql 函数总结:

1、NVL函数与Coalesce差异 -- select nvl(null,8); -- 结果是 8 -- select nvl(,7); -- 结果是"" -- select coalesce(null,null,9); -- 结果是 9 -- select coalesce("",null,9); -- 结果是 "" 1.2、 NVL函数与Coalesce差异 …

DB-GPT介绍

DB-GPT介绍 引言DB-GPT项目简介DB-GPT架构关键特性私域问答&数据处理多数据源&可视化自动化微调Multi-Agents&Plugins多模型支持与管理隐私安全支持数据源 子模块DB-GPT-Hub微调参考文献 引言 随着数据量的不断增长和数据分析的需求日益增多,将自然语言…

Technology strategy Pattern 学习笔记4 - Creating the Strategy-Corporate Context

Creating the Strategy-Corporate Context 1 •. Stakeholder Alignment 1.1 要成功,要尽可能获得powerful leader的支持 1.2 也需要获得最高执行层的支持 1.3 Determining(确定) Stakeholders 需要建立360度组织图,确认三类人…

基于深度学习的目标检测算法 计算机竞赛

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

适用于 Linux 的 WPF:Avalonia

许多年前,在 WPF 成为“Windows Presentation Foundation”并将 XAML 作为 .NET、Windows 等的 UI 标记语言引入之前,有一个代号为“Avalon”的项目。Avalon 是 WPF 的代号。XAML 现在无处不在,XAML 标准是一个词汇规范。 Avalonia 是一个开…

EtherCAT主站写从站EEPROM抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站(本文使用步进电机驱动器) 3.Wireshark1 抓包分析 1.1 报文总览 本文主站设置从站1字地址为0的EEPROM数据为0x3C00(设置完毕后请还原字0的EEPROM数据),使用Wireshark抓取到…