C++ :websocket 通讯下的五种 I/O 模型

news2024/11/20 18:47:52

目录

I/O 多路复用(一种同步 I/O 模型)

非阻塞与阻塞

select、poll、epoll

起因

改善

select 与 poll 的差别

I/O 模型

阻塞 I/O 模型

非阻塞 I/O 模型

I/O 多路复用模型

信号驱动 I/O 模型(SIGIO)

异步 I/O 模型(AIO)


I/O 多路复用(一种同步 I/O 模型)

多路(文件句柄)监听+阻塞/非阻塞I/O

一个线程完成多个网络连接(一对多);

一旦某个文件句柄就绪,就能够通知应用程序进行响应读写操作;

没有文件句柄则会阻塞应用程序,交出 CPU;

select、poll、epoll(Linux 最先进的方式)是目前主流的多路复用I/O技术。

非阻塞与阻塞

  • 非阻塞:通过不断的数据检测直到出现数据响应(事件请求)。

  • 阻塞:等待数据响应(事件请求),期间不进行其他处理,直到响应发现;

select、poll、epoll

起因

对于非阻塞,不断检测流来判定事件处理,是非法的,当所有的流都没有 I/O 事件时,非阻塞将会不断运行并浪费 CPU 时间片,从而产生资源浪费,由此通过引进中间层(代理:select、poll)来对流检测进行事件处理(仅仅处理事件检测),如果没有则进行阻塞,由此避免了线程的不断轮询。

改善

对于 select,通过中间层的处理,我们完善了轮询的阻塞,但是并无法知道当前 select 进行的处理事件数量有多少,当假设有全部流事件存在,select 有 O(n) 的无差别轮询复杂度,处理的流越多,无差别轮询时间越长。

不同于忙轮询和无差别轮询,epoll 会把哪个流发生了怎样的 I/O 事件通知我们,属于事件驱动,通过明确指定事件,便可以定位流,从而不再进行轮询操作,而是明确指定对应的流事件处理。

I/O 模型

阻塞 I/O 模型

  • 默认情况下,所有文件操作都是阻塞的;

  • 第一阶段:应用层数据传到 kernel;第二阶段:kernel 复制到 user space

  • 两个阶段一起阻塞,阻塞状态下,程序不会浪费 CPU;

  • recvfrom 只有等到 kernel 中的数据复制到用户进程缓冲区之后才返回并解除阻塞。

非阻塞 I/O 模型

  • 将套接口设置为非阻塞模式,就是在告诉内核,当请求的 I/O 操作后立刻返回,不可用则返回错误。

  • 当数据没有准备好时,内核立即返回 EWOULDBLOCK 错误,第四次调用系统调用时,数据已经存在,这时将数据复制到进程缓冲区中。其中有:不断轮询(polling),类似频繁等待

  • 第一阶段非阻塞,第二阶段必须阻塞

I/O 多路复用模型

  • 由于以上阻塞与非阻塞都会导致接受 fd 的时候无法跳出等待或者阻塞环节,因此在避免多线程启动导致大量浪费资源的条件下,出现了一个进程处理多个 fd 请求的 io 多路复用技术;

  • 此模型用到 select 和 poll 函数,这两个函数也会使进程阻塞;

  • select 先阻塞,有活动套接字才返回,但和阻塞 I/O 不同的是,两个函数可以同时阻塞多个 I/O 操作,而且可以同时对多个读、写操作的 I/O 函数进行检测,直到有数据可读或可写;

  • select被调用后,进程会被阻塞,内核监视所有 select 负责的 socket,当至少有一个 socket的数据准备好(I/O 可用)时,返回可读,由 recvfrom 处理数据。

信号驱动 I/O 模型(SIGIO)

  • 首先我们允许套接口进行信号驱动 I/O ,并安装一个信号处理函数,进程继续运行并不阻塞

  • 数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据;

  • 数据报准备好读取时,内核就为该进程产生一个 SIGIO 信号

  • 随后既可以在信号处理函数中调用 recvfrom 读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它来读取数据报;

  • 优势在于等待数据报到达第一阶段期间,进程可以继续执行,不被阻塞。免去了 select 的阻塞与轮询,当有活跃套接字时,由注册的 handler 处理;

 

异步 I/O 模型(AIO)

  • 进程发起 read 操作之后,立刻就可以开始去做其它的事。而另一方面,从 kernel 的角度,当收到一个 asynchronous read 之后,会立刻返回,不会对用户进程产生任何 block

  • 然后,kernel 会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel 会给用户进程发送一个 signal,通知 read 操作完成

工作机制:告诉内核启动某个操作,并让内核在整个操作 (包括第二阶段,即将数据从内核拷贝到用户层进程缓冲区中) 完成后通知我们

  • 与 SIGIO 区别在于:信号驱动 I/O 模型是由内核通知我们何时可以启动一个 I/O 操作,而异步 I/O 模型是由内核通知我们 I/O 操作何时完成
  1. 优点:整个过程都不阻塞,一步到位;非常使用高并发应用;
  2. 缺点:模型复杂,实现、开发难度较大。

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

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

相关文章

VirtualBox下Ubuntu系统磁盘扩容

1. 正确扩容虚拟硬盘:修改虚拟硬盘和快照的虚拟硬盘大小 打开VirtualBox所在目录,打开cmd,输入命令VBoxManage list hdds,这样能够列出所有的虚拟磁盘。找到你需要扩容的磁盘输入命令VBoxManage" modifyhd "D:\Pat\to\…

米尔STM32MP135核心板 又一款入门级嵌入式开发平台

