【I/O多路复用】

news2025/2/26 15:01:12

基于I/O多路复用的并发编程

  • I/O
    • 实现I/O多路复用
      • select
        • 优缺点
      • poll
      • epoll
        • 优点

I/O

I/O复用是基于一个单进程或单线程的一个执行流当中监控多个输入输出流的技术(网络套接字或者文件描述符进行监控)。单进程或单线程,允许多个用户对单进程发起连接进行I/O事件的处理。不在需要每一个连接创建一个独立的进程或线程单独服务,减少了操作系统的资源消耗和提高了运行效率。一旦某一个文件描述符的读或写事件就绪,就执行相应的I/O事件。

实现I/O多路复用

实现I/O多路有三种方法,select,poll,和epoll。实现的原理都是将多个描述符进行监听,当某一个描述符的读或写事件就绪时,OS就会进行回调,用户层通过对所有的文件描述符进行循环遍历,执行对应的I/O事件。

select

select使用一个fd_set的数据类型来表示多个描述符。每个比特位表示描述符的数字,比特位的0和1表示事件的是否就绪,相当于一个位图。select可以关心三种事件进行关心,读,写和异常事件(超时)的关心。对于select这三种事件都有各自的fe_set数据类型所关心的事件变量。当有事件就绪时,便返回到用户层,用户层通过遍历保存了描述符的数组进行遍历,执行对应的I/O事件。当有新的网络连接到来时,连接先不会进行I/O的处理,而是先将新连接的套接字给select进行事件监控,不在需要等待对方发送数据到自己时这段时间回阻塞,一旦事件就绪了,系统调用就会通知上层。一旦accept成功,不能直接进行I/O处理,因为数据可能没有就绪,如果直接调用recv或read可能会导致阻塞或者其他连接无法通信。服务器调用select函数后,会进入无限循环,监测两种事件,一种是对端发起新的连接,一种是已经连接好的描述符事件已经就绪。每次有新连接的描述符,就添加到用户层管理的数组和内核态fd_set类型的关心读写或异常的变量中。每当有一个连接关闭,就把相应的描述符关闭然后置为无效。

int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

nfds表示描述符中最大的描述符值加1。
timeout是设置select对某个描述符得等待时长,如果位nullptr,则阻塞等待事件,直到有事件就绪。如果timeout设置{0,0}表示非阻塞的轮询等待。{num,0}表示在0到num时间内没有事件到来则进行返回。返回值是大于一个位0的数,则表示有多少个描述符读写或异常数据就绪了,0为表示超时发送,事件的状态没有方式改变。-1表示出错。

//处理描述机会的宏
void FD_ZERO(fd_set *set);/*将事件的描述符集全部清空*/
void FD_SET(int fd, fd_set *set);/*将文件描述符设置到集合中,表示对该文件描述符的事件关心*/
void FD_CLR(int fd, fd_set *set);/*将对应的文件描述符在集合中清理*/
int  FD_ISSET(int fd, fd_set *set);/*判断该文件描述符是否在集合中*/

在这里插入图片描述

优缺点

优点:可以对多个描述符进行事件的监控,提高I/O效率。
缺点:因为是使用一个fd_set的数据类型对于描述符的,该类型的能关心的事件只有1024个描述符,有上限的问题。每次有新的事件到来,都要用户层对事件进行重新设置,就要重用户态转到内核态。每次事件就绪,用户层就要到内核态,内核态需要遍历描述符集。造成效率低下。

poll

poll也可以对多个描述符进行监控等待事件的就绪。在网络连接中,当有listen套接字创建成功的时候,可以对pollfd类型的数据进行填充。poll的相较于select,不在需要用户层在对事件的重新设置,事件的关心由一个结构体pollfd关心,

 struct pollfd
 {
   int fd;			/* File descriptor to poll.  */
   short int events;		/* Types of events poller cares about.  */
   short int revents;		/* Types of events that actually occurred.  */
 };
