【网络编程】IO多路复用
IO多路复用是一种高效的I/O处理方式,它允许单个进程能够同时监视多个文件描述符(sockets、文件等),并在其中任何一个文件描述符准备好进行I/O操作时进行处理。它的核心在于使用少量的线程或进程来管理多个I/O操作,以提高系统的性能和响应速度。
一、概念
1. IO多路复用的核心
文件描述符集合:使用一个数据结构(如数组或位图)来管理多个文件描述符,通常使用select、poll或epoll等系统调用来监视这些文件描述符。
阻塞与非阻塞:IO多路复用可以与阻塞和非阻塞I/O一起使用。非阻塞I/O允许程序立即返回,而不必等待数据准备好。
事件驱动:当一个或多个文件描述符准备好进行读取或写入操作时,IO多路复用会触发相应的事件,从而通知应用程序执行相应的操作。
单线程/多线程:IO多路复用可以由单个线程或多个线程来处理,取决于应用程序的需求。通常,单个线程可以管理多个文件描述符。
2. 四种IO模型
阻塞IO模型(Blocking IO)
① 阻塞IO模型是最简单的IO模型之一;
② 当程序执行IO操作时,它会被阻塞,直到IO操作完成为止;
③ 这种模型的效率较低,因为程序在等待IO完成期间无法执行其他任务。
非阻塞IO模型(Non-blocking IO)
① 非阻塞IO模型允许程序在等待IO完成时继续执行其他任务;
② 当程序请求IO操作时,它会立即返回,不会被阻塞;
③ 程序需要不断轮询以检查IO操作是否完成,这可能会导致CPU资源浪费。
多路复用IO模型(IO Multiplexing)
① 多路复用IO模型使用了一种机制,允许程序同时等待多个IO操作的完成;
② 通常使用select、poll或epoll等系统调用来实现;
③ 程序可以同时监视多个文件描述符,只有当其中某个文件描述符有IO事件发生时,程序才会被唤醒处理该事件。
异步IO模型(Asynchronous IO)
① 异步IO模型中,程序发起IO操作后立即返回,不会阻塞;
② 当IO操作完成时,系统会通知程序,然后程序处理完成的数据;
③ 这种模型的效率很高,因为程序不需要轮询,但实现复杂度较高。
因此IO复用的核心基本思想为:先构造一张有关描述符的表,然后调用一个函数。当这些文件描述符中的一个或多个已准备好进行I/O时函数才返回。函数返回时告诉进程哪些描述符已就绪,可以进行I/O操作。
3. IO复用的优点
-
高效利用CPU:相较于传统的多线程/多进程模型,IO多路复用可以减少线程/进程的创建和切换开销,提高CPU的利用率。
-
减少资源占用:减少了每个连接的资源消耗,因为不再需要为每个连接创建一个线程或进程。
-
简化程序逻辑:IO多路复用可以简化程序的逻辑,使得代码更易于维护和理解。
二、代码实现(TCP服务器端为例)
1. 创建监听套接字socket
// 创建套接字socketint ser_socket = socket(AF_INET, SOCK_STREAM, 0);if (ser_socket == -1){perror("socket");return -1;}int reuse = 1;//设置套接字属性, SO_REUSEADDR 允许端口重用 if(setsockopt(ser_socket, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(reuse))<0){perror("setsockopt error");return -1;}
2. 初始化套接字和服务器自己的IP地址结构体(包括端口号)
// 初始化地址结构体 // IP地址+PORT端口号struct sockaddr_in addr;addr.sin_family = AF_INET; //地址簇addr.sin_port = atoi(argv[1]); //端口(一般以传参的传进来)// addr.sin_addr.s_addr = inet_addr("192.168.1.25"); //IP地址addr.sin_addr.s_addr = htonl(INADDR_ANY); //用特殊的"0.0.0.0"这个IP来绑定本机IP地址
3. 绑定bind
// 绑定地址结构体bindint b = bind(ser_socket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));if(b == -1){perror("bind");return -1;}printf("绑定成功\n");
4. 开启监听listen
int l = listen(ser_socket, 3);if (l == -1){perror("listen");return -1;}printf("监听成功\n");//ser_socket由 待链接套接字 变成 监听套接字
5. 创建文件描述符集合,并初始化
这里呢设置了套接字超时,就是在规定的时间内如果没有客户端连接,则退出服务器。
//设置套接字接收超时struct timeval tv;tv.tv_sec = 5; //超时秒数tv.tv_usec = 0;setsockopt(ser_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); // 等待连接acceptstruct sockaddr_in c_addr; //用来存放客户端链接成功之后的IP加端口int addrlen = sizeof(c_addr);int new_socekt = accept(ser_socket, (struct sockaddr *)&c_addr, &addrlen);if (new_socekt == -1){printf("延时时间到了,服务器退出了\n");perror("accept");return -1;}// new_socekt 链接成功之后,用来通信的套接字printf("客户端【%s】【%u】连接成功\n", inet_ntoa(c_addr.sin_addr), c_addr.sin_port);//客户端的IP跟端口,IP是你客户端本身自带的,但是端口是系统随机分配的啊// 接收消息read/recvchar buf[1024];while(1){bzero(buf, sizeof(buf));read(new_socekt, buf, sizeof(buf));// recv(new_socekt, buf, sizeof(buf), 0);printf(" client %s\n", buf);}
6. 资源释放,关闭套接字
close(new_socekt);// shutdown(new_socekt, SHUT_RDWR);
三、使用场景
1. 网络服务器: IO复用常用于网络服务器,特别是需要同时处理大量客户端连接的情况,例如Web服务器、聊天服务器和在线游戏服务器。
2. 网络代理: 代理服务器需要同时监听多个客户端和服务器连接,以便在它们之间传递数据,这是IO复用的典型应用场景。
3. 聊天应用: 实时聊天应用通常需要处理多个客户端的消息,IO复用可以用于同时监视多个客户端连接,以便实时传递消息。
4. 文件传输应用: 文件传输服务器需要同时处理多个文件上传或下载请求,使用IO复用可以有效管理这些请求。
更多C/C++语言、Linux系统、数据结构和ARM板实战相关文章,关注专栏:
手撕C语言
玩转linux
脚踢数据结构
系统、网络编程
探索C++
6818(ARM)开发板实战
📢写在最后
- 今天的分享就到这啦~
- 觉得博主写的还不错的烦劳
一键三连喔
~ - 🎉🎉🎉感谢关注🎉🎉🎉
相关文章:

