Linux系统网络编程——第十九节 多路复用(1)(概念、select、poll)

news2024/9/23 9:32:46

目录

概念引出

select

select的特点

select缺点

poll


概念引出

我们来思考一个问题:

 

什么叫IO(input output)?

读取或者写入(IO)本质就是:等+拷贝。

读:等+将数据从内核空间(缓冲区)拷贝到用户空间(缓冲区)

写:等+将数据从用户空间(缓冲区)拷贝到内核空间(缓冲区)

等是在等什么呢?

某事件就绪。即有数据可读或者可写的时候,或者达到一定的“水位线”的时候

而高效IO即在IO的过程当中,尽可能减少等的比重。

那我们应当怎么促使高效IO呢?

我们有五种IO模型,分别是:

1、阻塞IO;

2、非阻塞IO;

3、信号驱动IO;(发送SIGIO,默认忽略)

4、多路复用,多路转接;

5、异步IO;

前四种都称之为同步IO。

我们之前用到的IO基本都是阻塞式IO。

我们下面所要学的select、poll、epoll做的就是一件事,就是等。

既然一个文件描述符等待结束的概率很小是固定的,那我就通过等待多个文件描述符的方式来去让其去减少等的比重

将一个阻塞式的文件描述符改成一个非阻塞的:(原型如下)

fcntl

函数原型如下.

#include <unistd.h>

#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );

传入的cmd的值不同, 后面追加的参数也不相同

实现函数SetNoBlock

基于fcntl, 我们实现一个SetNoBlock函数, 将文件描述符设置为非阻塞.

void SetNoBlock(int fd) {
    int fl = fcntl(fd, F_GETFL);
    if (fl < 0) {
        perror("fcntl");
        return;

    }
    fcntl(fd, F_SETFL, fl | O_NONBLOCK);

}

 

使用F_GETFL将当前的文件描述符的属性取出来(这是一个位图).

然后再使用F_SETFL文件描述符设置回去. 设置回去的同时, 加上一个O_NONBLOCK参数.

select

它的作用就是来等。

附fd_set的源码:

 解释说明:老规矩,采用列点式。

 1、第一个参数表示我所要等的所有的文件描述符的最大值加1.注意不是个数+1,因为我们后面要传入位图

2、最后一个参数:为等的方式:阻塞式等、非阻塞式等,设置某一段时间来去等

3、其返回值有三种形式:大于0表示已经有文件描述符就绪了;等于0表示超时了;小于0表示出错了

4、中间三个参数表示读/写的文件描述符集,其是用一张位图来表示的。

5、以readfds为例,其既是输入型参数,又是输出型参数。输入的时候,表示告知OS需要关心哪些文件描述符上的读事件是否就绪。(其是一张位图,比如哪一个位置置为1,就表示该位置所对应的文件描述符就需要关心;即需要关心哪些位置上的读事件)

6、然后OS将上述所要关注的文件描述符进行轮询。在输出的时候,哪个位置为1,哪个位置所对应的文件描述符的文件读(写)事件就绪。

7、select结束之后,我们需要用这个readfds去检测哪个就绪了,然后需要对其进行重新设定。

8、注意:我们这里引入一个低水位线:即缓冲区里的最小字节数。

故select的本质方式就是在等,等待就绪事件的方式

注意:对位图的操作必须要用系统调用接口。因为不同的地方位图实现的方式可能不一样

select的特点

可监控的文件描述符个数取决于sizeof(fd_set)的值. 我这边服务器上sizeof(fd_set)= 512,每bit表示一个文件描述符,则我服务器上支持的最大文件描述符是512*8=4096.

 将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd,

一是用于再select 返回后, array作为源数据和fd_set进行FD_ISSET判断。

二是select返回后会把以前加入的但并无事件发生的fd清空,则每次开始select前都要重新从array取得fd逐一加入(FD_ZERO最先),扫描array的同时取得fd最大值maxfd,用于select的第一个参数。

备注: fd_set的大小可以调整,可能涉及到重新编译内核. 感兴趣的同学可以自己去收集相关资料.

 

select缺点

1、每次调用select, 都需要手动设置fd集合, 从接口使用角度来说也非常不便.

 2、每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大

 同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

 select支持的文件描述符数量太小,为有限个