int poll(struct pollfd *fds, int nfds, int timeout);

pollfd由一个整形文件描述符,和两个short int类型的事件组成,events和revents,表示关心的事件和返回的事件。*fds表示的是一个数组的首元素,nfds表示个数,timeout为等待事件。因为poll的事件关心分离了,不像select需要每次都需要重置对事件的关心。

epoll

epoll模型则可以管理在内存大小允许数量的文件描述符,epoll模型有两个重要的数据构,一个是红黑树,一个是队列,红黑树对文件描述符进行管理监听,当某个文件描述符的事件就绪时,就将文件描述符添加到队列,队列的都是事件就绪的文件描述符,操作系统对就绪队列的事件进行执行。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);//添加文件描述符到epoll模型
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);//监听epoll模型的文件描述符事件是否就绪
优点

没有最大并发限制:epoll所支持的FD(文件描述符)上限是最大可以打开文件的数目。这使得epoll能够轻松处理成千上万的并发连接,而不会像select或poll那样受到文件描述符数量的限制。

高效处理大量并发连接:epoll通过红黑树管理所有的socket描述符,并且只返回那些活跃的、即准备就绪进行I/O操作的事件。这避免了遍历整个文件描述符集合的需求,从而显著提高了效率。

减少不必要的内存拷贝:epoll通过内核与用户空间mmap同一块内存来实现消息的传递,避免了传统模型中用户态和内核态之间频繁的内存拷贝。这种机制减少了数据传输的开销,提高了整体的性能。

事件驱动机制:epoll采用事件驱动的方式来处理I/O事件,这意味着它只会在有事件发生时才通知应用程序。这与传统的轮询机制相比,极大地减少了无效的检查和等待时间,提高了系统的响应速度和吞吐量。

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

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

相关文章

virtualbox从u盘启动

1.添加到vboxusers用户组 sudo usermod -G vboxusers -a whoami 2.为u盘设备添加访问权限,注意替换对应的设备文件,我这里是/dev/sdf sudo chmod orw /dev/sdf 3.为u盘创建一个虚拟的硬盘镜像 sudo VBoxManage internalcommands createrawvmdk -fi…

Unity Protobuf3 GC 问题(反序列化)

背景:Unity接入的是 Google Protobuf 3.21.12 版本,排查下来反序列化过程中的一些GC点,处理了几个严重的,网上也有一些分析,这里就不一一展开,默认读者已经略知一二了。 如果下面有任何问题请评论区留言提…

Java开发笔记-mysql语句查询指定索引

今天同事遇到一个奇怪的sql查询的问题:一条sql有时候执行素的很快(0.xxs),有时候执行很慢(20s),不知道是什么问题. 猜测:1、是不是第一次执行,被mysql缓存了?后面几次直接拿缓存的结果。 2、是不是网络的原…

入门redis

一、安装redis-py库 打开pycharm 在终端中输入 pip install redis 二、连接到redis服务器 import redis r redis.Redis(hostlocalhost, port6379, db0, decode_responsesTrue)host是 Redis 服务器的主机名或 IP 地址,port是端口号,db是要使用的数据库编…

指纹浏览器VS虚拟机,在跨境电商中用哪个更好?

在当今的数字世界中,隐私和安全变得越来越重要。尤其是跨境电商卖家来说,经常需要网络上执行环境独立的操作,例如账号运营、在线购物、网上银行、社交媒体管理等。 为了保护账号隐私与做好账号防关联隔离,人们经常寻求指纹浏览器…

Windows-Server-2016/2019绕过WindowsDefender

当获得了一个webshell的时候,下一步要反弹个shell回来 在尝试了https://github.com/trustedsec/unicorn独角兽失败之后,找到了一篇使用golang将shellcode注入到内存的文章 Bypassing Antivirus with Golang - Gopher it! | JUMPSEC LABS GitHub - brimst…

9.Java基础概念-面向对象

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words! 类和对象 类&#xff…