【网络编程】IO多路复用
IO多路复用是一种高效的I/O处理方式,它允许单个进程能够同时监视多个文件描述符(sockets、文件等),并在其中任何一个文件描述符准备好进行I/O操作时进行处理。它的核心在于使用少量的线程或进程来管理多个I/O操作,以提…...
MySQL与postgreSQL数据库的区别
MySQL 是一个流行的开源关系型数据库管理系统,具有以下优势: 开源和免费:MySQL 是一个开源软件,允许用户免费下载、使用和修改。它的免费版本(Community Edition)提供了广泛的功能,适用于大多数…...

单片机电子元器件-按键
电子元器件 按键上有 四个引脚 1 2 、 3 4 按下之后 导通 1 3 、 2 4 初始导通 通常按键开关为机械弹性开关,开关在闭合不会马上稳定的接通,会有一连串的抖动 抖动时间的长短有机械特性来决定的,一般为5ms 到10 ms 。 消抖的分类 硬件消…...

Nacos docker实现nacos高可用集群项目
目录 Nacos是什么? Nacos在公司里的运用是什么? 使用docker构建nacos容器高可用集群 实验规划图:编辑 1、拉取nacos镜像 2、创建docker网桥(实现集群内的机器的互联互通(所有的nacos和mysql)&#x…...

基于Dubbo实现服务的远程调用
目录 前言 RPC思想 为什么使用Dubbo Dubbo技术框架 编辑 调用关系流程 基础实现 A.提供统一业务Api B.编辑服务提供者Product B.a 添加依赖 B.b 添加Dubbo 配置(基于yaml配置文件) B.c 编写并暴露服务 C.编辑服务消费者 C.a 添加依赖 C.b 添加Dubbo配置 C.c 引用…...

Redis事务的理解
介绍 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。 事务提供了一种将多个命令请求打包,然后一次性、按照顺序地执行多个命令的机制,并且在事务执行期间,服务器不会因为其他客户端请求而中断事务的执行功能,他会将事务中的…...

PostgreSQL安装异常,服务无法启动导致创建服务器超时
win上安装pg后无法创建服务器,提示创建超时,发现服务列表里面pg15服务 并没有启动,启动服务器发现服务不了,截图忘记截了,复现不了,解决方法是 换个身份,然后继续启动,然后就可以在…...

汽车电子系统网络安全解决方案
声明 本文是学习GB-T 38628-2020 信息安全技术 汽车电子系统网络安全指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 汽车电子系统网络安全范围 本标准给出了汽车电子系统网络安全活动框架,以及在此框架下的汽车电子系统网络安全活动…...

切片机制和MR工作机制
切片机制 默认的切片大小和块大小一致,切片的个数决定了MapTask的个数。 数据倾斜问题:如果某个切片的大小太小,会浪费了MapTask申请的CPU资源。 如果剩余数据长度大于128*1.1, 就切片成2份,否则就不进行切分了。 InputFormat基…...
【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路
postgresql 基础架构 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&…...
是的,决定放弃算法去机器学习了
可是梦想啊!~她永存心间!!! 我啊~本是执着于这些算法的怪咖,梦想是icpc,ccpc~ 可是啊~ 在以后的科研和工作中,这些算法很多都是用不到的,学习算法更重要的目的是锻炼编程能力和分析…...

Python 03(循环语句)
Python03(循环语句) 文章目录 Python03(循环语句)一、while语句二、while实现猜数字三、while循环的嵌套while循环嵌套实例需求: 四、for循环1、什么 是for循环2、语法3、执行流程4、for循环的基本使用5、range()函数6…...

安科瑞铁塔基站能耗监控解决方案
安科瑞 华楠 1 背景概述 5G发展,基站先行。5G基站的选址建设,是保证5G信号覆盖的基础,因此5G基站建设是5G产业布局的一部分,也是5G成熟的基础。 2G、3G、4G均是低频段信号传输,宏基站几乎能应付所有的信号覆盖。但由…...
操作系统-线程复用
操作系统执行线程复用的过程涉及到线程调度和管理。线程复用是指操作系统能够有效地重用现有的线程来执行新的任务,而不必每次都创建新线程。这有助于减少线程创建和销毁的开销,提高系统性能。下面是操作系统如何执行线程复用的关键步骤: 线程…...

通达信自定义副图行业指标K线指标 HYZS_QD
行业指数:HY_INDEXC,NODRAW; DRAWKLINE(HY_INDEXH,HY_INDEXO,HY_INDEXL,HY_INDEXC); MA5:MA(HY_INDEXC,5),COLORWHITE; {MA10:MA(HY_INDEXC,10),COLORYELLOW,LINETHICK2}; DRAWTEXT_FIX(1,1,1,1,STRCAT(STRCAT(CON2STR(HY_INDEXADV,0),/),STRCAT(CON2STR(HY_INDEXDEC,0), ))),…...

MDK-Keil AC6 Compiler屏蔽特定警告
最近在使用STM32CubeMX生成MDK工程是,使用了 AC6 版本的编译器进行编译代码,然后发现了一些警告,但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告,这里记录一下。 1. Keil AC6屏蔽特定警告 遇到的警告如下&#x…...

计算机网络的故事——了解Web及网络基础
了解Web及网络基础 文章目录 了解Web及网络基础一、使用 HTTP 协议访问 Web二、HTTP 的诞生三、网络基础 TCP/IP四、与 HTTP 关系密切的协议 : IP、TCP 和 DNS 一、使用 HTTP 协议访问 Web 根据Web浏览器指定的URL,从对应的服务器中获取文件资源,从而显…...
[系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取详解
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…...

自动驾驶——估计预瞄轨迹YawRate
1.Introduction 在ADAS控制系统中,通常根据预瞄距离x去估计横向距离y,有如下关系: y a0 a1 x a2 * x^2 a3 * x^3 ,那么现在有个需求,希望根据上述x和y的关系,去估计规划预瞄轨迹yawRate 2.How to es…...

PMP证书考下来要多少费用?
PMP考试共有三项费用:分为考前费用、考后费用和续证费用。 第一项是考前费用: 1、培训费用,在英文报名时需要填写培训公司名称和35学时的培训证明。一般的培训公司收费不一,有些公司大概是三千元左右,而有些公司可能…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...