poll

就绪事件通知函数

poll主要是解决了select的两个问题:

1、poll没有上限;

2、输入输出含义让分离(采用两个变量)

timeout如果为0,表示以非阻塞方式等待,如果为-1,表示为永久阻塞方式;如果为一个常数,那就是具体常数的等待的时间。

第一个参数是一个结构体数组;

第二个参数表示该结构体数组里面的元素个数

关于该结构体:

第一个参数表示关注文件描述符。

第二个参数和第三个参数分别是用户->内核、内核->用户 关心该描述符的哪方面以及是否就绪

那么事件具体又指什么呢?

其选项和read、open的参数类似,采用的是(多标志位,直接按位或)

【poll实验】

运行截图:

 

一种用poll监听的伪代码

注意:

poll中监听的文件描述符数目增多时,和select函数一样, poll返回后,需要轮询pollfd来获取就绪的描述符。每次调用poll都需要把大量的pollfd结构从用户态拷贝到内核中.

同时连接的大量客户端在一时刻可能只有很少的处于就绪状态, 因此随着监视的描述符数量的增长, 其效率也会线性下降.

 

好啦,本节的内容就到这里啦~~

原创不易,如果觉得写的不错,就点个赞呗~~~笔芯~~~~

下面是笔者的微信公众号,也欢迎来关注呀~~~

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

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

相关文章

C++(第十一篇):继承(基类与派生类、菱形继承和菱形虚拟继承问题)

&#x1f4d2;博客主页&#xff1a;Morning_Yang丶 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4cc;本文所属专栏&#xff1a;【C拒绝从入门到跑路】 &#x1f64f;作者水平有限&#xff0c;如果发现错误&#xff0c;敬请指正&am…

虚拟机||后续1:使用Virtual Box7.0.4安装Ubuntu20.04图文教程+解决时间显示乱码问题

这个博主超爱碎碎念&#xff1a;&#xff09; 哈喽&#xff0c;四海八方的友友们&#xff0c;我胡汉三又回来啦&#xff08;&#xffe3;︶&#xffe3;&#xff09;↗ 有挺长一段时间没更新了&#xff0c;转眼间12月了&#xff0c;又到年底冲业绩的时候啦ψ(&#xff40;∇)ψ…

【大数据入门核心技术-Hadoop】(七)Hadoop基本Shell命令行

目录 一、 三种shell命令方式 二、常见Shell操作命令 1、创建文件夹 2、查看指定目录下内容 3、上传文件到HDFS指定目录下 4、查看HDFS文件内容 5、下载HDFS文件 6、拷贝HDFS文件 7、追加数据到HDFS文件中 8、HDFS数据移动操作 9、创建文件 10、查看磁盘使用情况 1…

金融信创与云化转型|基金超融合架构转型与场景探索合集

随着数字化经济的蓬勃发展&#xff0c;基金数字化转型作为金融行业发展的重点被提上日程。其中&#xff0c;证监会于 2022 年 4 月发布的《关于加快推进公募基金行业高质量发展的意见》中强调&#xff0c;基金行业应强化行业基础设施建设&#xff0c;以拥抱数字化金融市场&…

MySQL内置函数