自2007年意法半导体(ST)推出STM32首款Cortex-M内核 MCU,十几年来,ST在MCU领域的发展是飞速向前的。而2019年ST发布了全新的STM32MPU系列产品线,STM32MP1作为新一代 MPU 的典范,有着极富开创意义的异构系统架构兼容并蓄…

WMS智能仓储

子产品介绍篇--智能仓储 智能仓储 我们通常也称 WMS 系统。是一个实时的计算机软件系统,它能够按照运作的业务规则和运算法则,对信息、资源、行为、存货和分销运作进行更完美地管理,提高效率。 一. 仓储管理系统(wms)…

javaweb过滤器与监听器

一、过滤器程序的基本结构、web.xml文件的配置过程和过滤器的执行过程 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&quo…

MobPush创建推送

功能说明 MobPush提供遵循REST规范的HTTP接口&#xff0c;适用各开发语言环境调用。 IP绑定 工作台可以绑定服务器IP地址&#xff0c;未绑定之前所有IP均可进行REST API的调用&#xff0c;绑定后进仅绑定的IP才有调用权限。 调用地址 POSThttp://api.push.mob.com/v3/push/c…

03.vue3的计算属性

文章目录1.计算属性1.get()和set()2.computed的简写3.computed和methods对比2.相关demo1.全选和反选2.todos列表1.计算属性 模板内的表达式非常便利&#xff0c;但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。所以&#xff0c;对于任何…

CRM系统是什么?它有什么作用?

CRM系统是什么&#xff1f; CRM是Customer Relationship Management&#xff08;客户关系管理&#xff09;的缩写&#xff0c;是一种通过对客户进行跟踪、分析和管理的方法&#xff0c;以增加企业与客户之间的互动和联系&#xff0c;提高企业与客户之间的互信&#xff0c;从而…

GoNote第一章 环境搭建

GoNote第一章 环境搭建 golang介绍 1. 语言介绍 Go 是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变得容易。 Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发&#xff0c;后来还加入了Ian Lance Taylor, Russ Cox等人&#xff0c…

oracle远程克隆pdb

使用远程克隆的先决条件是: oracle版本是12.2以上,开启归档模式以及本地undo. 这里是想从172.16.12.250将PRODPDB1克隆到172.16.12.251下&#xff0c;命名为PRODPDB1COPY。 1 确保源端数据库开启归档模式 备注&#xff1a;进cdb里开启归档。 2 在源数据库中&#xff0c;确保…

2023年环境工程与生物技术国际会议(CoEEB 2023)

会议简介 Brief Introduction 2023年环境工程与生物技术国际会议(CoEEB 2023) 会议时间&#xff1a;2023年5月19日-21日 召开地点&#xff1a;瑞典马尔默 大会官网&#xff1a;www.coeeb.org 2023年环境工程与生物技术国际会议(CoEEB 2023)将围绕“环境工程与生物技术”的最新研…

【教程】Unity 与 Simence PLC 联动通讯

开发平台&#xff1a;Unity 2021 依赖DLL&#xff1a;S7.NET 编程语言&#xff1a;CSharp 6.0 以上   一、前言 Unity 涉及应用行业广泛。在工业方向有着一定方向的涉足与深入。除构建数据看板等内容&#xff0c;也会有模拟物理设备进行虚拟孪生的需求需要解决。而 SIMATIC&a…

测评:腾讯云轻量4核8G12M服务器CPU内存带宽流量

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

02-参数传递+统一响应结果

1. 参数传递&#xff1a; -- 简单参数 如果方法形参数名称与请求方法名称不匹配&#xff0c;采用RequestParam注解 -- 实体参数 -- 数组集合参数 -- 日期参数 -- JSON参数 -- 路径参数 2. 统一响应结果 -- 1. 创建Result类&#xff08;放到pojo包中&#xff09; package dem…

centos8 源码安装 apache(内附图片超详细)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

Redis 如何实现库存扣减操作和防止被超卖?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

《Rank-LIME: Local Model-Agnostic Feature Attribution for Learning to Rank》论文精读

文章目录一、论文信息摘要二、要解决的问题现有工作存在的问题论文给出的方法&#xff08;Rank-LIME&#xff09;介绍贡献三、前置知识LIMEFeature AttributionModel-AgnosticLocalLearning to Rank&#xff08;LTR&#xff09;单文档方法&#xff08;PointWise Approach&#…

工业相机标定(张正友标定法)

目录 相机标定的概念 a. 相机标定的定义 b. 相机标定的目的 相机标定的过程 a. 标定板选择 b. 标定板摆放及拍摄 c. 标定板角点提取 张正友标定法 a. 反解相机矩阵 b.反解畸变系数 使用Python进行相机标定 a. 安装OpenCV b. 准备标定板图片 c. 利用OpenCV进行角点…

HashMap、HashTable、ConcurrentHashMap 之间的区别

哈喽&#xff0c;大家好~我是保护小周ღ&#xff0c;本期为大家带来的是 HashMap、HashTable、ConcurrentHashMap 之间的区别&#xff0c;从数据结构到多线程安全~确定不来看看嘛~更多精彩敬请期待&#xff1a;保护小周ღ *★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* ‘一、…

内存、CPU与指针的知识

在计算机中&#xff0c;内存、CPU和指针是非常重要的概念。在本篇博客中&#xff0c;我们将探讨内存、CPU和指针的知识。 内存的概念 内存是计算机中的一种存储设备&#xff0c;用于存储程序和数据。内存可以被CPU读取和写入&#xff0c;因此是计算机中非常重要的组成部分。在…

006:Mapbox GL添加zoom和旋转控件

第006个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加zoom和旋转rotation控件 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共60行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:h…