IO多路复用—多线程网络并发通信 select poll epoll

news2024/12/28 20:14:25

1.IO 多路转接 (复用)

​ IO 多路转接也称为 IO 多路复用,它是一种网络通信的手段(机制),通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的,一旦检测到有文件描述符就绪( 可以读数据或者可以写数据)程序的阻塞就会被解除,之后就可以基于这些(一个或多个)就绪的文件描述符进行通信了。

​ 通过这种方式在单线程 / 进程的场景下也可以在服务器端实现并发。常见的 IO 多路转接方式有:select、poll、epoll

下面先对多线程 / 多进程并发和 IO 多路转接的并发处理流程进行对比(服务器端):

  • 多线程 / 多进程并发
    • 主线程 / 父进程:调用 accept() 监测客户端连接请求
      • 如果没有新的客户端的连接请求,当前线程 / 进程会阻塞、
      • 如果有新的客户端连接请求解除阻塞,建立连接
    • 子线程/子进程:建立连接的客户端通信
      • 调用 read() / recv() 接收客户端发送的通信数据,如果没有通信数据,当前线程 / 进程会阻塞,数据到达之后阻塞自动解除
      • 调用 write() / send() 给客户端发送数据,如果写缓冲区已满,当前线程 / 进程会阻塞,否则将待发送数据写入写缓冲区中
  • IO 多路转接并发
    • 使用 IO 多路转接函数委托内核检测服务器端所有的文件描述符(通信和监听两类),这个检测过程会导致进程 / 线程的阻塞,如果检测到已就绪的文件描述符阻塞解除,并将这些已就绪的文件描述符传出
    • 根据类型对传出的所有已就绪文件描述符进行判断,并做出不同的处理
      • 监听的文件描述符:和客户端建立连接
        • 此时调用 accept() 是不会导致程序阻塞的,因为监听的文件描述符是已就绪的(有新请求)
      • 通信的文件描述符:调用通信函数和已建立连接的客户端通信
        • 调用 read() / recv() 不会阻塞程序,因为通信的文件描述符是就绪的,读缓冲区内已有数据
        • 调用 write() / send() 不会阻塞程序,因为通信的文件描述符是就绪的,写缓冲区不满,可以往里面写数据
  • 对这些文件描述符继续进行下一轮的检测(循环往复。。。)

在这里插入图片描述

  • 文件描述符对应的内存结构:
    • 一个文件文件描述符对应两块内存, 一块内存是读缓冲区, 一块内存是写缓冲区
    • 读数据: 通过文件描述符将内存中的数据读出, 这块内存称之为读缓冲区
    • 写数据: 通过文件描述符将数据写入到某块内存中, 这块内存称之为写缓冲区
  • 监听的文件描述符:
    • 客户端的连接请求会发送到服务器端监听的文件描述符的读缓冲区中
    • 读缓冲区中有数据,说明有新的客户端连接
    • 调用 accept () 函数,这个函数会检测监听文件描述符的读缓冲区
      • 检测不到数据,该函数阻塞
      • 如果检测到数据,解除阻塞,新的连接建立
  • 通信的文件描述符:
    • 客户端和服务器端都有通信的文件描述符
    • 发送数据:调用函数 write () /send (),数据进入到内核中
      • 数据并没有被发送出去,而是将数据写入到了通信的文件描述符对应的写缓冲区中
      • 内核检测到通信的文件描述符写缓冲区中有数据,内核会将数据发送到网络中
    • 接收数据:调用的函数 read () /recv (), 从内核读数据
      • 数据如何进入到内核程序猿不需要处理,数据进入到通信的文件描述符的读缓冲区中
      • 数据进入到内核,必须使用通信的文件描述符,将数据从读缓冲区中读出即可

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

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

相关文章

Nginx企业级使用1(运维笔记)

Nginx企业级使用1(运维笔记) 重装和升级 信号参数 Kill 选项参数 pid ##关闭nginx ##快速关闭 kill -INT pid ##优雅关闭 kill -QUIT pid##############实操############## [rootserver01 ~]# ps -ef|grep nginx root 1668 1 0 11:09 ?…

Flask入门和视图--01

1. 概述 虚拟环境搭建和使用 Flask框架的特点,Flask框架的组成 Flask框架中MVT模式开发 蓝图Blueprint的使用 路由Route的使用 请求Request和响应Response的使用 2. Flask简介 2.1 简介 Python后端的2个主流框架:Flask 轻量级框架Django 重型框架Flask是一…

开心档之C++ 信号处理

C 信号处理 目录 C 信号处理 signal() 函数 实例 raise() 函数 实例 信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 CtrlC 产生中断。 有些信号不能被程序捕获,但是下表…

安全狗入选2023年福建省数字经济核心产业领域创新企业名单

近日,福建省数字福建建设领导小组办公室公布了入选2023年全省数字经济核心产业领域创新企业名单。 作为国内云原生安全领导厂商,安全狗凭借综合表现与优势入选名单,荣膺“未来独角兽”称号。 据悉,此次对“未来独角兽”的评选条件…

调频电视发射机工作原理