MySQL内置函数1 .日期函数2.字符串函数3.数学函数4.其它函数5.综合练习题1 .日期函数 current_date() 当前日期获得年月日 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2022-12-10 | ---------------- 1 row in set (0.0…

C语言基础—程序创建过程和编译过程

C程序的创建过程 4️⃣ C 程序的创建过程有4️⃣个基本步骤&#xff1a; 编写、编译、链接和运行。 编写&#xff1a;用文本编辑器或IDE编写源代码。源代码包含程序所需的所有命令和语句。编译&#xff1a;使用编译器对源代码进行编译&#xff0c;生成可执行文件。 - .o 文件…

gyp ERR find Python 解决方案

命令行报错如下 E:\vue-admin\node_modules\fibers>if not defined npm_config_node_gyp (node "D:\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild --releas e ) else (node "…

Java项目:SSM物流快递管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 仓库管理员角色包含以下功能&#xff1a; 仓库管理员操作,入库操作,员工查看,揽收快件,新建员工等功能。 快递员角色包含以下功能&#xff1a; …

Nacos服务注册解析

服务注册就是在微服务启动时自动注册进nacos注册中心&#xff0c;核心逻辑就是在启动时调用nacos-server端的http接口:/nacos/v1/ns/instance&#xff0c;具体参考nacos官方文档。 我们打开nacos源码结构查看 上图为Nacos2.2的源码结构.其中比较核心的就是这几个包&#xff1…

墨者学院 PHP代码分析溯源(第4题) 详解

今天继续给大家介绍CTF通关writeup&#xff0c;本文主要内容是墨者学院 PHP代码分析溯源(第4题)。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严…

尝试使用CubeMX做stm32开发之十四:FatFs的基础知识

一、文件系统概念 文件系统&#xff1a;在存储介质中建立一种组织架构&#xff0c;以更好地储存和管理数据 文件系统一般包含&#xff1a;操作系统引导区、目录、文件等 文件系统中数据以文件的形式存储 文件系统中数据的存取需要遵循特定的格式 与直接操作存储介质相比&a…

[附源码]计算机毕业设计基于SpringBt的演唱会购票系统论文2022Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C++ MySQL Error 1366 incorrect string value引发的认识

C MySQL Error 1366 incorrect string value引发的认识 前言 在使用MySQL C API编写程序时&#xff0c;由于用到了中文&#xff0c;导致出现了MySQL error 1366 incorrect string value 问题&#xff0c;但令我同样不解的是我用同样的语句在cmd下可以正常执行。&#xff08;M…

【算法】动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )

文章目录一、问题分析二、动态规划算法设计1、动态规划状态 State2、动态规划初始化 Initialize3、动态规划方程 Function4、动态规划答案 Answer三、代码示例LeetCode 63. 不同路径 II : https://leetcode.cn/problems/unique-paths-ii/ 一个机器人位于一个 m x n 网格的左上…

java初步学习 String(基于小李的课进行自学,初学者)12

初步学习 String 基本概念 String类型即为字符串类型&#xff0c;即“103”&#xff0c;“abc”,"小陈"等字符类型&#xff0c;在工作中可用于加密&#xff0c;替换&#xff0c;截取&#xff0c;查找等工作 不过这种名词显然不能联想到工作的实际样子 例&#xff1a;…

[附源码]Python计算机毕业设计SSM基于框架的旅游订票系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

IIS 之 添加MIME扩展类型及HTTP错误403

IIS 之 添加MIME扩展类型及HTTP错误403 我是艾西今天跟大家分享下IIS添加MIME及HTTP报错403 经常用IIS作为下载服务器的时候有时传上去的文件比如 example.mp4 文件名上传后&#xff0c;但是用http打开的时候确显示为 404 文件不存在。其实是IIS对文件的一种保护&#xff0c;…

基于java+springboot+mybatis+vue+mysql的校园志愿者管理系统

项目介绍 本校园志愿者管理系统以springboot作为框架&#xff0c;前端vue技术&#xff0c;b/s模式以及mysql作为后台运行的数据库&#xff0c;同时使用Tomcat用为系统的服务器。本系统主要包括首页、个人中心、志愿者管理、活动类型管理、活动信息管理、活动报名管理、活动通知…

游戏开发49课 性能优化7

4. 渲染优化 渲染优化的目的是减少Draw Calls&#xff0c;减少渲染状态切换开销&#xff0c;降低显存占用&#xff0c;降低带宽和GPU负担。在讲解渲染优化之前&#xff0c;先了解渲染性能消耗点。 Draw Call数量 Draw Call有些引擎也称为SetPass Call。一个Draw Call就是游戏调…

叫ChatGPT用html+css+js写一个圣诞节代码,看看什么样子?

最近ChatGPT这么火&#xff0c;那就让他给我写点代码吧。 如何注册一个账号&#xff0c;参考&#xff1a;注册ChatGPT详细指南 注册不了的小伙伴们&#xff0c;咱们评论区见&#xff0c;问一个最想问的问题&#xff0c;看到就给你回复&#xff01; 我已经注册好了&#xff0c;…