mmyolo训练模型报错:ValueError: Key img_path is not in available keys解决办法

使用mmyolo训练模型 的时候报错:ValueError: Key img_path is not in available keys. Traceback (most recent call last): File “tools/train.py”, line 123, in main() File “tools/train.py”, line 119, in main runner.train() File “/root/anaconda3/en…

基于Ubuntu22.04 安装SSH服务

安全外壳协议(Secure Shell,简称 SSH)是一种在不安全网络上用于安全远程登录和其他安全网络服务的协议。 SSH 由 IETF 的网络小组(Network Working Group)所制定,SSH 为建立在应用层基础上的安全协议。SSH…

Linux下进程间的通信--管道

关于进程间的通信 Linux进程间通信(Inter-Process Communication,IPC)是指在多个进程之间传输数据或信号的一些方法。由于Linux中的进程有各自独立的地址空间,因此它们不能直接访问对方的内存。为了实现进程间的通信,…

python探索分形和混沌

简单产生复杂,混沌孕育秩序 0. 引言 a. 分形 fractal 【也叫碎形】 分形是一种具有自相似性和复杂结构的几何图形。在分形结构中,无论放大多少次,局部的结构特征都与整体结构相似。这种特性在自然界中广泛存在,比如树木枝干、山…

目前AI 辅助代码生成是否将成为未来编程的主流?

最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 我的答案是 肯定的 ! AI辅助代码生成正在迅速崛起,将会成为未来编程的主流趋势。 当然这里的问题是"…

代码随想录算法训练营第二十三天(回溯 二)

力扣题部分: 39. 组合总和 题目链接:. - 力扣(LeetCode) 题面: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以…

Windows系统,查看本机端口被哪个进程占用

1 打开CMD 快捷键 WinR,输入cmd,确定,打开命令行窗口。 2 查看端口的进程PID netstat -aon|findstr "80" 3 根据进程PID查看应用名称 tasklist|findstr "1468" 4 如果想关掉该进程,在任务管理器结束进程既…

「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11(C++)

目录 概述 1.二路合并 思路 复杂度 Code 2.逆向合并 思路 复杂度 Code 3.快慢去重 思路 复杂度 Code 4.对撞指针 思路 复杂度 Code 总结 概述 数组的线性枚举是我们学习编程时遇到的第一种枚举手段。但是它看起来有点愚蠢:只有一个索引i承担全部…

美食攻略系统---附源码99630

摘要 本论文旨在探讨如何利用SpringBoot技术开发一个美食攻略系统。系统将按照软件开发流程,采用B/S架构和面向对象编程思想进行项目开发。在引言部分,将介绍美食攻略系统的背景和开发目的,后续章节将依据软件开发流程,对系统进行…

电路笔记(PCB):数字信号的带宽与上升沿时间经验公式 BW = \frac{0.35}{T_r}

数字信号的带宽由上升沿决定 1. 传输线路的带宽如果小于信号的带宽就会产生失真 带宽限制和失真:当信号通过带宽受限的传输线路时,如果线路的带宽小于信号的带宽,信号的高频成分将被削弱或完全滤除。这种削弱会导致信号失真,特别…

Luma 1.5正式发布,文生视频加强真实感,时长最长5秒

距离上次版本发布仅过去了两个月,Luma AI再次发布了升级版本Dream Machine 1.5。新版本具有更好的文本到视频转换、更智能地提示理解、自定义文本渲染和改进图像到视频的功能。 得益于Luma AI对所有公众开放,任何人都可以免费试用,平台用户在…

CANoe.DiVa的应用——生成TP层测试用例过程流程详解(二)

🙋‍♂️【Vector CANdelastudio配置CDD】文章合集💁‍♂️点击跳转 ——————————————————————————————————–—— 从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 一.概述2.经典CAN T…

基于x86 平台opencv的图像采集和seetaface6的人脸朝向姿态估计功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸朝向姿态估计功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的人脸朝向姿态…