我们平常所接触到的电视信号无线传输器材,较多采用调幅方式。原因是调幅方式在整个电视技术领域用得比较普遍,如我们生活中不可或缺的无线和有线电视广播,几乎全部都采用调幅方式。其实,若是用调频方式来传输电视信号,…

Qt Quick - 分隔器综述

Qt Quick - 分隔器综述 一、概述二、MenuSeparator 控件1. 用法: 三、ToolSeparator 控件1. 用法 一、概述 Qt Quick Controls 提供了多种分隔符,其实就是分割一下MenuBar和ToolBar里面的内容。 控件功能MenuSeparator将菜单中的一组项目与相邻项目分开…

Spring Boot + Spring Security基础入门教程

Spring Security简介 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。Spring Security 致力于为 Java 应用程序提供身份验证和授权的能力。 Spring Security 两大重要核心功能:用户认证(Authentication)和用户授权&am…

pandas 使用loc和iloc读取行数据或列数据

文章目录 一、 使用loc方法读取数据1.1 读取某行某列的值1.2 读取某个区域1.3 按照条件筛选 二. 使用iloc方法读取数据2.1 读取某行某列的值2.2 读取某个区域的数据 创建一个DataFrame data {name:[张三, 李四, 王五, 赵六],age:[20, 21, 22, 23], gender: [0, 1, 1, 1], stat…

网络工程项目报价单应该怎么写?记住这6个步骤准没错!

作为一名网络工程师,你在向潜在客户提供服务时,编写一个清晰明了的项目报价单是至关重要的。一个好的报价单不仅能够让客户更好地了解你的服务内容,还可以为你的项目提供更高的转化率。在本文中,我们将探讨如何编写一个有效的网络…

一图看懂 xlwt 模块:读写 Excel 文件的数据和格式信息, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 xlwt 模块:读写 Excel 文件的数据和格式信息, 资料整理笔记(大全) 摘要模块图类关系图模块全展开【xlwt】统计常量模块1 xlwt.compat2 x…

Linux系统之部署Linux管理面板1Panel

Linux系统之部署Linux管理面板1Panel 一、1Panel介绍1.1Panel简介2.1Panel特点 二、本地环境规划1.本此实践目的2.本地环境规划 三、检查本地环境1.检查操作系统版本2.检查系统内核版本 四、部署1Panel1.创建安装目录2.一键部署1Panel3.检查1Panel服务运行状态4.检查1Panel监听…

数据结构——二叉搜索树、平衡二叉树、红黑树

数据结构——二叉搜索树 一、二叉搜索树1.二叉搜索树的特性2.二叉搜索树的查找、插入和删除 二、平衡二叉树1.基本介绍2.AVL树的自平衡1)自平衡的调整操作2)自平衡调整的局面 3.AVL树的代码实现4.AVL树的特点 三、红黑树1.基本介绍2.红黑树的自平衡1&…

秒杀系统如何设计

思路:对于秒杀系统,两个架构优化思路: 1)尽量将请求拦截在系统上游 2)读多写少的常用多使用缓存 1、限制用户在x秒之内只能提交一次请求 2、同一个uid,或同一类查询(例如车次)。限制…

配电网光伏/储能双层优化配置模型(选址定容)

目录 1 主要内容 上层目标函数考虑光伏和储能的投资成本。 程序采用模块化编程,并有每个模块功能介绍,方便学习。 2 部分代码 3 程序结果 4 程序结果 1 主要内容 该程序主要方法复现《含高比例可再生能源配电网灵活资源双层优化配置》运行-规划联合…

【Maven 入门】第二章、Maven核心程序解压与配置

一、Maven 官网地址 首页: Maven – Welcome to Apache Maven(opens new window) 下载页面: Maven – Download Apache Maven(opens new window) 本文以maven-3.3.8为例 具体下载地址:https://dlcdn.apache.org/maven/maven-3/3.8.8/bina…

LeetCode刷题集(二)(LeetCode 2037使每位学生都有座位的最少移动次数)

学习目标: 掌握LeetCode2037使每位学生都有座位的最少移动次数 题目内容: 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示。给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数…

数据结构-排序3(终章)

前言: 上一章,对交换排序的冒牌和快排做了复盘,这一章对,归并排序以及非比较排序中的计数排序做一个复盘。 目录 2.4归并排序 2.4.1规定递归 2.4.2归并非递归 2.5非比较排序 2.5.1计数排序 2.6排序的稳定性分析 2.6.1冒…

【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解

前言 注意力机制一直是一个比较热的话题,其实在很早之前就提出了,我们在学习图像分类时在SENet就见到过(直通车:经典神经网络论文超详细解读(七)——SENet(注意力机制)学习笔记&…

金陵科技学院五年一贯制专转本管理学原理考试大纲

金陵科技学院五年一贯制专转本管理学原理考试大纲 一、考核对象 本课程的考核对象为五年一贯制高职专转本“旅游管理”专业入学考试考生。 二、考核方式 本课程考核采用闭卷笔试的方式。 三、命题依据及原则 1、命题依据 参考书目:《管理学——原理与方法》 …

Docker Swarm集群企业案例实战

1. Docker Swarm集群企业案例实战 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创…